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

Gitlab pipelines corriendo
