Cristian Gutierrez/Usar Drone CI/CD con Traefik en NixOS

Created Fri, 15 Jan 2021 00:19:14 +0200 Modified Fri, 05 Aug 2022 18:10:10 +0000
615 Words Reading time 3 min

En este post vamos a ver como configurar nuestro propio entorno de CI/CD con Drone, integrado con Traefik como reverse proxy y en NixOS como sistema operativo usando repositorios de github.

En primer lugar necesitamos crar una OAuth application en github y nuestro RPC secret podemos verlo en este post o también en los docs de drone.

Para crear nuestro RPC secret lo haremos de la siguiente forma:

$ openssl rand -hex 16 bea26a2221fd8090ea38720fc445eca6

Una vez tenemos nuestro client ID y nuestro client secret procedemos a crear nuestro docker-compose.yml para levantar el container de drone.

version: '3.7'

services:
  drone-server:
    container_name: drone-server
    image: drone/drone:1
    restart: unless-stopped
    volumes:
      - ./drone:/data
    environment:
      - DRONE_GITHUB_CLIENT_ID=<Your_Client_ID>
      - DRONE_GITHUB_CLIENT_SECRET=<Your_Client_secret>
      - DRONE_RPC_SECRET=<Your_RPC_secret>
      - DRONE_SERVER_HOST=<Your_URL>
      - DRONE_SERVER_PROTO=https
      - DRONE_USER_CREATE=username:<Your_Github_username>,admin:true
    labels:
      - traefik.enable=true
      - traefik.http.routers.drone.entryPoints=web-secure
      - traefik.http.routers.drone.rule=Host(`Your_URL`)
      - traefik.http.routers.drone.tls.certresolver=default

A continuación levantamos nuestro container con: > $ docker-compose up -d

Una vez levantado nuestro server vamos a levantar nuestro host runner executor para ello nos bajamos el binario de drone-exec desde la web de drone:

$ curl -L https://github.com/drone-runners/drone-runner-exec/releases/latest/download/drone_runner_exec_linux_amd64.tar.gz | tar zx

Una vez bajado lo tenemos que mover a /root/bin/ para posteriormente en el configuration.nix añadir lo siguiente:

environment.etc.drone-runner-exec = {
  target = "drone-runner-exec/config";
  text = ''
  DRONE_RPC_PROTO=https
  DRONE_RPC_HOST=<Your_URL>
  DRONE_RPC_SECRET=<Your_RPC_secret>
  DRONE_UI_USERNAME=root
  DRONE_UI_PASSWORD=root
  '';
};

systemd.services.drone-runner-exec = {
  description = "Drone Exec Runner";
  startLimitIntervalSec = 5;
  serviceConfig = {
    ExecStart = "/root/bin/drone-runner-exec service run --config /etc/drone-runner-exec/config";
  };
  wantedBy = [ "multi-user.target" ];
  path = [ pkgs.git pkgs.docker pkgs.docker-compose ];
};

Una vez modificado nuestro configuration.nix:

nixos-rebuild switch

Ahora accedemos a nuestra URL de Drone y nos autenticamos con nuestra cuenta de Github.

Hasta aquí hemos montado nuestra infraestuctura con Drone, de aquí en adelante cada unx puede hacer lo que necesite, en mi caso vamos a ver como tengo yo montado para que cada vez que creo un post y hago push a la repo de github, automáticamente se realice el deployment y se actualice el container de nginx con las modificaciones.

Una vez dentro de la web de nuestro drone, activamos el repositorio que queramos en mi caso el repositorio de este blog.

Para realizar la configuración nuestro repositorio tiene que tener 3 archivos esenciales en la raiz del repositorio:

.drone.yml

En este archivo configuramos básicamente las acciones a realizar por drone en nuestro caso simplemente realiza el build de docker y luego levanta el container.

kind: pipeline
type: exec
name: default

platform:
  os: linux
  arch: amd64

steps:
- name: build
  commands:
    - docker build -t bloglord .

- name: run
  commands:
    - docker-compose down -v
    - docker-compose up -d --build

Dockerfile

Poco que comentar de este archivo, simplemente copia el contenido de public en la carpeta html del container de nginx.

FROM nginx:alpine
COPY public/ /usr/share/nginx/html

docker-compose.yml

El compose del container donde aportamos los labels de traefik.

version: '3.7'

services:
  bloglord:
    image: bloglord
    container_name: blog
    restart: unless-stopped
    labels:
      - traefik.enable=true
      - traefik.http.routers.bloglord.entryPoints=web-secure
      - traefik.http.routers.bloglord.rule=Host(`blog.crstian.me`)
      - traefik.http.routers.bloglord.tls.certresolver=default

networks:
  default:
    name: bloglord-network

Una vez realizado todo esto podemos comprobar realizando y pusheando un commit donde veremos como hemos automatizado las modificaciones del blog.

Si fallara algo lo podríamos ver en el activity feed de cada commit.

Y ya estaría listo nuestro Drone para todo lo que necesitemos.

Espero que te haya servido.

Sources