Tutorial

Como empacotar e publicar um aplicativo Snap no Ubuntu 18.04

DevelopmentUbuntu 18.04

O autor selecionou a Electronic Frontier Foundation para receber uma doação como parte do programa Write for DOnations.

Introdução

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.

Pré-requisitos

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.

Passo 1 — Preparando seu aplicativo para o empacotamento

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:

helloworld.go
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:

Output
Hello, world!

Você preparou seu aplicativo para empacotar como um Snap. Em seguida, você instalará o software necessário para iniciar o processo de empacotamento.

Passo 2 — Instalando o Snapcraft

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:

Output
snapcraft 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:

Output
snapcraft, 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.

Passo 3 — Definindo a configuração e os metadados para o seu 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:

snapcraft.yaml
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:

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:

snapcraft.yaml
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:

Output
ant 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:

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:

snapcraft.yaml
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:

snapcraft.yaml
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.

Passo 4 — Protegendo seu aplicativo Snap

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:

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:

snapcraft.yaml
. . .
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.

Passo 5 — Compilando e testando seu aplicativo 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:

snapcraft.yaml
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:

Output
Snapped 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.

Output
your-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:

Output
Hello, 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:

Output
snap 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.

Passo 6 — Publicando seu Snap

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:

Output
Preparing 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:

Output
Track 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.

Loja do Snapcraft com o app Hello World exibido nos resultados de busca

Neste passo final, você enviou seu pacote compilado do Snap para a Snap Store e o lançou para o público.

Conclusão

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.

0 Comments

Creative Commons License