Docker: Implementar com GitHub Actions
Aprenda a implementar os seus contentores Docker usando GitHub Actions
👋 Bem-vindo à documentação da Stackhero!
A Stackhero oferece uma solução Docker cloud CaaS (Containers as a Service) pronta a usar que proporciona uma série de benefícios, incluindo:
- Implemente facilmente os seus containers em produção com apenas um
docker-compose up.- Nome de domínio personalizável seguro com HTTPS (por exemplo, https://api.sua-empresa.com, https://www.sua-empresa.com, https://backoffice.sua-empresa.com).
- Desempenho ótimo e segurança robusta alimentados por uma VM privada e dedicada.
- Atualizações sem esforço com apenas um clique.
Poupe tempo e simplifique a sua vida: são necessários apenas 5 minutos para experimentar a solução de hospedagem cloud Docker CaaS da Stackhero e implementar os seus containers em produção!
O GitHub Actions permite automatizar tarefas como a implementação dos seus contentores Docker em servidores de produção. Neste guia, aprenderá a configurar o GitHub Actions de forma segura e fiável para implementar os seus contentores Docker em ambientes de staging e produção.
Para esta configuração, manterá duas branches: staging e production. O código enviado para cada branch será automaticamente implementado na instância correspondente do Stackhero.
Ter uma instância de staging não é obrigatório. Pode seguir este guia usando apenas uma instância de produção. No entanto, para reduzir riscos e aumentar a confiança ao implementar em produção, é fortemente recomendado ter tanto uma instância de staging quanto de produção. Esta é uma norma da indústria e uma boa prática que pode ajudar a evitar muitos problemas potenciais.
Antes de começar, certifique-se de que tem uma conta GitHub com um repositório que hospeda o seu código.
Criar os serviços Docker
Comece por iniciar sessão no seu painel de controlo Stackhero e criar dois serviços Stackhero: um para staging e outro para produção. Para minimizar erros, pode renomear estes serviços para "Staging" e "Production".
Ainda não tem uma conta Stackhero? Pode criar uma gratuitamente em apenas dois minutos e depois criar os seus serviços cloud Docker com apenas alguns cliques.
Exemplo de serviços Docker
Configurar as variáveis de ambiente e segredos
Obter o nome de domínio e a palavra-passe dos certificados
Para permitir que o GitHub Actions se conecte ao seu serviço Docker Stackhero, precisa de duas informações: o nome de domínio do seu serviço e a palavra-passe dos certificados.
-
No painel de controlo do Stackhero, selecione o seu serviço Docker "production" e clique no botão "Configure".
Obter configurações do serviço -
Copie o "Domain name" e a "Docker certificates password" para usar nos próximos passos.
Obter configurações do serviço
Definir o nome de domínio e a palavra-passe dos certificados no GitHub
-
Vá para o GitHub e selecione o seu projeto.
-
Clique em Settings > Environments e depois em New environment.
Configurar ambientes GitHub -
No campo Name, insira "production" e confirme.
Definir o ambiente -
Clique no botão No restriction e selecione Selected branches and tags.
Definir restrições de ambiente -
Clique em Add deployment branch or tag rule, insira "production" no campo Name pattern, e depois clique em Add rule.
Definir branch de ambiente
Definir branch de ambiente -
Sob Environment secrets, clique em Add secret.
Adicionar segredo -
Para o segredo, insira
STACKHERO_CERTIFICATES_PASSWORDcomo nome e cole a sua palavra-passe dos certificados como Value.
Definir o segredo da palavra-passe dos certificados -
Sob Environment variables, clique em Add variable.
Definir variáveis -
Insira
STACKHERO_ENDPOINTcomo nome e cole o seu endpoint de serviço Docker no campo Value. Pode encontrar este endpoint no seu painel de controlo Stackhero.
Definir a variável endpoint
Se personalizou o nome de domínio do seu serviço, use a versão personalizada em vez de xxxxxx.stackhero-network.com.
Personalizar o ficheiro de configuração Docker Compose
Se o ficheiro
docker-compose.ymlestiver presente na raiz do seu projeto e não forem necessárias personalizações, pode ignorar esta seção.
Por padrão, o GitHub Actions espera que o ficheiro Docker Compose docker-compose.yml esteja na raiz do seu projeto. Se precisar usar um ficheiro diferente, pode personalizar o comando de implementação. Por exemplo, se usar o nosso boilerplate de início com Node.js e Docker, pode criar uma nova variável de ambiente chamada STACKHERO_DEPLOY_COMMAND e defini-la como:
docker compose --env-file env.list --file docker/docker-compose.yml --file docker/docker-compose.production.yml up --build --remove-orphans -d
Configurar o workflow GitHub Actions
Na sua máquina local, navegue até ao seu repositório Git e crie um diretório chamado .github/workflows. Neste diretório, crie um ficheiro chamado deploy-to-stackhero.yml com o seguinte conteúdo:
# File: .github/workflows/deploy-to-stackhero.yml
name: Deploy to Stackhero
description: Implementar a branch "${{ github.ref_name }}" no Stackhero
on:
push:
# Estas branches acionam a ação de implementação ao enviar.
# Certifique-se de criar um ambiente correspondente ao nome da branch no GitHub (em Settings > Environments).
# Depois adicione o segredo STACKHERO_CERTIFICATES_PASSWORD e a variável STACKHERO_ENDPOINT nesse ambiente.
branches: [ "production", "staging" ]
jobs:
Deploy:
environment: ${{ github.ref_name }}
runs-on: ubuntu-latest
steps:
- uses: stackhero-io/github-actions-deploy-docker-containers-to-stackhero@v1
with:
# O segredo STACKHERO_CERTIFICATES_PASSWORD e a variável STACKHERO_ENDPOINT devem ser definidos no ambiente de branch correspondente no GitHub.
certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
endpoint: ${{ vars.STACKHERO_ENDPOINT }}
# deployment_command é opcional. Use-o se precisar personalizar o comando Docker Compose.
deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}
Confirme as suas alterações executando:
git add -A .
git commit -m "Add GitHub Actions to deploy to Stackhero"
Em seguida, crie uma branch de produção executando:
git checkout -b production
Finalmente, envie a sua branch de produção para o GitHub:
git push --set-upstream origin production
Uma vez enviada, o GitHub Actions implementará automaticamente o seu código na sua instância de produção Stackhero. Pode monitorizar a implementação visitando o separador Actions no seu projeto GitHub.
GitHub Actions que implementou em produção
Parabéns! Agora pode implementar automaticamente o seu código em produção usando o GitHub Actions.
Criar o ambiente de staging
Configurar o ambiente de staging é semelhante à configuração de produção. Basta repetir os passos acima, substituindo production por staging.
Depois, crie uma branch de staging executando:
git checkout -b staging
Envie a sua branch de staging para o GitHub com:
git push --set-upstream origin staging
O GitHub Actions implementará automaticamente a sua branch de staging na instância Docker designada para staging.
Usar variáveis de ambiente no docker-compose.yml
Pode definir variáveis de ambiente no seu projeto GitHub que estarão acessíveis no seu ficheiro docker-compose.yml. Isto é útil se quiser implementar em diferentes domínios (por exemplo, staging.my-company.com para staging e my-company.com para produção).
- No GitHub, vá para Settings > Environments e crie uma variável de ambiente chamada
WEBSITE_DOMAIN. - Para o ambiente de staging, defina
WEBSITE_DOMAINcomo "staging.my-company.com". - Para o ambiente de produção, defina
WEBSITE_DOMAINcomo "my-company.com".
Depois, atualize o ficheiro .github/workflows/deploy-to-stackhero.yml para passar a variável WEBSITE_DOMAIN para a Ação GitHub Stackhero:
name: Deploy to Stackhero
description: Implementar a branch "${{ github.ref_name }}" no Stackhero
on:
push:
branches: [ "production", "staging" ]
jobs:
Deploy:
environment: ${{ github.ref_name }}
runs-on: ubuntu-latest
steps:
- uses: stackhero-io/github-actions-deploy-docker-containers-to-stackhero@v1
with:
certificates_password: ${{ secrets.STACKHERO_CERTIFICATES_PASSWORD }}
endpoint: ${{ vars.STACKHERO_ENDPOINT }}
deployment_command: ${{ vars.STACKHERO_DEPLOY_COMMAND }}
env:
WEBSITE_DOMAIN: ${{ vars.WEBSITE_DOMAIN }}
Finalmente, atualize o seu ficheiro docker-compose.yml para usar a variável WEBSITE_DOMAIN em vez de um nome de domínio fixo:
services:
test:
image: nginx
labels:
- "traefik.enable=true"
- "traefik.http.routers.test.rule=Host(`${WEBSITE_DOMAIN}`)" # Usa a variável de ambiente WEBSITE_DOMAIN como nome de domínio.
- "traefik.http.routers.test.tls.certresolver=letsencrypt"
Indo mais além
É uma boa prática proteger as branches production e staging para evitar envios diretos. Com a proteção de branches ativada, um pull request deve ser criado para a branch staging e depois fundido por alguém com as permissões necessárias. Uma vez validado na plataforma de staging, o mesmo processo pode ser seguido para a branch production.
Esta abordagem ajuda a garantir tanto a segurança (apenas membros autorizados da equipa podem implementar em staging e produção) quanto a fiabilidade (as funcionalidades são testadas numa plataforma de staging antes da implementação em produção).