Summary
Show content
Introduction
Esse post faz parte da minha jornada de aprendizado em DevOps! Se algo parecer incorreto ou confuso, fique à vontade para deixar um comentário ou se conectar comigo no Linkedin (LucJosin) ou
GitHub (LucJosin) .
Enquanto estudamos DevOps e aplicações em containers, uma das primeiras coisas que aprendemos é: Como criar um pipeline de deploy para que seus containers/imagens sejam construídos, etiquetados e enviados automaticamente.
Neste post, vou mostrar como configurei um workflow de CI/CD usando o GitHub Actions para publicar containers/imagens no GitHub Container Registry (GHCR).
O que é CI/CD?
O CI/CD significa Integração Contínua
e Entrega (ou Deploy) Contínua
.
- CI: Automatiza o processo de testar e construir o código sempre que você envia alterações.
- CD: Automatiza o deploy, colocando seu código em um ambiente (ex: produção/desenvolvimento).
Usando ambos, você garante que cada mudança seja integrada, testada, construída e entregue rapidamente.
O que é o GHCR (GitHub Container Registry)?
O GHCR é o registro de containers nativo do GitHub, semelhante ao Docker Hub , porém mais integrado ao GitHub. Ele permite que você:
- Armazene e gerencie containers/imagens
- Associe imagens diretamente aos repositórios
- Controle o acesso via permissões do GitHub
É gratuito para repositórios públicos e também suporta hospedagem privada de imagens. Além disso, funciona perfeitamente com o GitHub Actions.
Fluxo do CI/CD
Aqui está um fluxo visual para o CI/CD:
Loading graph...
Visão geral do aplicativo
Para este post, criei um simples webapp em Golang. Você pode encontrar o código no repositório do GitHub:
Configurando o Dockerfile
Antes de configurar nosso workflow do GitHub Actions, vamos definir o Dockerfile, que descreve como construir e executar nosso aplicativo Go dentro de um contêiner.
Aqui está o Dockerfile completo:
1# ---- Etapa de Build ----2FROM golang:1.22-alpine AS builder3
4# Definir diretório de trabalho5WORKDIR /app6
7# Instalar pacotes necessários8RUN apk add --no-cache git9
10# Copiar o arquivo go.mod11COPY go.mod ./12
13# Baixar dependências14RUN go mod download15
16# Copiar o restante do código-fonte17COPY . .18
19# Compilar a aplicação Go20RUN GOOS=linux go build -o app main.go21
22# ---- Etapa de Execução ----23FROM alpine:latest24
25# Definir diretório de trabalho26WORKDIR /app27
28# Copiar o binário e os arquivos de template da etapa de build29COPY --from=builder /app/app /app/index.tmpl ./30
31# Expor porta32EXPOSE 808033
34# Executar a aplicação35CMD ["./app"]
Neste caso, usamos um Dockerfile de múltiplas etapas:
Build:
- Configura o ambiente Go utilizando uma imagem (com Golang configurado).
- Instala pacotes necessários (como o Git, usado para buscar dependências do Go).
- Copia o código-fonte e os arquivos de módulos.
- Baixa as dependências com
go mod download
. - Compila a aplicação em um binário usando
go build
.
Run:
- Utiliza uma imagem (base) leve para manter a imagem final pequena.
- Copia o binário compilado da fase de build.
- Define o diretório de trabalho.
- Expondo a porta que o app usará.
- Define o comando para rodar o app.
Configurando o GitHub Actions
Agora que definimos as instruções para construir a imagem, vamos configurar nosso workflow com o arquivo build.yml, este arquivo diz ao GitHub Actions como e quando executar ações/passos/tarefas automatizadas.
O GitHub permite que você tenha múltiplos workflows
, todas as configurações .yaml devem estar no diretório .github/workflows/
.
Aqui está o arquivo completo de workflow:
1# Nome do workflow exibido no GitHub Actions2name: 'Build e Push para GHCR'3
4# Aciona o workflow quando um tag é enviado, como: v1.0.05on:6 push:7 tags:8 - 'v[0-9].[0-9]+.[0-9]'9
10# Define variáveis de ambiente disponíveis para todos os passos11env:12 GHCR_TOKEN: ${{ secrets.GHCR_TOKEN }} # Token do GitHub Container Registry (definido nos segredos do repositório)13 CONTAINER_NAME: lucjosin/go-webapp-ghcr # Nome da imagem a ser publicada (tudo minúsculo)14 USER_NAME: LucJosin # Nome de usuário do GitHub usado para autenticação no GHCR15
16jobs:17 build-and-push:18 runs-on: ubuntu-latest # Usa o runner mais recente do Ubuntu19
20 steps:21 # Passo 122 - name: Configurar checkout23 uses: actions/checkout@v424
25 # Passo 226 - name: Configurar a tag git mais recente27 run: |28 RAW_TAG="${GITHUB_REF#refs/tags/}"29 VERSION="${RAW_TAG#*@}"30 echo "VERSION=${VERSION}" >> $GITHUB_ENV31 echo "Versão: $VERSION"32
33 # --- Etapa de Build ---34
35 # Passo 336 - name: Build com Docker37 run: |38 docker build -t ghcr.io/${{ env.CONTAINER_NAME }}:latest .39 docker build -t ghcr.io/${{ env.CONTAINER_NAME }}:${{ env.VERSION }} .40
41 # --- Etapa de Push ---42
43 # Passo 444 - name: Login no GitHub (GHCR)45 run: echo $GHCR_TOKEN | docker login ghcr.io -u $USER_NAME --password-stdin46
47 # Passo 548 - name: Push no GitHub (GHCR)49 run: |50 docker push ghcr.io/${{ env.CONTAINER_NAME }}:latest51 docker push ghcr.io/${{ env.CONTAINER_NAME }}:${{ env.VERSION }}
O workflow contém os seguintes passos:
- Configurar checkout: Configura o repositório de código (para que o workflow possa acessá-lo).
- Configurar a tag git mais recente: Extrai a versão da última tag.
- Build com Docker: Constrói a imagem, com tags nas versões: latest e env.VERSION (definida anteriormente).
- Login no GitHub (GHCR): Faz login no GHCR.
- Push no GitHub (GHCR): Envia as imagens para o GHCR.
A variável CONTAINER_NAME
DEVE estar em letras minúsculas.
Após publicar uma nova versão (como v1.0.0):
- Sua imagem aparecerá na seção Packages do seu repositório.
- Você pode puxá-la em qualquer host usando o caminho completo da imagem.
Preparando o Ambiente
Precisamos preparar o ambiente do repositório antes da execução do workflow, o que envolve: Atualizar permissões do workflow e Criar um token GHCR:
Atualizando permissões do workflow
Este workflow requer permissões adicionais para ser executado com sucesso. Isso garante que seus workflows tenham o acesso necessário para ler, escrever e acessar segredos, siga os passos no GIF abaixo para atualizá-las:

