Meetup

DevOpsCore

Assembly Lines

#meetupnaindra

2019

Introdução

Disclaimers / Avisos

  • Áudio/Vídeo
  • Falaremos sobre Pipelines
  • Este é o resultado de um estudo
  • Aceitamos feedback

Acompanhe esta apresentação

  • https://slides.com/eguimaraess/assembly-lines

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...

Assembly Lines
for DevOps

(teoria)

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

Características

  • Pipeline de Pipelines (workflow)
  • As Pipelines compartilham informações e estado entre elas
  • Cada Pipeline (ou parte dela) pode ser mantida por uma equipe
  • As Pipelines são para todos (não apenas desenvolvedores)
  • Tudo é código
  • Event-driven
  • Filosofia Unix

Pipelines

  • Ponto-a-ponto
  • Tem 1 dono

Assembly Lines

  • Workflow
  • Múltiplos donos

Mas... Isso não é um ARA*?

Diferença:

  • Apesar de complexo, o ARA tem um fluxo linear.

*  Application Release Automation

Objetivo

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

Antes das Demos...

A Evolução das Pipelines

Senta que lá vem história...

Indústria Automobilística

Indústria

  • Manual
  • Partly Automated
  • Assembly Lines

DevOps

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

CI Simples

Build - Test - Push

Código

---
stages:
  - CI

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

Demo

CI com Estágios

Test

Build

Push

Código

---
image: docker:1.11

stages:
  - Build
  - Test
  - Push

docker:build:
  stage: Build
  services:
    - docker:dind
  script:
    - docker build -t registry.gitlab.com/meetup-assembly-lines/02-demo-ci-stages:temp .
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push registry.gitlab.com/meetup-assembly-lines/02-demo-ci-stages:temp

npm:test:
  stage: Test
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/meetup-assembly-lines/02-demo-ci-stages: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/meetup-assembly-lines/02-demo-ci-stages:temp
    - docker tag registry.gitlab.com/meetup-assembly-lines/02-demo-ci-stages:temp registry.gitlab.com/meetup-assembly-lines/02-demo-ci-stages
    - docker push registry.gitlab.com/meetup-assembly-lines/02-demo-ci-stages

Demo

CI com Estágios Paralelos

Test

Build

Push

Código

---
image: docker:1.11

stages:
  - Build
  - Test
  - Push

Docker Build:
  stage: Build
  services:
    - docker:dind
  script:
    - docker build -t registry.gitlab.com/meetup-assembly-lines/03-demo-ci-parallel:temp .
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push registry.gitlab.com/meetup-assembly-lines/03-demo-ci-parallel:temp

Image 1:
  stage: Test
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/meetup-assembly-lines/01-demo-ci npm test

Image 2:
  stage: Test
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/meetup-assembly-lines/02-demo-ci-stages npm test

Image 3:
  stage: Test
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/meetup-assembly-lines/03-demo-ci-parallel: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/meetup-assembly-lines/03-demo-ci-parallel:temp
    - docker tag registry.gitlab.com/meetup-assembly-lines/03-demo-ci-parallel:temp registry.gitlab.com/meetup-assembly-lines/03-demo-ci-parallel
    - docker push registry.gitlab.com/meetup-assembly-lines/03-demo-ci-parallel

Demo

CD com Decisão

Test

Build

Push

Deploy

Código

---
stages:
  - Build
  - Test
  - Push
  - Deploy:Staging
  - Deploy:Production

Docker Build:
  stage: Build
  image: docker:1.11
  services:
    - docker:dind
  script:
    - docker build -t registry.gitlab.com/meetup-assembly-lines/04-demo-cd-decision:temp .
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker push registry.gitlab.com/meetup-assembly-lines/04-demo-cd-decision:temp

Image 1:
  stage: Test
  image: docker:1.11
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/meetup-assembly-lines/01-demo-ci npm test

Image 2:
  stage: Test
  image: docker:1.11
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/meetup-assembly-lines/02-demo-ci-stages npm test

Image 3:
  stage: Test
  image: docker:1.11
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/meetup-assembly-lines/03-demo-ci-parallel npm test

Image 4:
  stage: Test
  image: docker:1.11
  services:
    - docker:dind
  script:
    - docker run --rm registry.gitlab.com/meetup-assembly-lines/04-demo-cd-decision:temp npm test

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/meetup-assembly-lines/04-demo-cd-decision:temp
    - docker tag registry.gitlab.com/meetup-assembly-lines/04-demo-cd-decision:temp registry.gitlab.com/meetup-assembly-lines/04-demo-cd-decision
    - docker push registry.gitlab.com/meetup-assembly-lines/04-demo-cd-decision

Deploy to Staging:
  stage: Deploy:Staging
  retry: 2
  script:
    - echo "Loading config..."
    - echo sleep 5
    - echo "Deploying to awesome [Staging] server... "
    - echo sleep 7
    - echo "OK - End of deploy"

Deploy to Production:
  stage: Deploy:Production
  when: manual
  retry: 2
  script:
    - echo "Loading config..."
    - echo sleep 5
    - echo "Deploying to awesome [Production] server... "
    - echo sleep 7
    - echo "OK - End of deploy"

Demo

Cenários Complexos

Problemas

  • A equipe de Ops 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?

Tentando resolver os problemas...

Assembly Lines
for DevOps

(prática)

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 Suco precisa dos resources Suco de Limão e Açúcar, e entrega Suco Adoçado
     
  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 Espremedor e Limão Cortado, e entrega Suco de Limão

Adoçar Suco

Cortar Limões

Espremer Limões

Suco de Limão

Açúcar

Limão

Suco Adoçado

Limão Cortado

Espremedor

Limão Cortado

Suco de Limão

Exemplo

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

Adoçar Suco

Cortar Limões

Espremer Limões

Açúcar

Limão

Suco Adoçado

Limão Cortado

Espremedor

Suco de Limão

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

Funcionalidades Necessárias

  1. Integração entre ferramentas
  2. Habilidade de passar informações entre pipelines
  3. Gatilhos automáticos ou manuais
  4. Funções de automação de release
  5. Funções de auditoria
  6. Roles e permissões
  7. Métricas e visibilidade das Assembly Lines
  8. Workflow as Code

Demo

Referências

Esta Apresentação

Contatos

DevOps Diagram Generator

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

Repositórios

  • https://gitlab.com/meetup-assembly-lines/01-demo-ci
  • https://gitlab.com/meetup-assembly-lines/02-demo-ci-stages
  • https://gitlab.com/meetup-assembly-lines/03-demo-ci-parallel
  • https://gitlab.com/meetup-assembly-lines/04-demo-cd-decision
     
  • https://github.com/fewbits/meetup-app-dev
  • https://github.com/fewbits/meetup-app-test
  • https://github.com/fewbits/meetup-app-sec
  • https://github.com/fewbits/meetup-app-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