Tech Blog.

Thoughts, stories, ideas.

Construction automatisée de paquets Debian avec GitLab CI

20. March 2017

Afin de construire automatiquement des paquets Debian, nous avons décidé d’utiliser GitLab CI. GitLab CI offre la possibilité d’exécuter des tâches basées sur des événements définissables, tels que des balises Git.

Nous avons créé un conteneur docker générique qui contient les outils de construction de paquets de base et qui est utilisé par GitLab pour construire le paquet. Le conteneur Docker facilite l’installation des mises à jour dans l’environnement de compilation, car le conteneur peut être facilement remplacé par un nouveau.

L’emballage automatisé de l’outil d’analyse des logs [GoAccess] (https://goaccess.io/) est illustré ci-dessous. Beaucoup d’outils ne sont pas empaquetés dans la dernière version, ce qui signifie que vous devez faire quelque chose vous-même.

Préparer un paquet Debian

D’abord les fichiers sont créés qui contrôlent la construction du paquet Debian. Dans le cas de GoAccess, il s’agit des éléments suivants:

debian/changelog # Changements au paquet et au logiciel
debian/compat # Niveau de compatibilité pour debhelper
debian/control # Informations spécifiques au paquet telles que les dépendances et la description
debian/rules # instructions pour debhelper

Debian elle-même offre déjà de la documentation détaillée, ce qui simplifie l’introduction à l’empaquetage.

Préparer le conteneur du docker

Sur un système hôte, un conteneur doit être préparé dans lequel l’emballage peut ensuite être construit. Tout d’abord, le Dockerfile est créé:

FROM debian:wheezy
ADD  setup.sh /opt/
RUN  /bin/bash /opt/setup.sh

Le Dockerfile (documentation officielle) spécifie quelle image de base utiliser. Dans ce cas, c’est Debian Wheezy. Ensuite le script setup.sh est copié dans le répertoire /opt/ du conteneur.
setup.sh configure le miroir à utiliser et installe les dépendances les plus basiques qui peuvent être utilisées sur n’importe quelle compilation:

#!/bin/sh

# change to our own mirror
echo "deb http://pkg.adfinis.com/debian/ wheezy main non-free contrib" > /etc/apt/sources.list
echo "deb http://security.debian.org/ wheezy/updates main" >> /etc/apt/sources.list
echo "deb http://pkg.adfinis.com/debian/ wheezy-updates main contrib non-free" >> /etc/apt/sources.list

# requirements
apt-get update
apt-get -y install git dh-make build-essential autoconf autotools-dev

Une fois ces fichiers préparés, vous pouvez construire le conteneur Docker:

docker build -t generic-package-build-runner:v1 .

Le conteneur Docker est maintenant créé et peut être utilisé.

Configurer GitLab CI

Le conteneur Docker préparé doit maintenant être enregistré pour le projet en cours dans lequel un colis doit être construit:

$ gitlab-ci-multi-runner register \
--non-interactive \
--url "$(GITLAB_URL)" \
--registration-token "$(CI_TOKEN)" \
--description "Generic debian wheezy package build runner" \
--executor "docker" \
--docker-image "generic-package-build-runner:v1"

L’URL de GitLab et le jeton CI peuvent être consultés dans le projet GitLab sur la page “Paramètres” > “Coureurs”. Chaque projet a son propre jeton CI.

Pour que GitLab CI sache quelles commandes doivent être exécutées dans le conteneur, le fichier .gitlab-ci.yml est créé dans le référentiel.

# exécuté avant le script dans Stages
before_script:
  - source /etc/profile

# Définit les étapes qui doivent être exécutées.
étapes :
  - build

# Stage "build"
run-build:
  stage: build
  script:
    - apt-get install -y libncurses5-dev libglib2.0-dev libgeoip-dev libtokyocabinet-dev zlib1g-dev libncursesw5-dev libbz2-dev
    - autoreconf -fvi
    - cp COPYING debian/copyright
    - dpkg-buildpackage -us -uc
    - mkdir build
    - mv ../goaccess*.deb build/

  # Cette étape n'est exécutée que pour les nouvelles balises
  only:
    - tags

  # Les fichiers qui devraient être disponibles dans GitLab
  artifacts:
    paths:
      - build/*

La partie la plus importante de ce fichier est l’étape run-build. Cette partie définit quelles actions sont exécutées, quand elles le sont et où se trouvent les fichiers créés par la compilation.

Puisqu’un conteneur Docker générique a été créé, les dépendances nécessaires doivent d’abord être installées dans la première étape.

Ensuite, le processus de construction est préparé avec autoreconf. Entre autres choses, cela crée le Makefile, ce qui est essentiel pour la compilation. Puisque nous prenons le copyright du paquet, nous le copions dans debian/.

Avec la commande dpkg-buildpackage le processus de compilation est lancé. Ceci compile le paquet et crée le paquet Debian. Ces paquets sont ensuite déplacés dans le dossier build créé et téléchargés dans GitLab.

Flux de travail

Dès que nous aurons une nouvelle version, une balise git sera créée. La balise Git créée démarre une nouvelle construction dans GitLab, qui construit le paquet dans la nouvelle version.
Le package créé est alors disponible dans l’interface web de GitLab, où il peut être téléchargé.
Successful GoAccess build

Perspectives

Idéalement, les paquets ou artefacts construits devraient être traités automatiquement, par exemple en les téléchargeant dans un miroir. Dans notre cas, nous utilisons un bot qui télécharge les artefacts sur le serveur cible sur les instructions d’un crochet Web GitLab, les ajoute à un dépôt Aptly et publie le dépôt en conséquence, afin que le processus de construction du paquet à publier puisse être entièrement automatisé. Le résultat peut enfin être vu sur notre page publique Aptly Mirror.