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
Agora registraremos um runner manualmente:
- Acessar o seu GitLab e, em Groups escolher o seu grupo
- No menu lateral, em Settings selecionar CI/CD
- Expandir Runners e, na seção Set up a group Runner manually, copiar o registration token
- Executar o seguinte comando, substituindo TOKEN_COPIADO pelo token copiado no passo anterior:
curl -X POST https://tools.ages.pucrs.br/api/v4/runners --form "token=TOKEN_COPIADO"
- Será retornado um JSON contendo um token, que deve ser copiado e utilizado na próxima seção. Exemplo de retorno:
{"id":1,"token":"dg9kxmnH1cv_eiwhGJpY"}
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
) - Registrar um runner
- Na seção Advanced Details acessar o campo de texto User Data e inserir o seguinte shell script, substituindo TOKEN_GERADO pelo token gerado na seção anterior (registrar um runner):
#!/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
# configure gitlab runner
cat > /srv/gitlab-runner/config/config.toml << EOF
concurrent = 1
check_interval = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "gitlab-runner"
url = "https://tools.ages.pucrs.br"
token = "TOKEN_GERADO"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:dind"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
shm_size = 0
EOF
# 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