Skip to content

GitLab

  • Menu
Projects Groups Snippets
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • W wiki
  • Project information
    • Project information
    • Activity
    • Labels
    • Planning hierarchy
    • Members
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Create a new issue
  • Jobs
  • Issue Boards
Collapse sidebar
  • workshop-ages-winter-2021
  • wiki
  • Wiki
  • Dia 3: Containers Docker e CI CD

Last edited by Angelo Calebe Araujo da Rocha Jul 22, 2021
Page history

Dia 3: Containers Docker e CI CD

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:

  • O aluno deve possuir uma conta na AWS

  • O aluno deve ter conhecimentos básicos em Docker.

👉 Manual de criar conta

👉 Informações sobre o nível gratuito da AWS

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:

  1. Acessar o painel do serviço EC2 no console da AWS
  2. No menu lateral, acessar Security Groups
  3. Clicar em Create Security Group
  4. Inserir um nome (ex.: gitlab-runner-sg), descrição e selecionar a VPC default
  5. Na seção Inbound Rules acrescentar as seguintes regras:
    • type SSH e origin 0.0.0.0/0
  6. Clicar em Create Security Group

Agora registraremos um runner manualmente:

  1. Acessar o seu GitLab e, em Groups escolher o seu grupo
  2. No menu lateral, em Settings selecionar CI/CD
  3. Expandir Runners e, na seção Set up a group Runner manually, copiar o registration token
  4. 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"
  1. 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:

  1. Acessar o painel do serviço EC2 no console da AWS
  2. No menu lateral, acessar Launch Templates
  3. Clicar em Create Launch Template
  4. Inserir um nome (ex.: gitlab-runner-template) e descrição
  5. Na seção Amazon Machine Image selecionar Amazon Linux 2 AMI (x86)
  6. 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!
  7. Na seção Network Configuration selecionar o grupo de segurança criado (ex.: gitlab-runner-sg)
  8. Registrar um runner
  9. 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

  1. Acessar o painel do serviço EC2 no console da AWS
  2. No menu lateral, acessar Autoscaling Groups
  3. Clicar em Create Autoscaling Group
  4. Inserir um nome (ex.: gitlab-runner-autoscaling), selecionar o modelo de execução criado (ex.: gitlab-runner-template) e clicar Next
  5. Selecionar Combine buy options and instance types
  6. Em Instance distribution colocar 100% SPOT
  7. Em instance type, selecionar tipo desejado (ex.: t3.medium), dar peso 1, e para as demais colocar pesos maiores que 1
  8. Em subnets selecionar todas
  9. Clicar em Next
  10. Clicar em Next
  11. Em Desired Capacity e Max capacity colocar 1, já em Min capacity colocar 0
  12. Clicar em Next
  13. Clicar em Next
  14. Clicar em Next
  15. Clicar em Create Autoscaling Group
  16. Acessar novamente no painel do serviço EC2 no console da AWS
  17. No menu lateral, acessar Autoscaling Groups
  18. Selecionar o grupo de autoscaling criado e navegar para Automatic Scaling
  19. Em Scheduled Actions clicar em Create Scheduled Action
  20. Inserir um nome (ex.: start-runner) definir Desired, Min e Max como 1, inserir a recorrência desejada e clicar em Create
    1. Inserir um nome (ex.: stop-runner) definir Desired, Min e Max como 0, inserir a recorrência desejada e clicar em Create

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

  1. Acessar o painel do serviço ECR no console da AWS
  2. No menu lateral, acessar Repositories
  3. Clicar em Create Repository
  4. Inserir um nome (ex.: my-app)
  5. 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:

  1. Acessar o painel do serviço IAM no console da AWS
  2. No menu lateral, acessar Users
  3. Clicar no seu usuário
  4. Em Security Credentials clicar em Create Acess Key
  5. ⚠ 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:

  1. Acessar o seu GitLab e, em Groups escolher o seu grupo
  2. No menu lateral, em Settings selecionar CI/CD
  3. 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 a access key id criada no IAM
    • Em key inserir AWS_SECRET_ACCESS_KEY e em value inserir a secret access key criada no IAM
    • Em key inserir SSH_PRIVATE_KEY e em value inserir o conteúdo do certificado .pem utilizando o comando cat <nome-do-certificado>.pem

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:

  • Frontend
  • Backend

⚠ Deve-se modificar os repositórios das pipelines:

  1. Acessar novamente o painel do serviço ECR no console da AWS
  2. No menu lateral, acessar Repositories e copiar a URI do repositório
  3. 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

Clone repository
  • Dia 1: Frontend, Backend e Git
  • Dia 2: Amazon Web Services (AWS)
  • Dia 3: Containers Docker e CI CD
  • Home