Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
1. Aula 03 – Introdução ao CI/CD e Infraestrutura como Código
linkedin.com/in/guijac
guilherme.cruz@alumni.usp.br
Prof. Esp. Guilherme Jorge Aragão da Cruz
Curso de Verão:
DevOps
http://linkedin.com/in/guijac
2. linkedin.com/in/guijac
Roteiro
▪ Revisitando DevOps
▪ Continuous Integration (CI);
▪ Continuous Delivery e Deployment (CD);
▪ Juntando as Peças: CI+CD;
▪ Gitlab Runner
▪ Definição e o arquivo .gitlab-ci.yml.
▪ Github Actions
▪ O arquivo YAML.
▪ Infraestrutura como Código (IaC)
▪ Definição, Importância e Ferramentas.
▪ Terraform
▪ Definição, Características e Comandos Básicos.
▪ Referências Bibliográficas;
▪ Laboratório.
2 de 25
http://linkedin.com/in/guijac
3. linkedin.com/in/guijac
Bibliografia
▪Cultura na Engenharia de Software que aproxima as equipes
de desenvolvimento (Dev) e operadoras/administradoras de
sistemas (Ops);
▪Visa melhorar a comunicação dos dois papéis dentro de um
projeto e defender a automação e monitoramento de um
software.
Fonte: The industry is moving towards a single application for the DevOps lifecycle | GitLab
3 de 25
http://linkedin.com/in/guijac
4. linkedin.com/in/guijac
Bibliografia
▪Cultura na Engenharia de Software que aproxima as equipes
de desenvolvimento (Dev) e operadoras/administradoras de
sistemas (Ops);
▪Visa melhorar a comunicação dos dois papéis dentro de um
projeto e defender a automação e monitoramento de um
software.
Fonte: The industry is moving towards a single application for the DevOps lifecycle | GitLab
PyUnit
Management
Console
4 de 25
http://linkedin.com/in/guijac
5. linkedin.com/in/guijac
Continuous Integration (CI)
▪A partir da entrega de um novo código (git push) realiza a
execução de testes automatizados;
▪Os testes e a geração do pacote (build) são realizados em
um “Servidor de CI“ (CI Server), visando antecipar a
descoberta de erros.
Fonte: CI/CD concepts | GitLab
5 de 25
http://linkedin.com/in/guijac
6. linkedin.com/in/guijac
Continuous Delivery e Deployment (CD)
Fonte: Adaptado de CI/CD concepts | GitLab
▪ O código alterado é implantado
nos ambientes
de Desenvolvimento (Review),
Homologação (Staging) e
Produção:
▪ Implantação Manual = Continuous
Delivery;
▪ Implantação Automática =
Continuous Deployement.
▪ Podem ser executados testes
mais abrangentes (análise
estática e/ou dinâmica com foco
em segurança, por exemplo).
6 de 25
http://linkedin.com/in/guijac
8. linkedin.com/in/guijac
Gitlab Runner – Definição
▪Recurso do Gitlab que permite a execução de pipelines¹ para
um CI/CD da sua própria aplicação;
▪Permite a orquestração de todas as etapas para a
implantação da sua aplicação: build, testes e deploy.
¹ Termo derivado de Arquitetura de Computadores, consiste na técnica de hardware que permite que a CPU realize a busca de uma ou mais
instruções além da próxima a ser executada, criando uma fila de atividades, agrupadas por estágios (stages).
Fonte: GitLab CI/CD for Beginners [FREE Course] - DEV Community
8 de 25
http://linkedin.com/in/guijac
9. linkedin.com/in/guijac
Gitlab Runner – O Arquivo .gitlab-ci.yml
▪ Arquivo YAML (YAML Ain't Markup Language) que especifica
as instruções para a execução da pipeline através do Gitlab
Runner;
▪ O arquivo deve ser salvo na raiz do projeto sempre com o
nome .gitlab-ci.yml;
▪ Possui uma série de palavras-chave para diversas situações
de uso, como acionamento em branches especificas;
▪ A sintaxe completa do arquivo pode ser consultada na
documentação de referência e seu preenchimento pode ser
validado no Editor de Pipelines do Gitlab ou através de uma
extensão do VSCode.
Arquivo .gitlab-ci.yml que executa um stage chamado “test-job” exibindo o valor informado a partir do comando “echo”
dentro da interface gráfica do Gitlab (menu CI/CD > Pipelines > Jobs).
test-job:
stage: test
script:
- echo "This job tests something"
9 de 25
http://linkedin.com/in/guijac
10. linkedin.com/in/guijac
Gitlab Runner – O Arquivo .gitlab-ci.yml
build-job:
stage: build
script:
- echo "Hello, $GITLAB_USER_LOGIN!"
test-job1:
stage: test
script:
- echo "This job tests something"
test-job2:
stage: test
script:
- echo "This job tests something, but takes more time than test-job1."
- echo "After the echo commands complete, it runs the sleep command for 20 seconds"
- echo "which simulates a test that runs 20 seconds longer than test-job1"
- sleep 20
deploy-prod:
stage: deploy
script:
- echo "This job deploys something from the $CI_COMMIT_BRANCH branch."
Arquivo .gitlab-ci.yml com quatro stages, também realizando apenas a impressão dos comandos definidos dentro do bloco
“script” na interface gráfica do Gitlab.
10 de 25
http://linkedin.com/in/guijac
11. linkedin.com/in/guijac
Github Actions – O Arquivo .gitlab-ci.yml
build-job:
stage: build
script:
- echo "Hello, $GITLAB_USER_LOGIN!"
test-job1:
stage: test
script:
- echo "This job tests something"
test-job2:
stage: test
script:
- echo "This job tests something, but takes more time than test-job1."
- echo "After the echo commands complete, it runs the sleep command for 20 seconds"
- echo "which simulates a test that runs 20 seconds longer than test-job1"
- sleep 20
deploy-prod:
stage: deploy
script:
- echo "This job deploys something from the $CI_COMMIT_BRANCH branch."
Arquivo .gitlab-ci.yml com quatro stages, também realizando apenas a impressão dos comandos definidos dentro do bloco
“script” na interface gráfica do Gitlab.
11 de 25
http://linkedin.com/in/guijac
12. linkedin.com/in/guijac
Infraestrutura como Código – Definição
RED HAT (2022)
– Infraestrutura como código (IaC) refere-se ao
gerenciamento e provisionamento da infraestrutura
por meio de códigos, em vez de processos manuais. A
sigla vem do termo em inglês, "Infrastructure as
Code".
– Nesta abordagem, arquivos de configuração que
incluem as especificações da sua infraestrutura são
criados, facilitando a edição e a distribuição das suas
configurações.
12 de 25
http://linkedin.com/in/guijac
13. linkedin.com/in/guijac
Infraestrutura como Código – Importância
▪ Forma de Gerenciamento de Configuração,
documentando todas as alterações de
infraestrutura, com apoio de um sistema de
controle de versão, como o Git.
Fonte: Infrastructure as Code (IaC) - A Developer’s Perspective (ssl2buy.com)
13 de 25
http://linkedin.com/in/guijac
14. linkedin.com/in/guijac
Infraestrutura como Código – Importância
▪ Parte fundamental para a implementação das
práticas de integração e entrega contínuas (CI/CD);
▪ Favorece a colaboração entre as equipes de
desenvolvimento e de operações.
Fonte: Infrastructure as Code (IaC) - A Developer’s Perspective (ssl2buy.com)
14 de 25
http://linkedin.com/in/guijac
16. linkedin.com/in/guijac
Infraestrutura como Código – Importância
▪ Possibilita o provisionamento de infraestrutura
através de uma linguagem de configuração de alto
nível, a Hashicorp Configuration Language (HCL);
▪ Oferece compatibilidade com diversos provedores
da nuvem, como Amazon Web Services (AWS),
Google Cloud Plataform (GCP), Microsoft Azure,
entre outros.
Fonte: Infrastructure Provisioning (hashicorp.com)
16 de 25
http://linkedin.com/in/guijac
17. linkedin.com/in/guijac
Terraform – Características: Variáveis
▪ Utiliza-se de alguns conceitos de linguagens de
programação, tais como variáveis, que podem ser
tipadas como “string”, “number”, “bool” ou mesmo
tipos complexos, como “maps” (estrutura do tipo
chave-valor).
variable "region" {
type = string
default = "us-east-1"
}
variable "s3_name" {
type = string
}
variable "account_name" {
type = "map"
default = {
"account1" = "devops1"
"account2" = "devops2"
}
}
17 de 25
http://linkedin.com/in/guijac
18. linkedin.com/in/guijac
Terraform – Características: Módulos e Recursos
▪ Organiza-se através de módulos (modules), que
podem possuir diversos recursos (resources), sendo
este o elemento base do Terraform, onde cada
bloco de recurso descreve um ou mais objetos de
uma infraestrutura.
resource "aws_s3_bucket" "this" {
bucket = var.s3_name
}
resource "aws_s3_bucket_acl" "this" {
bucket = aws_s3_bucket.this.id
acl = "private"
}
18 de 25
http://linkedin.com/in/guijac
19. linkedin.com/in/guijac
Terraform – Características: State
• Armazena o estado (state) sobre a sua
infraestrutura gerenciada e configuração. Este
estado é utilizado para determinar quais
alterações irão ocorrer em uma determinada
infraestrutura (em caso de reexecução de uma
pipeline, por exemplo);
• O estado é armazenado em um backend, que no
Gitlab é do tipo “HTTP” e autogerenciado.
terraform {
backend "http" {
}
}
19 de 25
http://linkedin.com/in/guijac
21. linkedin.com/in/guijac
Referências Bibliográficas
ATLASSIAN. Infraestrutura como código. Disponível em
https://www.atlassian.com/br/microservices/cloud-computing/infrastructure-as-code. Acesso em 14 mar
2023;
FOWLER, Martin. Continuous Integration. Disponível em
https://martinfowler.com/articles/continuousIntegration.html. Acesso em 10 mar 2023;
GITHUB. Workflow syntax for GitHub Actions. Disponível em https://docs.github.com/en/actions/using-
workflows/workflow-syntax-for-github-actions. Acesso em 29 jun 2023;
GITLAB. CI/CD concepts. Disponível em https://docs.gitlab.com/ee/ci/introduction/. Acesso em 25 mai
2023;
HASHICORP. What is Infrastructure as Code with Terraform? Disponível em
https://developer.hashicorp.com/terraform/tutorials/aws-get-started/infrastructure-as-code. Acesso em
14 mar 2023;
HUMBLE, Jez; FARLEY, David. Continuous delivery: reliable software releases through build, test, and
deployment automation. Pearson Education, 2010;
KIM, Gene et al. The DevOps handbook: How to create world-class agility, reliability, & security in
technology organizations. IT Revolution, 2021.
21 de 25
http://linkedin.com/in/guijac
22. linkedin.com/in/guijac
Por hoje (de teoria) é só!
linkedin.com/in/guijac
guilherme.jacruz@sp.senac.br
Prof. Esp. Guilherme Jorge Aragão da Cruz
Fonte: Adaptado de CI/CD concepts | GitLab
22 de 25
http://linkedin.com/in/guijac
23. linkedin.com/in/guijac
Laboratório 1
▪ Primeira pipeline no Gitlab com execução de testes
unitários;
▪ Utilizar o projeto base flask-docker ou outro projeto
próprio em Python;
▪ Criar um arquivo .gitlab-ci.yml (página 10) no projeto
criado;
▪ Utilizar um Runner do Gitlab;
▪ Editar o arquivo .gitlab-ci.yml contemplando a execução
dos testes unitários com PyUnit e validar nossa pipeline.
▪ Referência: lab-devops/projetos-gitlab/flask-gitlab-ci at
main · guijac/lab-devops · GitHub
23 de 25
http://linkedin.com/in/guijac
24. linkedin.com/in/guijac
Laboratório 2
▪ Construção de uma pipeline para provisionamento de um
bucket S3[1];
▪ Construção de uma pipeline para publicação de um site
estático com HTML no bucket S3 criado[2];
▪ [1] Referência: lab-devops/projetos-gitlab/s3-terraform-
gitlab-ci at main · guijac/lab-devops · GitHub;
▪ [2] Referência: lab-devops/projetos-gitlab/s3-gitlab-ci-
portal-rhcp at main · guijac/lab-devops · GitHub.
24 de 25
http://linkedin.com/in/guijac
25. linkedin.com/in/guijac
Por hoje (agora sim) é só!
linkedin.com/in/guijac
guilherme.jacruz@sp.senac.br
Prof. Esp. Guilherme Jorge Aragão da Cruz
Fonte: Adaptado de CI/CD concepts | GitLab
25 de 25
http://linkedin.com/in/guijac