El yaml de drone

Entendiendo la configuración de drone

Tue, 14 Jul 2020

iver.mx

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):

Loading...
Iván Jaimes

Iván Jaimes Padre, esposo y desarrollador de software. Programa en go y elixir (por gusto), js (por necesidad) y shell (por diversión).