Uma Avaliação do Github Actions

CI/CD com Terraform

felipe f. rocha

  1. Introdução
    • CI
    • CD
  2. Fundamentos
    • Shell
    • YAML
    • Pipelines
  3. Em prática (Gitlab CI)
  4. Em prática (Circle CI)

Introdução

Integração contínua & Entrega contínua

Integração Contínua

  1. Definição:
    • Grady Booch
      • UML
    • XP Programming
      • n vezes/dia
  2. Objetivo:
    • Evitar grandes desvios
      • merge hell
    • Identificar erros
      • Diminuí custo

Introdução

integração Contínua

  1. Desenv. & Teste Locais
    • Unitários
  2. "Commit" & Complia (CI)
  3. Executa testes em CI
    • Unitários
    • Integração
  4. Avisos & metricas
  5. Deploy de artefato de CI

Fluxo de trabalho

movimento Devops

Pré DevOps

  • Equipes (silos)
    • Desenv. feature
    • QA
    • Ops
    • Sustentação
  • Jogo da Culpa
    • Contra Ágil
  1.  

CI - Solução apenas para devs

Entrega Contínua

  1. Definição
  2. Aplicação:
    • Ciclo de vida
    • Implantável
    • Feedback
    • Sob demanda
  3. Necessário:
    • Colaboratividade
    • Automação
  4. Ganhos:
    • Tempo p/ Mercado
    • Paralelo com a engenharia

Geral

CI & CD

  1. TEEP
    • Tempo disponível
  2. OOE
    • Tempo de operação regular
  3. OEE
    • Tempo de funcionamento

Paralelo Com Engenharia

Fundamentos

Necessários

SHELL

  1. Instalar...
  2. Executar...
  3. Compilar...
  4. Configurar...
  5. Testar...
  6. Automatizar...
  7. Validar...
  8. Gerenciar um programa.

Que dirá sistemas, redes etc.

Bash, CMD, PWSH etc

YAML

  1. Configuar
  2. Automatizar
  3. Descrever

CI / CD

Kubernetes (tudo)

docker (docker compose)

IaC (AWS)

 

Linguagem de serialização de dados

Engenheiro de Yaml

--- # Comecei um documento yaml
chave: valor
estrutura:
  doisEspacos:
    - lista
    - item
    - objeto:
      depende:
        doObjeto: vai se estruturar #string são validas
        # Comentarios entre linhas
      estrura:
        - pode: variar
        - numero: 1
        - datas: 2020-12-12
--- # proximo documento
versao: 5
.ponteiro: &ponteiro
  conteudo: repetido
  
recurso: *ponteiro
--- !clarkevans.com/^invoice
invoice: 34843
date   : 2001-01-23
bill-to: &id001
   given  : Chris
   family : Dumars
   address:
      lines: |
            458 Walkman Dr.
            Suite #292
      city    : Royal Oak
      state   : MI
      postal  : 48046
ship-to: *id001
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
   - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
comments: >
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.

Pipelines

  1. Eventos
  2. Organização:
    • workflow
    • stage
    • jobs
      • steps
  3. Execução (serial, paralelo)
  4. Artefatos
    • Evento origem
    • Board
    • Metricas

Esteira de CI/CD

Em prática

Pipelines e configurações de CICD

GITlab ci

variables:
  DOCKER_TLS_CERTDIR: ''
  DOCKER_DRIVER: overlay2

cache:
  paths:
    - .m2/repository

stages:
  - test
  - build
  - deploy

.set_configs: &set_configs
  # Setup tools
  - apk add --no-cache maven curl jq

test:
  stage: test
  image: openjdk:8-jdk-alpine
  before_script:
    - apk add --no-cache maven
  script: |
    mvn clean package -Dmaven.test.skip=true
    mvn test

