Synchronisation automatique des branches lors des push GitLab
Pour détecter automatiquement la branche lors d'un événement push GitLab, configurez le plugin Generic Webhook Trigger pour extraire le nom de la branche depuis le payload du webhook. Dans le Jenkinsfile, ajoutez une condition pour basculer vers cette branche avant de lancer le pipeline.
Ajout d'informations de description de build
Enrichissez les métadonnées de build en incluant des paramètres webhook supplémentaires, comme le nom d'utilisateur et la branche. Utilisez la variable globale currentBuild.description pour afficher ces détails dans l'interface Jenkins.
Intégration du statut de commit GitLab
Pour synchroniser l'état du pipeline avec GitLab, implémentez une bibliothèque partagée Groovy qui appelle l'API GitLab pour mettre à jour le statut des commits. Déclenchez cette mise à jour au début et à la fin du pipeline.
Bibliothèque partagée pour les interactions GitLab
package org.devops
def sendApiRequest(httpMethod, apiPath, payload) {
def baseUrl = "http://gitlab-instance.com/api/v4"
withCredentials([string(credentialsId: 'api-secret', variable: 'secretToken')]) {
result = httpRequest customHeaders: [[maskValue: true, name: 'Authorization', value: "Bearer ${secretToken}"]],
httpMode: httpMethod,
contentType: "APPLICATION_JSON",
consoleLogResponseBody: true,
ignoreSslErrors: true,
requestBody: payload,
url: "${baseUrl}/${apiPath}"
}
return result
}
def updateStatus(projectId, commitHash, state) {
def statusPath = "projects/${projectId}/commits/${commitHash}/statuses?state=${state}"
response = sendApiRequest('POST', statusPath, '')
println(response)
return response
}
Filtrage des requêtes push spécifiques
Évitez les déclenchements inutiles dus à des événements comme la création de nouvelles branches. Appliquez une expression régulière dans la configuration du webhook pour accepter uniquement les pushes valides.
Expression régulière de filtrage
^push\s(?!0{40}).{40}\s(?!0{40}).{40}$
Cette expression correspond aux événements push où les champs before et after ne sont pas des chaînes de zéros.
Configuration des notifications par email
Intégrez des alertes email pour informer les développeurs de l'état du pipeline. Utilisez le plugin Email Extension et créez une fonction dans la bibliothèque partagée pour générer des emails contenant les détails du build.
Fonction d'envoi d'email
package org.devops
def sendBuildNotification(status, recipient) {
emailext body: """
<h2>Notification de build Jenkins</h2>
<p>Projet : ${JOB_NAME}</p>
<p>Build # : ${BUILD_ID}</p>
<p>Statut : ${status}</p>
<p>URL du build : <a href="${BUILD_URL}">${BUILD_URL}</a></p>
""",
subject: "Mise à jour du build pour ${JOB_NAME}",
to: recipient
}
Stratégie de fusion de branche basée sur le statut de commit
Dans GitLab, configurez les règles de merge request pour exiger que le dernier commit sur une branche ait un statut de succès avant de permettre la fusion. Cela garantit l'intégration de code validé.
Exemple de code complet : Jenkinsfile et bibliothèque partagée
Voici un exemple de Jenkinsfile qui implémente les optimisations décrites, suivi d'une bibliothèque partagée pour la gestion des emails et des interactions GitLab.
Jenkinsfile
@Library('shared-lib@master') _
def buildModule = new org.devops.BuildModule()
def gitLabClient = new org.devops.GitLabClient()
def notificationService = new org.devops.NotificationService()
def repoUrl = "${env.SOURCE_REPO}"
def branch = "${env.TARGET_BRANCH}"
def buildCommand = "${env.BUILD_CMD}"
if ("${triggerType}" == "GitlabPush") {
branch = refPath - "refs/heads/"
currentBuild.description = "Déclenché par ${user} sur ${refPath}"
gitLabClient.updateStatus(projId, commitHash, "running")
}
pipeline {
agent any
stages {
stage('Code Checkout') {
steps {
script {
checkout scmGit(branches: [[name: branch]], extensions: [], userRemoteConfigs: [[credentialsId: 'git-access', url: repoUrl]])
}
}
}
stage('Build') {
steps {
script {
buildModule.execute(buildCommand)
}
}
}
}
post {
success {
script {
gitLabClient.updateStatus(projId, commitHash, "success")
notificationService.sendBuildNotification("Succès", mailAddress)
}
}
failure {
script {
gitLabClient.updateStatus(projId, commitHash, "failed")
notificationService.sendBuildNotification("Échec", mailAddress)
}
}
}
}