Gitlab CI propose de nombreuses intégrations lorsque vous lancez vos tests (junit par exemple).
En complément, ou parfois à défaut d’avoir accès à la version entreprise de Gitlab, il peut être utile de voir le résultat d’une commande ou d’un export en commentaire de votre Merge Request.
Pour réaliser cela nous allons utiliser les options suivantes :
- les variables d’environnement prédéfinies dans Gitlab CI
- l’option
only:merge_requests
de Gitlab CI - la fonction
after_script
de Gitlab CI - l’API Gitlab pour les Merge Request
- un jeton (token) Gitlab à générer en amont
- curl
- JQ
Avec ce process, nous pourrons ainsi avoir un retour dans notre Merge Request
Le script final
post:comment:on:merge-request:
variables:
FILE_EXPORT_PATH: "text-export.txt"
before_script:
- apk --no-cache add curl jq
script:
- echo "An awesome text to report" > text-export.txt
after_script:
- |
if [ -f "text-export.txt" ]
then
printf "${CI_JOB_NAME} \n<pre>$(cat text-export.txt)\n</pre>\n" | \
jq -R -c -s '{"body":.}' - | \
curl -X POST "${CI_API_V4_URL}/projects/${CI_MERGE_REQUEST_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/notes" \
--header "PRIVATE-TOKEN: ${GITLAB_PRIVATE_TOKEN}" \
--header "Content-Type: application/json" \
--data @-;
fi
only:
refs:
- merge_requests
Details
Préparation
Tout d’abord, nous devons nous assurer que notre image de base, une Alpine dans notre exemple, contient les outils curl
et jq
.
before_script:
- apk --no-cache add curl jq
Le script
Au niveau de notre script, nous allons exporter la sortie dans un fichier qui sera ensuite exploité dans l'after_script
script:
- echo "An awesome text to report" > ${FILE_EXPORT_PATH}
Nous allons nous assurer que le job n’est exécuté que lors d’une Merge Request, ce qui nous garantira d’avoir accès aux bonnes variables d’environnement.
only:
refs:
- merge_requests
After script
Enfin, notre after_script
.
printf
est utilisé ici pour aider à la mise en forme de notre texte, supprimer d’éventuelles contraintes de formatage…
On utilise la variable CI_JOB_NAME
pour pouvoir directement voir dans le commentaire quel job à renvoyer l’information.
printf "${CI_JOB_NAME} \n<pre>$(cat text-export.txt)\n</pre>\n" | \
jq
arrive ensuite pour formater le contenu avant sa transmission à l’API Gitlab.
jq -R -c -s '{"body":.}' - | \
Enfin, l’envoi à l’API Gitlab en utilisant les variables suivantes CI_API_V4_URL
, CI_MERGE_REQUEST_PROJECT_ID
, CI_MERGE_REQUEST_IID
, GITLAB_PRIVATE_TOKEN
.
La variable GITLAB_PRIVATE_TOKEN
est la seule qui n’est pas “nativement” disponible. Il vous faudra la générer avec l’utilisateur qui postera le commentaire et la renseigner dans les variables CI/CD de votre projet.
curl -X POST "${CI_API_V4_URL}/projects/${CI_MERGE_REQUEST_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}/notes" \
--header "PRIVATE-TOKEN: ${GITLAB_PRIVATE_TOKEN}" \
--header "Content-Type: application/json" \
--data @-;
Quelques cas d’usage possibles
- Terraform plan
- Fuite de mots de passe / clés
- Retours tests d’intrusions
- Retours de tests de performance
- …