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.

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 DockerExemplo de serviços Docker

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.

  1. No painel de controlo do Stackhero, selecione o seu serviço Docker "production" e clique no botão "Configure".

    Obter configurações do serviçoObter configurações do serviço

  2. Copie o "Domain name" e a "Docker certificates password" para usar nos próximos passos.

    Obter configurações do serviçoObter configurações do serviço

  1. Vá para o GitHub e selecione o seu projeto.

  2. Clique em Settings > Environments e depois em New environment.

    Configurar ambientes GitHubConfigurar ambientes GitHub

  3. No campo Name, insira "production" e confirme.

    Definir o ambienteDefinir o ambiente

  4. Clique no botão No restriction e selecione Selected branches and tags.

    Definir restrições de ambienteDefinir restrições de ambiente

  5. Clique em Add deployment branch or tag rule, insira "production" no campo Name pattern, e depois clique em Add rule.

    Definir branch de ambienteDefinir branch de ambiente Definir branch de ambienteDefinir branch de ambiente

  6. Sob Environment secrets, clique em Add secret.

    Adicionar segredoAdicionar segredo

  7. Para o segredo, insira STACKHERO_CERTIFICATES_PASSWORD como nome e cole a sua palavra-passe dos certificados como Value.

    Definir o segredo da palavra-passe dos certificadosDefinir o segredo da palavra-passe dos certificados

  8. Sob Environment variables, clique em Add variable.

    Definir variáveisDefinir variáveis

  9. Insira STACKHERO_ENDPOINT como 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 endpointDefinir 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.

Se o ficheiro docker-compose.yml estiver 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

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çãoGitHub Actions que implementou em produção

Parabéns! Agora pode implementar automaticamente o seu código em produção usando o GitHub Actions.

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.

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).

  1. No GitHub, vá para Settings > Environments e crie uma variável de ambiente chamada WEBSITE_DOMAIN.
  2. Para o ambiente de staging, defina WEBSITE_DOMAIN como "staging.my-company.com".
  3. Para o ambiente de produção, defina WEBSITE_DOMAIN como "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"

É 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).