Roteiro de trabalho
Ao final deste roteiro, o aluno terá construído uma pipeline de integração e entrega contínua básica em cima das aplicações apresentadas, que serão executadas em containers cujas imagens serão publicadas no Amazon ECR . Esta pipeline será executada pelo GitLab Runner que será executado sobre uma instância EC2 Spot com escalabilidade automática.
Pré requisitos:
Passo a passo
⚠ Repare em qual zona de disponibilidade você está criando sua infraestrutura!
❓ A notação < x > significa que x deve ser modificado
Parte 1 - Criação do nodo para execução do GitLab Runner
Inicialmente é necessário definir quais portas do nodo estarão expostas na internet:
- Acessar o painel do serviço EC2 no console da AWS
- No menu lateral, acessar Security Groups
- Clicar em Create Security Group
- Inserir um nome (ex.:
gitlab-runner-sg
), descrição e selecionar a VPC default - Na seção Inbound Rules acrescentar as seguintes regras:
-
type
SSH
e origin0.0.0.0/0
-
type
- Clicar em Create Security Group
Para automatizar a criação do GitLab Runner iremos utilizar um template de execução:
- Acessar o painel do serviço EC2 no console da AWS
- No menu lateral, acessar Launch Templates
- Clicar em Create Launch Template
- Inserir um nome (ex.:
gitlab-runner-template
) e descrição - Na seção Amazon Machine Image selecionar
Amazon Linux 2 AMI (x86)
- Na seção Key pair clicar em Create New Key Pair (caso não tenha criado anteriormente)
- Inserir um nome (ex.:
workshop-app
) e clicar em Create New Key Pair -
⚠ Baixe o arquivo pois a AWS não realiza backup deste certificado!
- Inserir um nome (ex.:
- Na seção Network Configuration selecionar o grupo de segurança criado (ex.:
gitlab-runner-sg
) - Na seção Advanced Details acessar o campo de texto User Data e inserir o seguinte shell scrpit:
#!/bin/bash # install docker yum update -y amazon-linux-extras install docker -y yum install docker -y service docker start usermod -a -G docker ec2-user # run gitlab runner container docker run -d --name gitlab-runner --restart always \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:latest # register runner docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \ --non-interactive \ --url https://tools.ages.pucrs.br/ \ --registration-token X6kyNTAx9jyqFdZXWhHU \ --name gitlab-runner \ --executor docker \ --docker-image docker:dind \ --docker-privileged --docker-volumes "/var/run/docker.sock:/var/run/docker.sock" --locked # set cronjob for cleanup echo "0 */1 * * * docker system prune -af" | crontab -
Parte 2 - Criação de grupos auto scaling
- Acessar o painel do serviço EC2 no console da AWS
- No menu lateral, acessar Autoscaling Groups
- Clicar em Create Autoscaling Group
- Inserir um nome (ex.:
gitlab-runner-autoscaling
), selecionar o modelo de execução criado (ex.:gitlab-runner-template
) e clicar Next - Selecionar Combine buy options and instance types
- Em Instance distribution colocar
100% SPOT
- Em instance type, selecionar tipo desejado (ex.:
t3.medium
), dar peso1
, e para as demais colocar pesos maiores que 1 - Em subnets selecionar todas
- Clicar em Next
- Clicar em Next
- Em Desired Capacity e Max capacity colocar
1
, já em Min capacity colocar0
- Clicar em Next
- Clicar em Next
- Clicar em Next
- Clicar em Create Autoscaling Group
- Acessar novamente no painel do serviço EC2 no console da AWS
- No menu lateral, acessar Autoscaling Groups
- Selecionar o grupo de autoscaling criado e navegar para Automatic Scaling
- Em Scheduled Actions clicar em Create Scheduled Action
- Inserir um nome (ex.:
start-runner
) definir Desired, Min e Max como1
, inserir a recorrência desejada e clicar em Create -
- Inserir um nome (ex.:
stop-runner
) definir Desired, Min e Max como0
, inserir a recorrência desejada e clicar em Create
- Inserir um nome (ex.:
Parte 3 - Criação de um repositório no ECR
Para que as imagens possem ser publicadas no repositório da AWS é necessario criar o seu repositório ECR (Elastic Container Registry):
- Acessar o painel do serviço ECR no console da AWS
- No menu lateral, acessar Repositories
- Clicar em Create Repository
- Inserir um nome (ex.:
my-app
) - Clicar em Create Repository
Parte 4 - Configuração no GitLab
Para que a pipeline de CI/CD consiga acessar os serviços da AWS é necessário que se tenha em mãos o seu access key id
e secret access key
:
- Acessar o painel do serviço IAM no console da AWS
- No menu lateral, acessar Users
- Clicar no seu usuário
- Em Security Credentials clicar em Create Acess Key
-
⚠ Faça o download do arquivo CSV gerado!
Para que seja possível executar o CI/CD com sucesso é necessário configurar algumas variáveis de ambiente no GitLab:
- Acessar o seu GitLab e, em Groups escolher o seu grupo
- No menu lateral, em Settings selecionar CI/CD
- Expandir Variables e inserir as seguintes variáveis, sempre selecionando a opção Protected:
- Em key inserir
AWS_ACCESS_KEY_ID
e em value inserir aaccess key id
criada no IAM - Em key inserir
AWS_SECRET_ACCESS_KEY
e em value inserir asecret access key
criada no IAM - Em key inserir
SSH_PRIVATE_KEY
e em value inserir o conteúdo do certificado .pem utilizando o comandocat <nome-do-certificado>.pem
- Em key inserir
Parte 5 - Criação da pipeline de CI/CD
Por fim, é necessário que a pipeline seja criada no repositório desejado, onde o nome do arquivo deve ser .gitlab-ci.yaml
. Abaixo se encontram as pipeline utilizadas no backend e frontend do workshop, porém não são "balas de prata", portanto o aluno deverá ajustá-las de acordo com a sua demanda:
- Acessar novamente o painel do serviço ECR no console da AWS
- No menu lateral, acessar Repositories e copiar a URI do repositório
- Alterar as ocorrências de
029236691098.dkr.ecr.us-east-2.amazonaws.com/<tag-do-app>
pelo seu repositório ECR
Agora todo commit realizado no seu repositório será enviado ao Swarm executando na AWS, parabéns!
Referências
TODO