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:
master
y develop
.master
tiene el código que está publicado en el ambiente de produccióndevelop
tiene el código que está publicado en el ambiente de desarrolloDuration 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
.
Una vez refrescada la lista de proyectos, se debe presionar el botón de ACTIVATE
en el nombre del proyecto a activar.
Esto nos mostrará una pantalla de configuración y en esta se debe presionar el botón de ACTIVATE REPOSITORY
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.
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
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