build:
  stage: build
  image: openjdk:8-jdk-alpine
  dependencies:
    - test
  artifacts:
    paths:
      - app.jar
  before_script: *set_configs
  script: |
    # Build jar with param
    mvn package \
      -Dmaven.test.skip=true
    cp target/*.jar app.jar
  only:
    - master

deploy:
  stage: deploy
  image: docker:19.03.0
  services:
    - name: docker:19.03.0-dind
  dependencies:
    - build
  before_script: *set_configs

  script:
    - docker info
    - docker --version
    - docker build --build-arg JAR_FILE=app.jar -t "felipefrocha89/springboot-api" .
    - docker tag "felipefrocha89/springboot-api:latest" "felipefrocha89/springboot-api:${CI_COMMIT_SHA:0:8}"
  after_script:
    - docker login -u felipefrocha89 -p $PASSWORD
    - docker push "felipefrocha89/springboot-api:${CI_COMMIT_SHA:0:8}"
    - docker push "felipefrocha89/springboot-api:latest"
  only:
    - master

www.gitlab.com

CircleCi

---
version: 2
jobs:
  test:
    docker:
      - image: circleci/openjdk:8u252-jdk
    working_directory: ~/sample-springboot-api
    steps:
      - checkout
      - restore_cache:
          keys:
          - sample-springboot-api-{{ checksum "pom.xml" }}

      - run: 
          name: Dependency check
          command: mvn dependency:go-offline

      - save_cache:
          paths:
            - ~/.m2
          key: sample-springboot-api-{{ checksum "pom.xml" }}
        
      # package into a jar
      - run:
          name: Test 
          command: | 
            mvn clean package -Dmaven.test.skip=true
            mvn test

  build_deploy:
    docker:
      - image: circleci/openjdk:8u252-jdk

    working_directory: ~/sample-springboot-api
    
    steps:
      # git pull
      - checkout

      - run:
          name: Login to DockerHub
          command: echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin

          # Download and cache dependencies
      - restore_cache:
          keys:
          - sample-springboot-api-{{ checksum "pom.xml" }}

      - run: mvn dependency:go-offline

      - save_cache:
          paths:
            - ~/.m2
          key: sample-springboot-api-{{ checksum "pom.xml" }}
        
      # package into a jar
      - run: 
          name: Build Skiping Test
          command: mvn clean package -Dmaven.test.skip=true

      # build and push docker image to docker hub
      - run:
          name: Maven Plugin Docker Image
          command:  mvn clean compile jib:build -Dimage=felipefrocha89/springboot-api:$CIRCLE_BUILD_NUM

      # store raw contents of src code
      - store_artifacts:
          path: target/classes
          destination: sample-springboot-api

workflows:
  version: 2
  test:
    jobs:
      - test:
          filters:
            branches:
              ignore:
                - master
  build_deploy:
    jobs:              
      - test
      - build_deploy:
          filters:
            branches:
              ignore:
                - /feature.*/
          requires:
            - test
          

www.circleci.com

Pipeline de infra

proposta de trabalho com Terraform

Proposta

Engenharia de Sistemas baseada em modelos (MBSE)

Fonte: https://sebokwiki.org/wiki/Model-Based_Systems_Engineering_(MBSE)

Princípios:

  1. Centrada
  2. Integração
  3. Reutilização 
  4. Rastreabilidade
  5. Comunicação e Colaboração

Proposta

Definição de projeto em Terraform

Text

REferências

Links uteis

Fontes

  1. https://microsoft.github.io/PartsUnlimited/pandp/200.1x-PandP-CICDQuickstartwithVSTS.html
  2. https://microsoft.github.io/PartsUnlimitedMRP/pandp/200.1x-PandP-LocustTest.html
  3. https://microsoft.github.io/PartsUnlimitedMRP/pandp/200.1x-PandP-PythonCI.html

  4. https://circleci.com/blog/tag/tutorials/

  5. https://docs.gitlab.com/ee/ci/

  6. https://martinfowler.com/articles/continuousIntegration.html

  7. https://martinfowler.com/bliki/ContinuousDelivery.html

  8. https://medium.com/faun/types-of-application-deployment-36772c0adf46

  9. https://opensource.com/article/17/5/colorful-deployments

  10. https://www.thoughtworks.com/continuous-integration

  11. https://www.thoughtworks.com/continuous-delivery

Links

Felipe F. Rocha

felipefonsecarocha@gmail.com

 

 

OBRIGADO!!!

CI e CD, uma breve introdução

By Felipe Fonseca Rocha

CI e CD, uma breve introdução

Este breve deck é sobre #CICD, passando apenas os conceitos básicos e ferramentas para seu integração dos seus repositórios pessoais. O foco apenas habilitar os interessados a começarem a automatizar seus repositórios pessoais.

  • 195