Continuous Deployment flexível com Assembly Lines for DevOps

#QConSP

A pipeline de pipelines

Introdução

Agenda

  1. A Evolução das Pipelines
  2. Assembly Lines for DevOps
  3. Demonstração

Acompanhe esta apresentação

  • https://slides.com/eguimaraess/qconsp

Sobre Mim

  • Eric Guimarães
  • Formação em Banco de Dados
  • Linux há 13 anos
  • Infraestrutura há 9 anos
  • Na Indra há 6 anos
  • DevOps há 3 anos

Vamos começar...

O Que São
Assembly Lines?

Definição

Linha de montagem

Pode ser entendida como uma forma de produção em série; ocorre quando um estabelecimento industrial com o auxílio de máquinas transformam as matérias-primas e produtos semi-acabados em produtos acabados destinados ao consumo. (Wikipédia)

Em DevOps...

  • DevOps Assembly Lines
  • Assembly Lines for DevOps

Pipeline de Pipelines

A Evolução das Pipelines

Senta que lá vem história...

Indústria Automobilística

Indústria

  • Manual
  • Partly Automated
  • Assembly Lines

Pipelines

  • Sem CI
  • CI/CD com etapas manuais
  • Assembly Lines for DevOps

CI Simples

Build - Test - Push

Exemplo (Gitlab CI)

---
stages:
  - CI

ci:
  stage: CI
  image: docker:1.11
  services:
    - docker:dind
  script:
    # Build
    - docker build -t registry.gitlab.com/fewbits/pipeline-samples .
    # Test
    - docker run --rm registry.gitlab.com/fewbits/pipeline-samples npm test
    # Push
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push registry.gitlab.com/fewbits/pipeline-samples

CI com Estágios

Test

Build

Push

Exemplo (Gitlab CI)

---
image: docker:1.11

stages:
  - Build
  - Test
  - Push

docker:build:
  stage: Build
  services:
    - docker:dind
  script:
    - docker build -t registry.gitlab.com/fewbits/pipeline-samples:temp .
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push registry.gitlab.com/fewbits/pipeline-samples:temp

npm:test:
  stage: Test
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/fewbits/pipeline-samples:temp npm test

docker:push:
  stage: Push
  services:
    - docker:dind
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker pull registry.gitlab.com/fewbits/pipeline-samples:temp
    - docker tag registry.gitlab.com/fewbits/pipeline-samples:temp registry.gitlab.com/fewbits/pipeline-samples
    - docker push registry.gitlab.com/fewbits/pipeline-samples

CI com Estágios Paralelos

Test

Build

Push

Exemplo (Gitlab CI)

---
image: docker:1.11

stages:
  - Build
  - Test
  - Push

Docker Build:
  stage: Build
  services:
    - docker:dind
  script:
    - docker build -t registry.gitlab.com/fewbits/pipeline-samples:temp .
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push registry.gitlab.com/fewbits/pipeline-samples:temp

Image 1:
  stage: Test
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/fewbits/pipeline-samples:temp npm test

Image 2:
  stage: Test
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/fewbits/pipeline-samples:temp npm test

Image 3:
  stage: Test
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/fewbits/pipeline-samples:temp npm test

Docker Push:
  stage: Push
  services:
    - docker:dind
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker pull registry.gitlab.com/fewbits/pipeline-samples:temp
    - docker tag registry.gitlab.com/fewbits/pipeline-samples:temp registry.gitlab.com/fewbits/pipeline-samples
    - docker push registry.gitlab.com/fewbits/pipeline-samples

CD com Decisão

Test

Build

Push

Deploy

Something else

Exemplo (Gitlab CI)

---
stages:
  - Build
  - Test
  - Escalate
  - Push
  - Deploy

Docker Build:
  stage: Build
  image: docker:1.11
  services:
    - docker:dind
  script:
    - docker build -t registry.gitlab.com/fewbits/pipeline-samples:temp .
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push registry.gitlab.com/fewbits/pipeline-samples:temp

Test:
  stage: Test
  image: docker:1.11
  script:
    - echo "Flipping a coin - If 0 => OK / If 1 => Error"
    - coin=`shuf -n1 -i0-1`
    - echo "Coin is => $coin"
    - exit $coin

Asking for Help:
  stage: Escalate
  image: docker:1.11
  when: on_failure
  script:
    - echo "We have an error!!!"
    - echo "Calling someone to help us..."

Docker Push:
  stage: Push
  image: docker:1.11
  services:
    - docker:dind
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker pull registry.gitlab.com/fewbits/pipeline-samples:temp
    - docker tag registry.gitlab.com/fewbits/pipeline-samples:temp registry.gitlab.com/fewbits/pipeline-samples
    - docker push registry.gitlab.com/fewbits/pipeline-samples

