Observação: Executores hospedados em GitHub não são atualmente compatíveis com GitHub Enterprise Server. Você pode ver mais informações sobre suporte futuro planejado no Itinerário público do GitHub.
Introdução
Este guia explica como usar GitHub Actions para criar uma aplicação de contêiner, fazer push no Amazon Elastic Container Registry (ECR) e fazer a implementação em Amazon Elastic Container Service (ECS) quando houver um push para o branch principal
.
Em cada novo push para o principal
no seu repositório de GitHub, as compilações de fluxo de trabalho de GitHub Actions e cria e faz push de uma nova imagem de contêiner para o Amazon ECR e, em seguida, implementa uma nova definição de tarefa para o Amazon ECS.
Pré-requisitos
Antes de criar seu fluxo de trabalho de GitHub Actions, primeiro você precisa concluir as etapas a seguir para o Amazon ECR e ECS:
-
Crie um repositório Amazon ECR para armazenar suas imagens.
Usando, por exemplo, CLI AWS:
Shell aws ecr create-repository \ --repository-name MY_ECR_REPOSITORY \ --region MY_AWS_REGION
Certifique-se de usar o mesmo nome de repositório do Amazon ECR (representado aqui por
MY_ECR_REPOSITORY
) para a variávelECR_REPOSITORY
no fluxo de trabalho abaixo.Certifique-se de usar o mesmo valor de região do AWS para a variável
AWS_REGION
(representada aqui pela variávelMY_AWS_REGION
) no fluxo de trabalho abaixo. -
Crie uma definição de tarefa e serviço do Amazon ECS.
Para obter informações, siga o Assistente de introdução no console do Amazon ECS, ou o Guia de introdução na documentação do Amazon ECS.
Certifique-se de anotar os nomes que você definiu para o serviço do Amazon ECS e do cluster e use-os para as variáveis
ECS_SERVICE
eECS_CLUSTER
no fluxo de trabalho abaixo. -
Armazene sua definição de tarefa do Amazon ECS como um arquivo JSON no seu repositório de GitHub.
O formato do arquivo deve ser o mesmo que a saída gerada por:
Shell aws ecs register-task-definition --generate-cli-skeleton
Ensure that you set the
ECS_TASK_DEFINITION
variable in the workflow below as the path to the JSON file.Certifique-se de definir a variável
CONTAINER_NAME
no fluxo de trabalho abaixo como o nome do contêiner na seçãocontainerDefinitions
da definição da tarefa. -
Crie segredos de GitHub Actions denominados
AWS_ACCESS_KEY_ID
eAWS_SECRET_ACCESS_KEY
para armazenar os valores para sua chave de acesso ao Amazon IAM.Para obter mais informações sobre a criação de segredos para GitHub Actions, consulte "segredos criptografados."
Veja a documentação para cada ação usada abaixo para as políticas recomendadas de IAM para o usuário de IAM, bem como os métodos para lidar com as credenciais de acesso.
-
Opcionalmente, configure um ambiente de implantação. Os ambientes são usados para descrever um alvo geral de implantação como
produção
,preparo
oudesenvolvimento
. Quando um fluxo de trabalho de GitHub Actions é implantado em um ambiente, o ambiente é exibido na página principal do repositório. Você pode usar ambientes para exigir aprovação para um trabalho para prosseguir, restringir quais branches podem acionar um fluxo de trabalho ou limitar o acesso a segredos. Para obter mais informações sobre criar ambientes, consulte "Usando ambientes para implantação".
Creating the workflow
Após você ter atendido aos pré-requisitos, você poderá proceder com a criação do fluxo de trabalho.
O fluxo de trabalho a seguir demonstra como construir uma imagem de contêiner e enviá-lo para o Amazon ECR. Em seguida, ele atualiza a definição da tarefa com o novo ID de imagem e implanta a definição da tarefa no Amazon ECS.
Certifique-se de fornecer seus próprios valores para todas as variáveis na chave env
do fluxo de trabalho.
Se você configurou um ambiente de implementação, altere o valor do ambiente
para o nome do seu ambiente. Se você não configurou um ambiente, exclua a chave ambiente
.
# This workflow uses actions that are not certified by GitHub.
# São fornecidas por terceiros e regidas por
# termos de serviço, política de privacidade e suporte separados
# documentação.
name: Deploy to Amazon ECS
on:
push:
branches:
- main
env:
AWS_REGION: MY_AWS_REGION # set this to your preferred AWS region, e.g. us-west-1
ECR_REPOSITORY: MY_ECR_REPOSITORY # set this to your Amazon ECR repository name
ECS_SERVICE: MY_ECS_SERVICE # set this to your Amazon ECS service name
ECS_CLUSTER: MY_ECS_CLUSTER # set this to your Amazon ECS cluster name
ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
# file, e.g. .aws/task-definition.json
CONTAINER_NAME: MY_CONTAINER_NAME # set this to the name of the container in the
# containerDefinitions section of your task definition
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@13d241b293754004c80624b5567555c4a39ffbe3
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@aaf69d68aa3fb14c1d5a6be9ac61fe15b48453a2
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
# Build a docker container and
# push it to ECR so that it can
# be deployed to ECS.
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
- name: Fill in the new image ID in the Amazon ECS task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@97587c9d45a4930bf0e3da8dd2feb2a463cf4a3a
with:
task-definition: ${{ env.ECS_TASK_DEFINITION }}
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }}
- name: Deploy Amazon ECS task definition
uses: aws-actions/amazon-ecs-deploy-task-definition@de0132cf8cdedb79975c6d42b77eb7ea193cf28e
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}
wait-for-service-stability: true
Recursos adicionais
Para o fluxo de trabalho inicial original, consulte aws.yml
no repositório starter-workflows
de GitHub Actions.
Para mais informações sobre os serviços utilizados nestes exemplos, veja a seguinte documentação:
- "Práticas recomendadas de segurança no IAM" na documentação da Amazon AWS.
- Ação oficial de "Configurar credenciais do AWS.
- Ação oficial de "Login" do Amazon ECR do AWS.
- Ação oficial de Definição de tarefa de renderização do Amazon ECS" do AWS.
- Ação oficial de "Definição de tarefa de implantação do Amazon ECS" do AWS.