Gitlab pipelines para proyectos en Python

Que son los pipelines de Gitlab?

Hace un tiempo Gitlab lanzó herramientas de Continuous Integration and Continuous Development (CI/CD), permitiéndote generar flujos de trabajo (pipeline) en donde al hacer un commit o hacer un merge puedes hacer que se ejecuten pruebas automáticas y/o se realice un despliegue en servidores de de stage o producción.

Configuración

Gitlab te permite definir una imagen base de docker bajo la cual se ejecuta el pipeline

image: python:2.7  

También puedes definir variables si requires alguna para usarlas en pipeline.

variables:  
  POSTGRES_DB: ${POSTGRES_DB}
  POSTGRES_USER: ${POSTGRES_USER}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

Definición de los pasos del pipeline. Para este ejemplo usamos solo dos etapas:

  • test
  • deploy

Para esto definimos en el yml de gitlab

stages:  
  - test
  - deploy

Finalmente definimos los jobs para cada una de las etapas. Aqui podemos definir sí estos jobs se deben ejecutar sobre una rama especifica o si debe hacerse para todas las ramas.

Habilitando pruebas para todas las ramas

Puedes definir un job para ejecutar las pruebas en todas las ramas siguiendo el siguiente ejemplo. También puedes definir artefactos que se generan al ejecutar la prueba y puedes inspeccionar cuando la prueba termine.

tests:  
  stage: test # <--- Stage en donde se ejecuta el job 
  script:     # <--- Scripts del job 
    - cd project
    - pip install -r requirements.txt
    - pytest --cov=. --cov-report term-missing 
    - coverage-badge -o coverage.svg -f
    - flake8
  coverage: '/TOTAL.+ ([0-9]{1,3}%)/' # <--- Obtener el porcentaje de cubrimiento de pruebas 
  artifacts:
    paths:
    - project/coverage.svg
    expire_in: 4 weeks

Habilitando deploy para servidores pruebas y producción

Deploy en pruebas
beta:  
  stage: deploy
  dependencies:
    - tests
  script:
    - cd project
    - pip install Fabric==1.13.1
    - fab beta deploy
  environment:
    name: beta
    url: https://beta.myproject.com
  only:
    - develop # <--- Rama seleccionada para correr este job

El ejemplo anterior permite desplegar cambios de forma automatizada en el entorno de pruebas. En este ejemplo uso Fabric para definir scripts para ejecutar el despliegue.

Deploy en producción
production:  
  stage: deploy
  dependencies:
    - tests
  script:
    - cd project
    - pip install Fabric==1.13.1
    - fab production deploy
  environment:
    name: production
    url: https://myproject.com
  only:
    - master

En este último ejemplo se despliega nueva versión en producción cuando se realice un commit a master

Ejemplo completo

image: python:2.7

variables:  
  POSTGRES_DB: ${POSTGRES_DB}
  POSTGRES_USER: ${POSTGRES_USER}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

# Setting ssh keys for deploy from a new docker instance. Important! only use inside docker.
before_script:  
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "${SSH_PRIVATE_KEY}" | ssh-add -
- mkdir -p ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config

stages:  
  - test
  - deploy

tests:  
  stage: test
  script:
    - cd project
    - pip install -r requirements.txt
    - pytest --cov=. --cov-report term-missing 
    - coverage-badge -o coverage.svg -f
    - flake8
  coverage: '/TOTAL.+ ([0-9]{1,3}%)/'
  artifacts:
    paths:
    - project/coverage.svg
    expire_in: 4 weeks

beta:  
  stage: deploy
  dependencies:
    - tests
  script:
    - cd project
    - pip install Fabric==1.13.1
    - fab beta deploy
  environment:
    name: beta
    url: https://beta.myproject.com
  only:
    - develop

production:  
  stage: deploy
  dependencies:
    - tests
  script:
    - cd project
    - pip install Fabric==1.13.1
    - fab production deploy
  environment:
    name: production
    url: https://myproject.com
  only:
    - master

Review Gitlab pipelines

GitHubLogo

Gitlab pipelines corriendo

GitHubLogo

Carlos Martinez

Read more posts by this author.