4.9 KiB
title, tags, date, yearonly, url
| title | tags | date | yearonly | url |
|---|---|---|---|---|
| Setup Gitea / Drone / Docker | gitea drone cicd docker | 2021-01-15 | false | giteadronedocker.html |
Je suis un grand fan du selfhosted. J'essais d'avoir un maximum de services directement dans mon chez moi. Le but n'est pas de s'isoler d'internet mais de reprendre le contrôle sur ce qui peut l'être.
Gitea, Drone, Docker & You
Le plan est simple: avoir tout le pipeline d'intégration en local. Exit les coûts du ci/cd et de l'hébergement.
Docker
Tout repose sur Docker pour simplifier un maximum la gestion / installation de l'ensemble de nos composants. Les commandes sont pour un système basé sur Debian, tout se base sur la documentation officielle de Docker.
On commence par ajouter le repo de Docker avec ses dépendances:
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
On install Docker lui même:
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
systemctl enable docker
Puis Docker-compose:
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Enfin, on créé un registre docker local qui nous servira de cible pour drone.
Dans un fichier docker-compose.yml:
---
version: "2"
networks:
gitea:
external: false
services:
registry:
image: registry:2
container_name: registry
environment:
- REGISTRY_HTTP_RELATIVEURLS=true
volumes:
- /docker_data/registry:/var/lib/registry
ports:
- 5000:5000
restart: unless-stopped
Gitea
C'est ici que le fun commence. On ajoute dans notre docker-compose sous services:
services:
...
gitea:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
networks:
- gitea
volumes:
- /docker_data/gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- 3000:3000
- 222:22
restart: unless-stopped
Sous volumes, /docker_data/gitea, est une préférence personnel pour ranger les fichiers de config des conteneurs Docker.
On lance le tout avec 'docker-compose up -d', et on va sur 'serveurIP:3000' pour configurer Gitea.
Drone
Même combat qu'avec Gitea, on ajoute Drone et un runner de base a notre docker-compose:
services:
...
drone:
image: drone/drone
container_name: drone
depends_on:
- gitea
volumes:
- /docker_data/drone:/var/lib/drone/
environment:
- DRONE_GITEA_SERVER=git.monsite
- DRONE_GITEA_CLIENT_ID=...
- DRONE_GITEA_CLIENT_SECRET=...
- DRONE_RPC_SECRET=...
- DRONE_SERVER_HOST=...
- DRONE_SERVER_PROTO=http
ports:
- 8383:80
- 8484:443
restart: unless-stopped
drone-runner-docker:
image: drone/drone-runner-docker
container_name: drone-runner-docker
depends_on:
- drone
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=...
- DRONE_RPC_SECRET=...
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=DefaultDockerRunner
ports:
- 8585:3000
restart: unless-stopped
La on a plus de choses a configurer avant de lancer. Depuis Gitea, ajoutez une application et récupéré toutes les clé nécessaire a Drone. Avoir la documentation de Drone avec soit ne fait pas de mal.
Utilisation du tout
Sur votre projet git favorit, par exemple superProjet, ajoutez un '.drone.yml':
kind: pipeline
type: docker
name: default
steps:
- name: build
image: plugins/docker
settings:
registry: dockerreg.monsite
repo: dockerreg.monsite/superProjet
- name: deploy
image: appleboy/drone-ssh
settings:
host:
from_secret: deploy_host
username:
from_secret: deploy_user
password:
from_secret: deploy_password
port: 22
script:
- docker-compose pull superProjet
- docker-compose up -d superProjet
Depuis l'interface de Drone, on active le repo de superProjet et on ajoute les secrets nécessaire.
Et maintenant on profite et abuse de notre super pipeline qui nous fait gagner du temps.