Continuous Integration

De TheNets Wiki
Ir para: navegação, pesquisa

https://gitlab.com/thenets/gdg_itajuba_ci

Principais tópicos

  • Ferramentas necessárias.
  • Vantagens (auto-deploy, pull request check, vulnerability check...).
  • Requisitos de uma aplicação para se usar CI (tests, container...).
  • O que é uma pipeline.
  • Criar um ambiente homogêneo.
  • Construir aplicação.
  • Executar testes.
  • Notificações (Slack, IRC, email...).
  • Integrações (Kubernetes, metrics, board...).
  • Rotinas agendadas.

Vantagens

  • Permite muitos merges por dia
  • Rotinas a cada commit
  • Testes de unidade (ou testes unitários)
  • Economia de tempo
  • Garantia que um commit não quebrou uma feature

Obrigações

  • Criar testes automatizados organizados
  • Manter as configurações da aplicação no repositório

Exemplos

  • Commit simples
  • Pull request: https://github.com/thenets/EasyCKAN/pull/28
  • Projeto com build contínuo: https://github.com/thenets/docker-parsoid
  • Notificação: https://github.com/thenets/docker-parsoid/blob/master/.travis.yml#L15-L22

Entrega contínua

  • Integração do GitLab com o Kubernetes
  • Utilizar a API de Rancher para integrar com qualquer CI

GitLab CI

GitLab + Docker build simples

Exemplo de CI básico que builda imagem Docker

.gitlab-ci.yml

image: docker:latest

services:
  - docker:dind

variables:
  DOCKER_DRIVER: overlay
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME

before_script:
  - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY

build:
  stage: build
  script:
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG

GitLab + Docker build + GitFlow

Exemplo de arquivo de configuração com integração com o padrão do GitFlow.

Separação entre builds de branchs comuns, branchs principais e releases.

.gitlab-ci.yml

 1 image: docker:latest
 2 
 3 services:
 4   - docker:dind
 5 
 6 variables:
 7   DOCKER_DRIVER: overlay
 8   
 9 stages:
10   - build
11 
12 # Build for common branchs.
13 # Follows branch name pattern: {issue,bug,patch,feature,hotfix}/*
14 # Branch name example: feature/413-new-checkout-ux
15 job-build-common-branchs:
16   before_script:
17     - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
18     - export ISSUE_TYPE=$(echo $CI_COMMIT_REF_NAME | cut -d'/' -f1)
19     - export ISSUE_ID=$(echo $(echo $CI_COMMIT_REF_NAME | cut -d'/' -f2) | cut -d'-' -f1)
20     - export IMAGE_TAG=${CI_REGISTRY_IMAGE}:${ISSUE_TYPE}-${ISSUE_ID}
21     - export IMAGE_TAG_LATEST=$CI_REGISTRY_IMAGE:latest
22   stage: build
23   script:
24     - docker build -t $IMAGE_TAG .
25     - docker push $IMAGE_TAG
26     - docker tag $IMAGE_TAG $IMAGE_TAG_LATEST
27     - docker push $IMAGE_TAG_LATEST
28   only:
29     - /^issue\/.*$/
30     - /^bug\/.*$/
31     - /^patch\/.*$/
32     - /^feature\/.*$/
33     - /^hotfix\/.*$/
34     
35 # Build for main branchs
36 job-build-main-branchs:
37   before_script:
38     - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
39     - export IMAGE_TAG=${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}
40     - export IMAGE_TAG_LATEST=$CI_REGISTRY_IMAGE:latest
41   stage: build
42   script:
43     - docker build -t $IMAGE_TAG .
44     - docker push $IMAGE_TAG
45     - docker tag $IMAGE_TAG $IMAGE_TAG_LATEST
46     - docker push $IMAGE_TAG_LATEST
47   only:
48     - master
49     - develop
50     - beta
51 
52 # Build for release tags
53 # Tag pattern most start with 'v*'.
54 # Tag name example: 'v1.3.4'
55 job-build-release:
56   before_script:
57     - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
58     - export IMAGE_TAG=${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}
59     - export IMAGE_TAG_LATEST=$CI_REGISTRY_IMAGE:latest
60   stage: build
61   script:
62     - docker build -t $IMAGE_TAG .
63     - docker push $IMAGE_TAG
64     - docker tag $IMAGE_TAG $IMAGE_TAG_LATEST
65     - docker push $IMAGE_TAG_LATEST
66   only:
67     - /^v.*$/