Debo admitir que nunca me gustó la parte de sistemas del proceso de desarrollo. Siempre pensé que era un trabajo en un lugar oscuro y sucio, lleno de monstruos haciendo cosas raras. Esta visión cambió por completo cuando comencé a usar Docker. En este punto me di cuenta de que toda la magia hecha en la parte del administrador de sistemas era mejor de lo que pensaba y luego, comencé a interesarme más y más de este lado.
Además, en mi trabajo comenzamos a usar Jenkins para CI/CD, cambiando nuestra tarea manual de empaquetado-prueba-implementación manual para un proceso automático. ¡¡¡Fue genial!!! Me siento muy feliz porque ahorra mucho tiempo y te permite concentrarte en tus tareas de desarrollo sin perder tiempo en la fase de implementación. Solía pasar mucho tiempo generando mis guerras, implementándolas en sandbox, probando las nuevas características agregadas, implementándolas nuevamente si algo necesita arreglarlo nuevamente y finalmente lanzando una nueva versión del código y desplegándolas en producción. Todos estos pasos se simplificaron con solo ingresar a una rama y luego fusionarse con el maestro (después de la prueba, por supuesto). En este pont, profundicé en cómo se están construyendo e implementando las cosas, dónde (en nuestro caso en AWS) y cómo hacer esas cosas.
En este punto es cuando descubrí Drone. Jenkins es realmente genial y funciona, pero dependiendo del proyecto, especialmente si no es de Java, es realmente malo hacer el trabajo (porque necesitas instalar muchos complementos o dependencias para realizar la tarea). Además, la configuración de los proyectos y la instalación del propio Jenkins en tu servidor es un poco tediosa y complicada. Entonces, Drone se ejecuta en un contenedor Docker. Solo necesitas tirar del contenedor y ejecutarlo. ¡INCREÍBLE! Funciona con un .yaml que define el servidor y el agente y eso es todo. Entonces, veamos los pasos para instalarlo en un servidor Ubuntu 16.04.
IMPORTANTE : Debe tener un certificado SSL en su servidor porque Drone se ejecuta bajo https. Lea este artículo para ver cómo agregar SSL en un Nginx con Let’s Encrypt.
Instalación
En primer lugar, debe extraer la imagen de Drone.
docker pull drone/drone:0.8
Luego crea el docker-compose para ejecutarlo:
sudo nano /etc/drone/docker-compose.yml
Y copia lo siguiente:
version: '2'
services:
drone-server:
image: drone/drone:0.8
ports:
- 8000:8000
- 9000:9000
volumes:
- /var/lib/drone:/var/lib/drone/
restart: always
env_file:
- /etc/drone/server.env
drone-agent:
image: drone/agent:0.8
command: agent
restart: always
depends_on:
- drone-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
env_file:
- /etc/drone/agent.env
En mi caso he usado estos puertos porque tengo otras cosas en mi Nginx, pero tú puedes elegir las tuyas. También he almacenado las variables del servidor y del agente env
en archivos específicos.
Ahora es el momento de crear esos archivos. Primero creamos el servidor:
sudo nano /etc/drone/server.env
Y copia lo siguiente:
# Service settings
DRONE_SECRET=secret_generated_on_command_line
DRONE_HOST=https://yourDroneURL.com
# Registration settings
DRONE_OPEN=false
DRONE_ADMIN=your_github_username
# GitHub Settings
DRONE_GITHUB=true
DRONE_GITHUB_CLIENT=Client_ID_from_GitHub
DRONE_GITHUB_SECRET=Client_Secret_from_GitHub
Para el clientID y clientSecret de GitHub, debe registrar Drone en su cuenta de GitHub para obtenerlos. Siga estas instrucciones.
Y ahora el agente:
sudo nano /etc/drone/agent.env
Y copia lo siguiente:
DRONE_SECRET=secret_generated_on_command_line
DRONE_SERVER=drone-server:9000
Para generar el DRONE_SECRET
puede escribir el siguiente comando
LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo
Una vez que nuestro Drone está instalado y configurado, necesitamos crear un archivo de unidad systemd para administrar el servicio.
sudo nano /etc/systemd/system/drone.service
Y copia lo siguiente:
[Unit]
Description=Drone server
After=docker.service nginx.service
[Service]
Restart=always
ExecStart=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /etc/drone/docker-compose.yml stop
[Install]
WantedBy=multi-user.target
Configurar Nginx
Y finalmente tenemos que configurar nuestro Nginx para las solicitudes de proxy a nuestro servidor Drone. En primer lugar, busque los bloques de servidor habilitados con el siguiente comando:
grep -R server_name /etc/nginx/sites-enabled
Verás algo como esto:
Output
/etc/nginx/sites-enabled/default: server_name yourDroneURL.com;
/etc/nginx/sites-enabled/default: return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default: server_name yourDroneURL.com;
/etc/nginx/sites-enabled/default:# server_name yourDroneURL.com;
Luego de conocer el bloque que está manejando nuestro servidor, podemos editarlo escribiendo:
sudo nano /etc/nginx/sites-enabled/default
Y agregando este texto antes del bloque server {
:
upstream drone {upstream drone {
server 127.0.0.1:8000;server 127.0.0.1:8000;
}}
map $http_upgrade $connection_upgrade {map $http_upgrade $connection_up
default upgrade;
'' close;
}
A continuación, busque el bloque del servidor con la directiva listen 443 dentro. Reemplace el contenido del bloque de ubicación con lo siguiente:
server {
listen 443 ssl;
location / {
# try_files $uri $uri/ =404;
proxy_pass http://drone;
include proxy_params;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_redirect off;
proxy_http_version 1.1;
proxy_buffering off;
chunked_transfer_encoding off;
proxy_read_timeout 86400;
}
}
Ahora es el momento de probar si nuestro Nginx está funcionando o no:
sudo nginx -t
Verás algo como esto:
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Solo necesita reiniciar el servidor y enviará las solicitudes por proxy:
sudo systemctl restart nginx
Finalmente, debe iniciar el servidor Drone:
sudo systemctl start drone
Para comprobar el estado del contenedor puede utilizar el siguiente comando:
sudo systemctl status drone
Puebe comprobar los logs de Nginx:
sudo less /var/log/nginx/error.log
También puede comprobar los logs de Drone:
sudo journalctl -u drone
Si todo está bien, es hora de habilitar Drone:
sudo systemctl enable drone
Si desea apagar Drone, puede escribir los siguientes comandos:
cd /etc/drone
sudo /usr/local/bin/docker-compose down
Visite su servidor de Drone en su https://yourDroneURL.com
e inicie sesión con la cuenta de GitHub que utilizó para obtener el ID de cliente y el secreto del cliente.
Referencias
- Drone documentación oficial
- Artículo de Digital Ocean