O autor selecionou a Electronic Frontier Foundation para receber uma doação como parte do programa Write for DOnations.
Um dos maiores desafios no desenvolvimento de aplicativos é o passo final da distribuição do produto acabado para seus usuários ou clientes. Muitas metodologias existentes para implantação de aplicativos não são fáceis de usar e carecem de segurança, ou não fornecem métodos para atualizar automaticamente um aplicativo assim que estiver instalado.
O Snap é um formato moderno de empacotamento de aplicativos, com recursos de área restrita e segurança eficazes, incluindo o isolamento do sistema de arquivos, atualizações automáticas e o gerenciamento de dependências integrado. Os aplicativos do Snap, conhecidos como Snaps, podem ser baixados e instalados usando um programa de linha de comando, de maneira semelhante às ferramentas apt
ou yum
. O Ubuntu vem com Snap pré-instalado, o que significa que há uma amplo público-alvo para os aplicativos Snap.
Neste tutorial, você criará um aplicativo Snap e irá publicá-lo na Snap Store.
Para completar este tutorial, você precisará de:
Um servidor Ubuntu 18.04 configurado de acordo com o tutorial de Configuração inicial de servidor com o Ubuntu 18.04, incluindo um usuário sudo não raiz.
Um aplicativo que você queira empacotar e lançar como um Snap. Esse pode ser um aplicativo complexo que você criou, um projeto de código aberto comum, ou um simples programa “Hello, world!” (“Olá, mundo!”) . Caso ainda não tenha um aplicativo, o Passo 1 deste tutorial irá abranger como criar um programa Hello World em Go.
Uma conta no Snapcraft Developer Snapcraft [Painel de desenvolvimento do Snapcraft].
Assim que tiver tudo pronto, faça login no seu servidor como usuário não raiz para começar.
Primeiro, você irá preparar seu aplicativo para o empacotamento como um aplicativo Snap, assegurando que tudo o que é necessário esteja armazenado em um único diretório.
Comece criando um diretório para seu Snap, acessando-o:
- mkdir ~/your-snap
- cd ~/your-snap
Em seguida, caso já tenha um aplicativo, coloque uma cópia completa do código fonte do seu aplicativo no diretório que acabou de criar. O processo aqui será significativamente diferente, dependendo do aplicativo exato que estiver empacotando. No entanto, caso o código fonte estiver armazenado em um repositório do Git, você pode usar o comando git init
para criar um repositório no diretório e puxar todo o código relevante.
Caso ainda não tenha um aplicativo que deseja empacotar, você pode, em vez disso, criar um programa “Hello World” para usar. Caso queira mais contexto sobre como escrever esse programa com o Go, confira o tutorial Como escrever seu primeiro programa em Go.
Você pode fazer isso, primeiramente criando um arquivo Go, abrindo-o com o seu editor de texto preferido:
- nano helloworld.go
Depois, adicione o código a seguir ao arquivo:
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}
Então, salve e saia do arquivo.
Caso não tenha o Go instalado, instale-o usando o seguinte comando:
- sudo apt install golang-go
Assim que o Go estiver instalado, execute seu novo programa para verificar se ele está funcionando:
- go run helloworld.go
Você verá o seguinte resultado:
OutputHello, world!
Você preparou seu aplicativo para empacotar como um Snap. Em seguida, você instalará o software necessário para iniciar o processo de empacotamento.
Neste passo, você irá baixar e instalar o Snapcraft, que é o nome da ferramenta oficial de empacotamento do aplicativo Snap. O Snapcraft está disponível na Snap Store, que, por padrão, vem integrada ao Ubuntu. Isso significa que você pode instalar o Snapcraft a partir da linha de comando, usando o comando snap
.
O comando snap
é equivalente ao comando apt
, mas você pode usá-lo para instalar softwares da Snap Store, em vez de pacotes dos repositórios da Apt.
Para instalar o Snapcraft, execute o seguinte comando:
- sudo snap install snapcraft --classic
Use o argumento de comando --classic
para que o Snapcraft faça a instalação sem os recursos rigorosos de área restrita que os Snaps normalmente usam. O Snapcraft exige esse argumento, já que precisa de acesso mais privilegiado ao seu sistema para empacotar de maneira confiável os aplicativos.
Assim que instalar o Snapcraft, verá o seguinte:
Outputsnapcraft 3.9.8 from Canonical✓ installed
Por fim, você pode verificar novamente a instalação do Snapcraft, executando:
- snapcraft --version
Isso exibirá algo similar a:
Outputsnapcraft, version 3.9.8
Agora que você instalou o Snapcraft, pode começar a definir a configuração e os metadados para o seu aplicativo Snap.
Neste passo, você começará a definir a configuração, a estrutura e os metadados para seu aplicativo Snap.
Comece certificando-se de que ainda está trabalhando no diretório do seu aplicativo Snap:
- cd ~/your-snap
Em seguida, crie e edite o arquivo snapcraft.yaml
, usando seu editor de texto preferido:
- nano snapcraft.yaml
Você usará o arquivo snapcraft.yaml
para armazenar toda a configuração do seu aplicativo Snap, incluindo o nome, descrição e versão, além de configurações relacionadas ao gerenciamento de dependências e ao uso de área restrita.
Comece definindo o nome, resumo, descrição e número de versão do seu aplicativo:
name: your-snap
summary: A summary of your application in 78 characters or less.
description: |
A detailed description of your application.
The description can have multiple lines.
version: '1.0'
O nome do seu Snap precisa ser único caso deseje publicá-lo na Snap Store — procure outros aplicativos com o mesmo nome para garantir que ele já não esteja sendo usado.
Em seguida, defina o(s) comando(s) que deseja associar ao seu aplicativo. Isso permitirá que seu Snap seja usado diretamente a partir da linha de comando do Bash, como um comando normal.
Adicione o seguinte ao seu arquivo snapcraft.yaml
:
. . .
apps:
your-snap-command:
command: your-snap
your-snap-command
é o nome do comando que deseja definir. Por exemplo, pode ser que queira usar o comando helloworld
para executar seu programa Hello World.
Você usará o command: your-snap
para dizer ao Snapcraft o que fazer quando o comando do aplicativo for executado. No caso do programa Hello World, você usaria o valor helloworld
para fazer referência ao arquivo helloworld.go
, o que permitirá que o Snapcraft execute seu programa com sucesso.
Isso resulta na seguinte configuração de exemplo:
apps:
helloworld:
command: helloworld
Caso o nome do comando corresponda exatamente ao nome do Snap, você será capaz de executá-lo diretamente da linha de comando. Caso o comando não corresponda ao nome do Snap, o comando será prefixado automaticamente com o nome do Snap. Por exemplo, helloworld.command1
.
Por fim, você pode definir as partes que compõem seu aplicativo Snap. Os aplicativos Snap consistem em várias partes, as quais são todos os componentes que compõem seu aplicativo. Em muitos casos, há apenas uma parte, que é o aplicativo propriamente dito.
Cada parte tem um plug-in associado. Por exemplo, para os componentes do seu aplicativo escritos em Ruby, o plug-in ruby
é usado e, para os componentes escritos em Go, o plug-in go
é usado.
Use o comando list-plugins
do Snapcraft para identificar o(s) plug-in(s) correto(s) para seu aplicativo:
- snapcraft list-plugins
Isso irá gerar uma lista parecida com a seguinte:
Outputant catkin-tools conda dump gradle make nil python rust
autotools cmake crystal go kbuild maven nodejs qmake scons
catkin colcon dotnet godeps kernel meson plainbox-provider ruby waf
Os plug-ins mais comuns são os para linguagens de programação comuns, como Go, Rust, Ruby, ou Python.
Assim que tiver identificado os plug-ins corretos para o seu aplicativo, você pode começar a adicionar a configuração das parts
(partes) ao seu arquivo snapcraft.yaml
:
. . .
parts:
your-snap:
plugin: plugin-name
source: .
Utilize o parâmetro de configuração source
para especificar o caminho relativo para o código fonte para o seu aplicativo. Normalmente, esse será o mesmo diretório do arquivo snapcraft.yaml
em si. Assim, o valor source
é um único ponto (.
).
Nota: caso o componente de seu aplicativo tenha quaisquer dependências que sejam necessárias para que o compile ou execute, você pode especificá-las usando os atributos build-packages
e stage-packages
. Os nomes de dependências especificados serão, então, obtidos automaticamente com o gerenciador de pacotes padrão para seu sistema.
Por exemplo:
parts:
your-snap:
plugin: plugin-name
source: .
build-packages:
- gcc
- make
stage-packages:
- libcurl4
Alguns plug-ins do Snapcraft têm suas próprias opções específicas que podem ser necessárias para seu aplicativo. Assim, vale a pena rever as páginas relevantes do manual do seu plug-in:
- snapcraft help plugin-name
No caso dos aplicativos Go, você também especificaria o caminho go-importpath
. Para a configuração Hello World, isso resulta na seguinte configuração de exemplo:
parts:
helloworld:
plugin: go
source: .
go-importpath: helloworld
Deixe seu arquivo snapcraft.yaml
aberto para adicionar mais configurações no próximo passo.
Você definiu a configuração base para seu aplicativo Snap. Em seguida, você irá configurar os aspectos de segurança e de área restrita do seu aplicativo.
Os aplicativos Snap foram criados para executarem em um ambiente de área restrita, de modo que, neste passo, você irá configurar a área restrita para o seu Snap. Primeiro, precisará habilitar a área restrita para o seu aplicativo, conhecida dentro do Snapcraft como confinement
(confinamento).
Adicione o seguinte ao seu arquivo snapcraft.yaml
:
. . .
confinement: strict
Isso habilitará a área restrita para o seu aplicativo, impedindo-o de acessar a internet, outros Snaps em execução, ou o sistema do host propriamente dito. No entanto, na maioria dos casos, os aplicativos precisam ser capazes de se comunicar fora da área restrita, como quando precisam acessar a internet ou ler/gravar no sistema de arquivos.
Essas permissões, conhecidas dentro do Snapcraft como interfaces, podem ser concedidas ao seu aplicativo Snap usando os Plugs. Usando o Plugs, você pode ter o controle fino sobre a área restrita do seu aplicativo, para lhe dar o acesso que precisa e nada mais (princípio do menor privilégio).
As interfaces exatas que são necessárias variam, dependendo do seu aplicativo. Algumas das interfaces mais comuns são:
audio-playback
- permite saída de som/reprodução de sons.audio-record
- permite a entrada/gravação de áudio.camera
- permite o acesso a webcams conectadas.home
- permite o acesso a arquivos não ocultos dentro do seu diretório home.network
- permite o acesso à rede/internet.network-bind
- permite a vinculação às portas para operar como um serviço de rede.system-files
- permite o acesso ao sistema de arquivos completo da máquina de hospedagem.A lista completa de interfaces disponíveis pode ser encontrada dentro da documentação do Snapcraft, em Interfaces compatíveis.
Assim que tiver identificado todas as interfaces necessárias para o seu aplicativo, você pode começar a atribuí-las aos plugs
dentro do seu arquivo snapcraft.yaml
.
A configuração do exemplo a seguir permitirá que o aplicativo acesse a rede e a área inicial de usuários:
. . .
plugs:
your-snap-home:
interface: home
your-snap-network:
interface: network
Salve e saia do seu arquivo.
O nome do Plug deve ser um nome descritivo para ajudar os usuários a identificar o propósito do Plug.
Você habilitou a área restrita para o seu Snap e configurou alguns Plugs para conceder acesso limitado aos recursos do sistema. Em seguida, terminará a compilação do seu app Snap.
Agora que você escreveu toda a configuração necessária para o seu Snap, prossiga com a compilação e teste do pacote Snap localmente.
Caso esteja acompanhando este tutorial com a utilização de um programa Hello World como seu aplicativo, seu arquivo completo snapcraft.yaml
será agora semelhante ao seguinte:
name: helloworld
summary: A simple Hello World program.
description: |
A simple Hello World program written in Go.
Packaged as a Snap application using Snapcraft.
version: '1.0'
confinement: strict
apps:
helloworld:
command: helloworld
parts:
helloworld:
plugin: go
source: .
go-importpath: helloworld
plugs:
helloworld-home:
interface: home
helloworld-network:
interface: network
Para compilar seu aplicativo Snap, execute o comando snapcraft
dentro do diretório para seu Snap:
- snapcraft
Então, o Snapcraft irá iniciar automaticamente uma máquina virtual (VM) e começará a compilar seu Snap. Assim que terminar, o Snapcraft fechará e você verá algo semelhante ao seguinte:
OutputSnapped your-snap_1.0_amd64.snap
Agora, você pode instalar o seu Snap localmente para verificar se ele está funcionando:
- sudo snap install your-snap.snap --dangerous
O argumento de comando --dangerous
é necessário, já que você está instalando um Snap local que não foi assinado.
Outputyour-snap 1.0 installed
Assim que o processo de instalação estiver completo, execute seu Snap usando seu comando associado. Por exemplo:
- helloworld
No caso do programa exemplo Hello World, o resultado seguinte seria:
OutputHello, world!
Você também pode visualizar a política de área restrita para seu Snap para se certificar de que as permissões atribuídas foram devidamente concedidas:
- snap connections your-snap
Isso irá gerar uma lista de Plugs e interfaces, parecida com a seguinte:
Outputsnap connections your-snap
Interface Plug Slot Notes
home your-snap:your-snap-home :home -
network your-snap:your-snap-network :network -
Neste passo, você construiu seu Snap e o instalou localmente para testar se ele está funcionando. Em seguida, irá publicar seu Snap na Snap Store.
Agora que você compilou e testou seu aplicativo Snap, é hora de lançá-lo na Snap Store.
Comece fazendo login na sua conta de desenvolvedor do Snap, usando o aplicativo de linha de comando Snapcraft:
- snapcraft login
Siga os prompts e digite seu endereço de e-mail e senha.
Em seguida, você precisa registrar o nome do aplicativo na Snap Store:
- snapcraft register your-snap
Assim que tiver registrado o nome do Snap, poderá enviar o pacote do Snap compilado para a loja:
- snapcraft push your-snap.snap
Você verá um resultado similar ao seguinte:
OutputPreparing to push 'your-snap_1.0_amd64.snap'.
Install the review-tools from the Snap Store for enhanced checks before uploading this snap.
Pushing 'your-snap_1.0_amd64.snap' [===================================================================================================] 100%
Processing...|
Ready to release!
Revision 1 of 'your-snap' created.
Cada vez que você manda para a loja do Snap, o número de revisão é incrementado, começando em um. Isso é útil para ajudar a identificar as diferentes compilações do seu Snap.
Por fim, você pode lançar seu Snap para o público:
- snapcraft release your-snap revision-number channel
Caso essa seja a primeira vez que você envia algo para a Snap Store, o número da revisão será 1
. Você também pode escolher entre lançar nos canais stable
, candidate
, beta
e edge
, caso tenha várias versões do seu aplicativo em diferentes fases de desenvolvimento.
Por exemplo, o comando a seguir lançará a revisão 1
do Snap Hello World no canal stable
:
- snapcraft release helloworld 1 stable
Você verá um resultado similar ao seguinte:
OutputTrack Arch Channel Version Revision
latest amd64 stable 1.0 1
candidate ^ ^
beta ^ ^
edge ^ ^
The 'stable' channel is now open.
Agora, você pode procurar pelo seu aplicativo na Snap Store e instalá-lo em qualquer um dos seus dispositivos.
Neste passo final, você enviou seu pacote compilado do Snap para a Snap Store e o lançou para o público.
Neste artigo, você configurou e compilou um aplicativo Snap e, depois, lançou-o para o público através da Snap Store. Agora, possui o conhecimento básico necessário para manter o seu aplicativo e compilar novos.
Caso queira explorar os Snaps ainda mais, confira a Snap Store completa. Você também pode querer rever a referência YAML do Snapcraft para entender mais sobre ela e identificar atributos adicionais para sua configuração do Snap.
Por fim, caso queira investigar ainda mais o desenvolvimento do Snap, pode ser que goste de ler sobre a implementação de Snap Hooks, que permitem que os Snaps reajam dinamicamente às alterações do sistema, como as atualizações ou ajustes de política de segurança.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!