---
title: Setup Gitea / Drone / Docker
description: gitea drone cicd docker
date: 2021-01-15
yearonly: false
url: 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](https://docs.docker.com/engine/install/debian/).

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](https://docs.drone.io/server/provider/gitea/#install-runners) 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.