Deploy:
  stage: Deploy
  image: docker:1.11
  retry: 2
  script:
    - echo "Loading config..."
    - echo sleep 5
    - echo "Deploying to server... "
    - echo sleep 7
    - echo "OK - End of deploy"

Cenários Complexos

Problemas

  • A equipe de Operações altera um script de IaC e quer reconstruir os ambientes
  • A equipe de Testes, sabendo disso, quer um novo deploy para testar o ambiente
  • A equipe de Segurança criou uma nova imagem base para a empresa, e agora todos têm que utilizá-la

Dúvidas

  • Tudo no mesmo repositório?
  • Mesma pipeline?
  • Quantas pipelines?
  • Quem faz o quê?
  • Como as equipes interagem?
  • Como ter a visão do "todo" e não ficar perdido?

Percebendo os problemas...

Tentando resolver...

Assembly Lines
for DevOps

Características

  • Workflow (pipeline de pipelines)
  • Conecta diferentes Ilhas de Automação
  • Cada parte da Assembly Line pode ser mantida por uma equipe
  • Os objetos compartilham informações e estado
  • Orientado a eventos
  • Visualização unificada
  • Tudo "As Code"
  • Filosofia Unix
  • Pipelines para todos

Pipelines

  • Ponto-a-ponto
  • Tem 1 dono

Assembly Lines

  • Workflow
  • Múltiplos donos

Objetivo

  • O quê: Continuous Deployment
  • Como: Unindo e orquestrando diferentes Ilhas de Automação

Build

Staging

Production

Continuous Delivery

Continuous Integration

Continuous Deployment

Resources

  • Credenciais
  • Integrações
  • Repositórios
  • Clusters
  • Imagens
  • Parâmetros
  • Etc...

Jobs

  • Criar servidor
  • Fazer build
  • Atualizar DNS
  • Deletar arquivos
  • Fazer testes
  • Atualizar pacotes
  • Etc...

Exemplo

  1. O job Adoçar precisa dos resources Suco do Limão e Açúcar, e entrega Limonada
     
  2. O job Cortar Limões precisa do resource Limão, e entrega Limão Cortado
     
  3. O job Espremer Limões precisa dos resources Limão Cortado e Espremedor, e entrega Suco do Limão

Adoçar

Cortar Limões

Espremer Limões

Suco do Limão

Açúcar

Limão

Limonada

Limão Cortado

Limão cortado

Espremedor

Suco do Limão

Limonada!

Exemplo

  • O workflow (Assembly Line) é definido dinamicamente, de acordo com as necessidades de cada objeto (resources e jobs).

Adoçar

Cortar Limões

Espremer Limões

Açúcar

Limão

Limonada

Limão Cortado

Espremedor

Suco do Limão

Os Resources e os Jobs podem estar espalhados entre diversos repositórios diferentes.

Funcionalidades Necessárias

  • Integração entre ferramentas
  • Gatilhos automáticos ou manuais
  • Roles e permissões
  • Funções de auditoria
  • Workflow as Code
  • Habilidade de compartilhar estado e informações entre pipelines
  • Métricas e visibilidade das Assembly Lines

Demonstração

Cenário

Projetos

Repositórios

Dev

Ops

Test

Sec

Equipes

Website

Web App

qconsp-dev-site

qconsp-dev-app

qconsp-test

qconsp-sec

qconsp-ops

Ferramentas

Demo Time!

Roteiro

  1. Os Projetos
  2. Assembly Line
  3. Commit
  4. Jobs e Resources
  5. Sec!
  6. Dependências
  7. Repos e Objetos
  8. shippable.yml
  9. Sec!²

Considerações

  • Ser organizado é importante
  • Ter cuidado é importante
  • Soluções OpenSource
  • Tendência

Referências

Esta Apresentação

Contatos

DevOps Diagram Generator

  • https://slides.com/eguimaraess/qconsp
  • eguimaraess@indracompany.com
  • linkedin.com/in/lowbit
  • https://xebialabs.com/devops-diagram-generator

Repositórios

  • https://gitlab.com/fewbits/pipeline-samples
    (diferentes branches)

Pipelines

Assembly Line

  • https://github.com/fewbits/qconsp-dev-site
  • https://github.com/fewbits/qconsp-dev-app
  • https://github.com/fewbits/qconsp-test
  • https://github.com/fewbits/qconsp-sec
  • https://github.com/fewbits/qconsp-ops

Artigos

  • https://devops.com/differentiating-ci-pipelines-devops-assembly-lines/
  • https://www.shippable.com/devops-assembly-lines.html
  • https://github.com/vfarcic/vfarcic.github.io/blob/master/articles/devops-assembly-line.md
  • https://hackernoon.com/8-devops-trends-to-be-aware-of-in-2019-b4232ac8f351

Obrigado!

Made with Slides.com