Integración Continua

Como sistemas de integración continua se han usado TravisCI y CircleCI.

TravisCI

El sistema de Travis se configura únicamente con un archivo .travis.yml que debe estar ubicado en la raiz de nuestro proyecto. Este archivo contiene la siguiente información:

language: python
python:
  - "3.5"
  - "3.6"
  - "3.7"
  - "3.8"
  - "3.8-dev"
before_install:
  - make pm2
install:
  - make
script:
  - make tests
  - make start
  - make delete
after_success:
  - make coverage

Simplemente le definimos el lenguaje de programación que vamos a usar, junto con las distintas versiones del mismo con las que vamos a testear nuestra aplicación. Luego, antes de instalar las dependencias de nuestro proyecto, es necesario instalar npm y el paquete pm2 del mismo, y para ello hay que usar la regla before_install.

Una vez hecho esto, para ejecutar nuestra herramienta de construcción en el entorno que nos da travis primero debemos usar make para instalar las dependencias del proyecto en cuanto a librerias de python, en la regla install. Luego tan solo necesitamos escribir las reglas de nuestra herramienta de construcción para pasar tests, arrancar y parar el microservicio. Por lo tanto, en la directiva script solo debemos ejecutar make tests, make start y make delete.

Si todo ha ido bien, usando la directiva after_success se ejecutará make coverage para mandar los reportes generados en la ejecución de los tests a la plataforma codecov.io.

CircleCI

Para CircleCI la configuración es bastante similar. En este caso el archivo de configuración pasa a llamarse config.yml y hay que ubircarlo en un directorio .circleci en la raiz de nuestro proyecto. El archivo config.yml contiene lo siguiente:

version: 2
workflows:
  version: 2
  test:
    jobs:
      - python-3.5
      - python-3.6
      - python-3.7
      - python-3.8
jobs:
  python-3.5: &build-template # Definimos una base de ejecución
    docker:
      - image: circleci/python:3.5
    steps:
      # Obtenemos codigo del repo
      - checkout
      # Entorno virtual y dependencias
      - run:
          name: Entorno y dependencias
          command: |
            make pm2
            make
      # Ejecucion de los tests
      - run:
          name: Ejecutar tests
          command: |
            make tests
      # Actualiza codecov
      - run:
          name: Coverage
          command: |
            make coverage
      # Arranca el microservicio
      - run:
          name: Arranque
          command: |
            make start
      # Para y borra el microservicio
      - run:
          name: Parada
          command: |
            make delete

  python-3.6:
    <<: *build-template
    docker:
      - image: circleci/python:3.6
  python-3.7:
    <<: *build-template
    docker:
      - image: circleci/python:3.7
  python-3.8:
    <<: *build-template
    docker:
      - image: circleci/python:3.8

En este caso, aunque la configuración es menos trivial que con Travis, ya que por ejemplo para indicar la versión de python específica que queremos debemos buscar cual es la imagen de docker que contiene exactamente la versión que queremos. Aun asi, realmente es bastante intuitivo, permitiendo múltiples configuraciones y posibilidades.