Este codelabs está planeado para ver la forma de habilitar el CI/CD con DroneCI.

En CONACyT se usa DroneCI para tener un ciclo completo de integración y despliegue continuo.

Para poder habilitar DroneCI, el proyecto a habilitar debe cumplir con lo siguiente:

  1. Debe estar en el Gitlab de la crip.
  2. El proyecto no puede estar dentro de un subgrupo.
  3. Si se requiere despliegue continuo:
    • Debe tener al menos dos branches: master y develop.
    • El branch master tiene el código que está publicado en el ambiente de producción
    • El branch develop tiene el código que está publicado en el ambiente de desarrollo
    • En caso de existir, el código publicado en el ambiente de pruebas debe venir de un branch de tipo release

Duration 2

Para poder habilitar el proyecto en el DroneCI de la crip, es necesario ir a la dirección sitio de DroneCI.

Si es la primera vez que se accede a DroneCI o el proyecto requerido no aparece en la lista, es necesario presionar el botón SYNC.

img01

Una vez refrescada la lista de proyectos, se debe presionar el botón de ACTIVATE en el nombre del proyecto a activar.

img01

Esto nos mostrará una pantalla de configuración y en esta se debe presionar el botón de ACTIVATE REPOSITORY

img01

Para que DroneCI pueda ejecutar un pipeline en el proyecto deseado, es necesario agregar un archivo en la raíz del mismo llamado .drone.yml.

Se recomienda revisar la especificación de pipelines de DroneCI con Docker, sin embargo a continuación se muestra un ejemplo básico:

kind: pipeline
type: docker
name: default

steps:
- name: compile
  image: maven:3.6-jdk-11
  commands:
    - mvn clean package
  when:
    branch:
      exclude:
      - master

- name: compile master
  image: maven:3.6-jdk-11
  commands:
    - mvn clean verify -Pprod
  when:
    branch:
      include:
        - master

DroneCI dispone de varias variables de ambiente predefinidas (ver la lista de variables predefinidas DroneCI).

Las variables de ambiente se puede usar de la siguiente forma:

kind: pipeline
type: docker
name: default

steps:
- name: info
  image: maven:3.6-jdk-11
  commands:
    - echo $DRONE_BRANCH
    - echo ${DRONE_BRANCH}
    - echo $${DRONE_BRANCH}

DroneCI proporciona el uso de secrets para proporcionar información al pipeline en tiempo de ejecución.

Los secrets se pueden usar directamente, si es que la imagen lo soporta, como se muestra en el siguiente ejemplo:

steps:
- name: slack
  image: plugins/slack
  settings:
    webhook:
      from_secret: slack_webhook
    channel: dev

Por otro lado, en caso de que la imagen utilizada no soporte el uso de secret de forma directa, también es posible usarlos como variables de ambiente:

steps:
- name: login
  commands:
    - docker login -u $USERNAME -p $PASSWORD
  environment:
    PASSWORD:
      from_secret: password
    USERNAME:
      from_secret: username

En cualquiera de los casos, el secret se define en la página de configuración del proyecto.

En la crip se dispone de un registry de docker privado (Harbor), para poder publicar una imagen en el registry se requiere que un administrador de DroneCI agregue los secrets registry_username y registry_password y por otro lado, que se defina el repositorio a utilizar para el proyecto.

La generación de la imagen dependerá del proyecto.

Usando el plugin de drone

Si la imagen del proyecto se puede generar usando docker directamente, el step para generar la imagen podría ser como el siguiente:

steps:
- name: docker publish
  image: plugins/docker
  settings:
    username:
        from_secret: docker_username
    password:
        from_secret: docker_password
    repo: registry.crip.conacyt.mx/[grupo]/[nombre-proyecto]
    registry: registry.crip.conacyt.mx

Usando el plugin jib para maven

Si el proyecto es un generado por JHipster, el proyecto ya tiene configurada el plungin para generar la imagen docker desde que se creó. Sin embargo, se requiere hacer un cambio en el pom para indicarle que se usa un registry privado con un nombre específico.

En el pom del proyecto el plugin com.google.cloud.tools:jib-maven-plugin tiene la definición de la imagen de la siguiente forma:

  <to>
      <image>demoms:latest</image>
  </to>

Y se debe dejar de la siguiente manera:

  <to>
    <image>registry.crip.conacyt.mx/[grupo]/[nombre-proyecto]:${project.version}</image>
    <auth>
        <username>${env.REGISTRY_USERNAME}</username>
        <password>${env.REGISTRY_PASSWORD}</password>
    </auth>
  </to>

Por otro lado, el step para genera la imagen docker queda de la siguiente forma:

steps:
  - name: docker_publish
    image: maven:3.6-jdk-11
    volumes:
      - name: docker_sock
        path: /var/run/docker.sock
    commands:
      - mvn clean -Pprod verify jib:build -Djib.to.tags=latest
    environment:
      REGISTRY_USERNAME:
        from_secret: registry_username
      REGISTRY_PASSWORD:
        from_secret: registry_password

volumes:
  - name: docker_sock
    host:
      path: /var/run/docker.sock

El redespliegue dependerá mucho de la infraestructura en que se tenga desplegada la aplicación. La comunidad de DroneCI ha creado varios plugins para poder realizar despliegues y cada uno tiene una configuración específica.

El siguient es solo un ejemplo usando plugins/webhook para informarle a Portainer que debe redesplegar un contenedor.

steps:
  - name: redeploy_container
    image: plugins/webhook
    settings:
      urls:
        from_secret: portainer_webhook_url