21 novembre 2017
Matthieu Boileau - matthieu.boileau@math.unistra.fr
Contenu sous licence CC BY-SA 4.0
GitLab CI propose une chaîne complète d'intégration continue intégrée à son système de forge logicielle.
Les avantages :
gitlab-runner
est un démon installé sur une machine destinée à exécuter les tâches d'intégration continue.gitlab-runner
écoute l'instance de gitlab correspondante dans l'attente d'une tâchepush
, merge
, etc.) sur le projet avec lequel il est liéAttention : les runners partagés sont pratiques mais peuvent présenter des problèmes de sécurité.
Deux solutions :
Faire un fork du projet sur votre compte GitLab Unistra en allant sur la page d'accueil du projet ou en suivant ce lien.
https://git.unistra.fr/xstra-dev/tp-gitlab-ci
export USERNAME="xstra-dev" # votre login sur git.unistra.fr
export TPBASEDIR=$HOME # le répertoire où vous souhaitez installer le TP
export TPDIR=$TPBASEDIR/tp-gitlab-ci
cd $TPBASEDIR
git clone git@git.unistra.fr:$USERNAME/tp-gitlab-ci.git
Engistrer un runner consiste à créer un nouveau runner associé à un projet. Si vous n'êtes pas administrateur du GitLab, il s'agit forcément d'un runner spécifique.
Allez chercher l'URL et le token du projet dans
Settings > CI / CD > Runners settings
On positionne des variables d'environnement pour gitlab-runner
export CI_SERVER_URL=https://git.unistra.fr/ # Ne pas changer pour cette session pratique
export RUNNER_NAME=a_runner_for_$USERNAME
export REGISTRATION_TOKEN=xxx # Remplacez par la valeur indiquée sur la page de paramètres du runner
export REGISTER_NON_INTERACTIVE=true # nécessaire pour le mode script
Si vous êtes sous MacOS, vous pouvez maintenant enregistrer votre runner en décommentant la ligne suivante :
#gitlab-runner register --executor shell
Si vous êtes sous Linux, vous pouvez copier les lignes de variables d'environnement dans un terminal et exécuter :
sudo gitlab-runner register --executor shell
Ou bien lancez la commande en mode interactif et compléter le prompt en suivant la vidéo ci-dessous :
gitlab-runner register # sous MacOS
sudo gitlab-runner register # sous Linux
Cette procédure est décrite pas à pas dans la documentation officielle.
tp-gitlab-ci, shell
s'ils ne sont pas déjà présentsVotre runner est maintenant prêt à travailler. Nous allons le tester en lui soumettant une tâche GitLab CI déclenchée par un git push
sur votre projet.
cd $TPDIR
git pull
git stash
git checkout exo1
git checkout exo1-start .gitlab-ci.yml
Repérer le fichier .gitlab-ci.yml
ls -al
L'éditer avec l'éditeur de votre choix
cat .gitlab-ci.yml
Le fichier .gitlab-ci.yml
(format YAML) décrit l'intégralité des tâches d'intégration continue avec GitLab CI. Dans cet exemple :
helloworld
indique le nom du job d'intégration continuetags
permet de sélectionner des runners sur la base de mot-clésscripts
correspond aux lignes de commande bash
que vous souhaitez exécuterDans la rubrique :
Settings > CI / CD > Runners settings
Notez la présence de plusieurs runners partagés dont clu1-tp-gitlab-ci
qui portent les tags shell
et docker
mais pas tp-gitlab-ci
. Pour cibler ce runner, retirer le tag tp-gitlab-ci
du fichier .gitlab-ci.yml
Modifiez la ligne de script, par exemple:
echo ' - echo "bonjour, monde"' >> .gitlab-ci.yml
cat .gitlab-ci.yml
Enregistrez avec git
git add .gitlab-ci.yml
git commit -m "Update .gitlab-ci.yml"
Poussez vos modifications
git push
Sur GitLab, observez l'exécution de votre job dans la rubrique de votre projet :
CI / CD > Pipelines
Dans .gitlab-ci.yml
, introduisez une erreur dans une des lignes du script et observer l'effet dans CI / CD > Pipelines
après avoir poussé les modifications.
Note : les fichiers peuvent s'éditer directement dans GitLab.
cd $TPDIR
git stash # si vous avez des modifications non enregistrées dans exo1
git checkout exo2
git rm .gitlab-ci.yml # Clean previous commits
Listez le contenu du répertoire
ls -al
Vérifiez que le progamme compile
make
On crée le fichier .gitlab-ci.yml
avec une étape (stage
) de build
. Il doit contenir :
build_hello:
stage: build
tags:
- shell
script:
- make
cat > .gitlab-ci.yml <<- EOM
build_hello:
stage: build
tags:
- shell
script:
- make
EOM
On vérifie le contenu
cat .gitlab-ci.yml
On enregistre et on pousse.
git add .gitlab-ci.yml
git commit -m "Add .gitlab-ci.yml with a build stage"
git push
Sur GitLab, observez l'exécution de votre job dans la rubrique de votre projet :
CI / CD > Pipelines
On souhaite ajouter une étape de test réalisée avec make test
. Tester l'exécution du test (il ne doit pas renvoyer d'erreur) :
make test
Il faut ajouter le contenu suivant :
test_hello:
stage: test
tags:
- shell
script:
- make test
cat >> .gitlab-ci.yml <<- EOM
test_hello:
stage: test
tags:
- shell
script:
- make test
EOM
cat .gitlab-ci.yml
On enregistre, on pousse et on vérifie l'exécution de la chaîne d'intégration continue dans CI / CD > Pipelines
git add .gitlab-ci.yml
git commit -m "Add a test stage to .gitlab-ci.yml"
git push
Modifier les fichiers pour provoquer des erreurs. Notez que le test n'est pas exécuté si le build échoue.
On veut mettre en place d'intégration continue d'un programme en python rosenbrock.py
qui calcule la fonction de Rosenbrock. Pour que cette fonction soit efficace, nous allons la compiler avec pythran
, un traducteur de python vers C++ qui permet d'accélérer le code python.
Cet exercice a pour but d'illustrer la gestion des dépendances de compilation avec les conteneurs Docker dans une chaîne GitLab CI.
Pour le reproduire, il est nécessaire de :
tp-gitlab-ci, docker-exec
executor: docker
Le dépôt d'images est gratuit sur DockerHub à condition que les images soient publiques. Pour héberger des images privées, il existe la solution du GitLab container registry, un service qui doit être activé par l'administrateur de l'instance de GitLab.
Dans votre clone local, basculez sur exo3
cd $TPDIR
git stash # si vous avez des modifications non enregistrées dans exo2
git checkout exo3
.gitlab-ci.yml
¶stages:
- build
- test
- release
variables:
DOCKERHUB_USERNAME: boileaum
CONTAINER_TEST_IMAGE: $DOCKERHUB_USERNAME/rosen:$CI_COMMIT_REF_NAME
CONTAINER_RELEASE_IMAGE: $DOCKERHUB_USERNAME/rosen:latest
[...]
Remplacez
boileaum
par votreusername
sur DockerHub.
build
:¶[...]
b:docker:
stage: build
tags:
- shell, docker
script:
- echo $DOCKERHUB_PASSWD | docker login -u $DOCKERHUB_USERNAME --password-stdin
- docker build --pull -t $CONTAINER_TEST_IMAGE -f ./docker/Dockerfile-rosen .
- docker push $CONTAINER_TEST_IMAGE
[...]
Settings > CI / CD > Secret variables
, créez une variable DOCKERHUB_PASSWD
qui contient le mot de passe de votre compte DockerHub../docker/Dockerfile-rosen
Note : l'image construite avec
./docker/Dockerfile-rosen
est basée sur l'image construite avec./docker/Dockerfile-pythran
et qui contient les dépendances nécessaires.
test
¶[...]
t:rosen-py36:
stage: test
image: $CONTAINER_TEST_IMAGE
tags:
- tp-gitlab-ci
- docker-exec
script:
- make clean && make
- pytest -v
[...]
Avec le mot clé image
, on indique à GitLab CI qu'on veut instancier un conteneur Docker. Les lignes de scripts vont alors être exécutées à l'intérieur de ce conteneur.
test
¶[...]
t:rosen-py27:
stage: test
image: $CONTAINER_TEST_IMAGE
tags:
- tp-gitlab-ci
- docker-exec
script:
- source /home/euler/py27/bin/activate
- make clean && make
- pytest -v
[...]
Cette fois-ci, on veut tester l'exécution (et avant la construction) avec python 2.7. Pour ce faire, on utilise virtualenv tel qu'il est a été installé dans l'image boileaum/pythran:latest
construite avec le fichier ./docker/Dockerfile-pythran
.
[...]
r:docker:
stage: release
tags:
- shell
- docker
script:
- echo $DOCKERHUB_PASSWD | docker login -u $DOCKERHUB_USERNAME --password-stdin
- docker pull $CONTAINER_TEST_IMAGE
- docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
- docker push $CONTAINER_RELEASE_IMAGE
only:
- exo3
On ne fait que tirer l'image de test validée, la renommer, la pousser vers DockerHub. Notez le mot-clé only
qui indique que cette étape ne sera exécutée que pour la branche git exo3
. On évite ainsi de livrer des images produites par des branches de développement.
Comme le montre ce schéma, l'exécution de différents jobs d'une même étape peut être réalisée en parallèle par différents runners.
Plus d'information sur l'utilisation de docker avec GitLab CI dans la doc officielle.
shell
docker
).gitlab-ci.yml
permet de publier sur https://xstra-dev.pages.unistra.fr/tp-gitlab-ciBeaucoup de réponses sont dans la doc officielle qui est très complète !