Você pode encontrar essas configurações na seção Settings > Actions > General
do seu repositório.
Criando um token GHCR
Você pode acessar github.com/settings/tokens/new?scopes=write:packagespara criar um novo token, o parâmetro ?scopes=write:packages
selecionará corretamente o escopo write:packages que será utilizado para baixar e enviar imagens de contêiner.
Observe que, de acordo com a documentação:
- O GitHub Packages suporta apenas autenticação usando um token de acesso pessoal (clássico).
- Por padrão, quando você seleciona o escopo write:packages para o seu token de acesso pessoal (clássico) na interface do usuário, o escopo repo também será selecionado.
Veja mais em docs.github.com
Se você não souber como adicionar um segredo em um Repositório GitHub, abra a caixa abaixo:
Como adicionar um segredo em um Repositório GitHub
Acesse o repositório no GitHub.
Clique na aba “Settings” do repositório.
Na barra lateral esquerda, vá para “Secrets and variables” > “Actions”.
Clique no botão “New repository secret”.
Preencha os campos:
- Name: o nome do segredo (ex:
GHCR_TOKEN
) - Secret: o valor do segredo (ex: seu token de acesso pessoal)
- Name: o nome do segredo (ex:
Clique em “Add secret” para salvar.
Acionando o workflow
Depois que o workflow do GitHub Actions for definido, você pode acioná-lo ao enviar uma nova tag
que siga o padrão de versão definido no workflow:
1git tag v1.0.02git push origin v1.0.0
Após a tag ser enviada, o GitHub Actions irá automaticamente executar o CI/CD, construindo e publicando o app.

Se tudo correr bem, você verá o listado tanto na seção Releases quanto na seção Packages.

Usando a imagem
Agora que enviamos a imagem para o GHCR, podemos usar os seguintes métodos para puxar e rodar a aplicação localmente:
CLI
O primeiro método para puxar e rodar a imagem é usando o terminal com o Docker CLI:
1docker run -d --name golang-app -p 8080:8080 ghcr.io/lucjosin/go-webapp-ghcr
Passo a passo:
- docker run -d: Puxa e inicia um novo contêiner no modo detached.
- —name golang-app: Define o nome
golang-app
para o contêiner. - -p 8080:8080: Abre a porta
8080
do contêiner para a porta8080
do seu computador. - ghcr.io/lucjosin/go-webapp-ghcr: Esta é a imagem que está sendo puxada e executada (Lembre-se de usar a sua imagem).

Compose
O segundo método para puxar e rodar a imagem é usando o arquivo compose.yaml:
1services:2 app:3 image: ghcr.io/lucjosin/go-webapp-ghcr4 container_name: golang-app5 ports:6 - '8080:8080'
Execute o seguinte comando no mesmo diretório que o arquivo
:
1docker compose up -d
- Seja qual for o método utilizado, o contêiner estará em execução em
http://localhost:8080
. - Lembre-se de alterar o
ghcr.io/lucjosin/go-webapp-ghcr
para usar o caminho da sua imagem.
Conclusão
Configurar o GitHub Actions e fazer o deploy para o GHCR é uma ótima introdução ao CI/CD no mundo DevOps. Isso reduz o trabalho manual e possibilita a criação de workflows automatizados mais completos.
Espero que esse post lhe dê um ponto de partida para automatizar seus próprios “deployments”.