Entendiendo la configuración de drone

  • 1251 - palabras
  • Publicado por Ivan Jaimes
  • 13 min

Drone es una plataforma de integración continua de autoservicio. Exploremos el YAML.

Contenido de este artículo

Al igual que muchas otras herramientas de integración continua, Drone busca un archivo de configuración por defecto llamado .drone.yml en su repositorio para determinar cómo debe manejar el código.

En las versiones más recientes >= 1.6.5 se puede configurar el nombre del archivo en la sección de settings.

iver.mx

El archivo YAML

El archivo YAML define una tubería. Una tubería (pipeline) es un proceso de integración continua que ejecuta múltiples pasos, uno tras otro. Un archivo de configuración común puede ser el siguiente:

kind: pipeline name: default services: - name: redis image: redis:latest ports: - 6379 steps: - name: backend image: golang:1.11 commands: - go build - go test -v - name: frontend image: node commands: - npm install - npm run test - npm run lint

En el ejemplo se puede observar que el tipo de configuración es una tubería (pipeline) y que es la que por defecto se ejecuta. El nombre identifica la ejecución de la tubería, por lo que a veces es útil poner algo como:

kind: pipeline name: golang-1.11 .. ... kind: pipeline name: golang-1.14

En la siguiente sección del archivo se define una imagen de redis que se empleara como un servicio en el proceso de ejecución de todos los pasos (estará disponible hasta que se termine el último paso) y se publica en el puerto 6379.

services: - name: redis image: redis:latest ports: - 6379

Por último se encuentra la definición de los pasos a ejecutar, de manera regular se ejecutan en secuencia. Opcionalmente, se puede usar la clave depends_on para describir los pasos de compilación como un gráfico acíclico dirigido.

kind: pipeline name: default steps: - name: backend image: golang commands: - go build - go test - name: frontend image: node commands: - npm install - npm test - name: notify image: plugins/slack settings: webhook: from_secret: webhook depends_on: - backend - frontend

Los pasos (Steps)

Los pasos de la tubería se definen como una serie de comandos de shell.

Las imágenes (Images)

Los pasos de la tubería se definen como una serie de contenedores Docker. Por lo tanto, cada paso debe definir la imagen de Docker utilizada para crear el contenedor.

kind: pipeline type: docker name: default steps: - name: build image: golang:1.12 commands: - go build - go test

Drone admite cualquier imagen Docker válida de cualquier registro Docker:

image: golang image: golang:1.7 image: library/golang:1.7 image: index.docker.io/library/golang image: index.docker.io/library/golang:1.7 image: docker.company.com/golang

Obteniendo las imágenes

Si la imagen no existe en el caché local, Drone le indica a Docker que extraiga la imagen automáticamente.

Nunca se necesitará extraer imágenes manualmente. Si la imagen está etiquetada con: último, ya sea explícita o implícitamente, Drone intenta extraer la versión más reciente de la imagen del registro remoto, incluso si la imagen existe en el caché local.

Para extraer solo la imagen si no se encuentra en el caché local:

steps: - name: build pull: if-not-exists image: golang

Las opciones de pull disponibles son:

  • if-not-exists Si no se encuentra en el caché local
  • always Siempre obtener la versión más reciente
  • never Siempre usar la versión del caché local

Los comandos (Commands)

Los comandos se ejecutan dentro del directorio raíz del repositorio git. La raíz del repositorio git, también llamado espacio de trabajo (workspace), es compartida por todos los pasos en la tubería. Esto permite que los artefactos persistan entre los pasos.

En el ejemplo anterior, el paso de backend se convierte en el siguiente script:

#!/bin/sh set -e set -x go build go test

El script de shell anterior se ejecuta como el punto de entrada (entrypoint) de docker. El siguiente comando docker es un ejemplo (incompleto) de cómo se ejecuta el script:

$ docker run --entrypoint=build.sh golang

El código de salida del contenedor se usa para determinar si el paso está pasando o no. Si un comando devuelve un código de salida distinto de cero, el paso se marca como erróneo.

Las variables de entorno (Environment)

La sección de entorno proporciona la capacidad de definir variables de entorno en el ámbito de los pasos de tuberías de manera individual.

steps: - name: backend image: golang environment: GOOS: linux GOARCH: amd64 commands: - go build - go test

Los complementos (Plugins)

Los plugins son contenedores acoplables que encapsulan comandos y se pueden compartir y reutilizar en las tuberías (pipelines). Los ejemplos de complementos incluyen el envío de notificaciones de Slack, la creación y publicación de imágenes de Docker y la carga de artefactos en S3. Existe un repositorio de los complementos disponibles para drone.

- name: notify image: plugins/slack environment: SLACK_WEBHOOK: from_secret: slack_webhook_url settings: channel: git link_names: true when: status: - success - failure

Las condiciones (Conditions)

When

La sección when proporciona la capacidad de limitar condicionalmente la ejecución de pasos en tiempo de ejecución. El siguiente ejemplo limita la ejecución de pasos por rama, sin embargo, puede limitar la ejecución por evento, referencia, estado y más.

steps: - name: backend image: golang commands: - go build - go test when: branch: - master

Se puede usar la condición de estado para anular el comportamiento predeterminado del tiempo de ejecución y ejecutar pasos incluso cuando el estado de la tubería sea un error:

- name: notify image: plugins/slack settings: webhook: https://hooks.slack.com/services/... when: status: - failure - success

Failure

El atributo de falla permite personalizar cómo el sistema maneja la falla de un paso individual. Esto puede ser útil si se desea permitir que un paso falle sin fallar la tubería en general.

steps: - name: backend image: golang failure: ignore commands: - go build - go test

Detach

El atributo detach permite ejecutar el paso de la tubería en segundo plano. La ejecución comienza el paso, se separa (detach) y se ejecuta en segundo plano, e inmediatamente pasa al siguiente paso. El caso de uso de destino para esta función es iniciar un servicio o demonio, y luego ejecutar pruebas unitarias contra el servicio en pasos posteriores.

Se debe tener en cuenta que un paso separado no puede fallar la tubería. La ejecución puede ignorar el código de salida.

Privileged Mode

El atributo privileged ejecuta el contenedor con privilegios escalados. Esto es equivalente a ejecutar un contenedor con el indicador --privileged.

steps: - name: backend image: golang privileged: true commands: - go build - go test - go run main.go -http=:3000

Esta opción solo está disponible para repositorios de confianza. El modo privilegiado efectivamente otorga acceso de root al contenedor la máquina host.

Referencias

Todo lo anterior se puede encontrar en la documentación de drone (en inglés):