web-dev-qa-db-fra.com

Utilisation de variables GIT dans un pipeline Jenkins déclaratif

J'ai du mal à accéder aux variables GIT dans mon pipeline Jenkins

J'ai besoin de savoir quelle branche GIT a été vérifiée dans un code bash dans une étape du pipeline. Je vais l'utiliser pour créer différents noms de fichiers de sortie. Mon pipeline est déclaratif, non scripté, et j'utilise Jenkins 2.150.1

J'ai essayé tout ce que je pouvais trouver en ligne mais c'est surtout du code incomplet ou pour des pipelines scriptés. Ou tout simplement je ne peux pas rassembler les informations.

Donner combien de temps j'ai passé là-dessus, ce serait bien d'avoir un exemple de travail complet qui utilise un pipeline déclaratif.

Voici ce que j'ai essayé jusqu'à présent:

# 1

Exécutez git à l'intérieur de sh, mais Jenkins vérifie un commit, pas une branche, résultant en une tête détachée

# 2

Vous recherchez des variables d'environnement du Shell, mais il n'y a aucun ensemble lié à GIT. Cet extrait

steps {
  sh 'echo $GIT_BRANCH'
}

renvoie toujours vide. J'ai ensuite essayé sur Groovy:

steps {
  echo "${env.GIT_BRANCH}"
}

affiche null.

#

Dans le "Global Variable Reference", il y a un peu qui dit:

SCM-specific variables such as GIT_COMMIT are not automatically defined as environment variables; rather you can use the return value of the checkout step.

J'ai cherché en ligne comment le faire et j'ai remonté ce code:

pipeline {
  stages {
    stage('Build') {
      steps {
        def scmVars = checkout([...])
        echo 'scm : the commit id is ' + scmVars.GIT_COMMIT
      }
    }
  }
}

Mais il échoue avec une exception

# 4

utilisez une commande environment et essayez d'obtenir cette valeur d'une manière ou d'une autre

# 5

la recherche de variables à d'autres niveaux dans le fichier Jenkins, mais apparemment je ne peux le faire que sur des pipelines scriptés

# 5

J'ai essayé d'accéder à l'URL de génération et à l'appel d'API, mais je suis un proxy et cela complique les choses avec l'URL.

Mon fichier Jenkins

pipeline {
  stages {
    stage('Build') {
      steps {
        checkout([
          $class: 'GitSCM',
          doGenerateSubmoduleConfigurations: false,
          userRemoteConfigs: [[
            url: '...',
            credentialsId: '...'
          ]],
          branches: [ [name: '*/master'] ]
        ])

        sh '''
        #!/bin/bash -x
        echo $MY_GIT_BRANCH_THAT_I_CANT_FIND
        '''
      }
    }
  }
}
7
ColOfAbRiX

Enfin, j'ai trouvé un exemple et j'ai pu comprendre comment procéder.

Je dois utiliser une commande de script, obtenir le Map renvoyé par checkout et enregistrer le Map comme variable d'environnement:

stage('Checkout code') {
  steps {
    script {
      // Checkout the repository and save the resulting metadata
      def scmVars = checkout([
        $class: 'GitSCM',
        ...
      ])

      // Display the variable using scmVars
      echo "scmVars.GIT_COMMIT"
      echo "${scmVars.GIT_COMMIT}"

      // Displaying the variables saving it as environment variable
      env.GIT_COMMIT = scmVars.GIT_COMMIT
      echo "env.GIT_COMMIT"
      echo "${env.GIT_COMMIT}"
    }

    // Here the metadata is available as environment variable
    ...
  }
}
9
ColOfAbRiX

Citant le docs :

GIT_BRANCH

Pour les projets basés sur Git, cette variable contient la branche Git qui a été extraite pour la génération (normalement Origin/master)

Spécifiquement pour le plugin Pipeline, il y a une réponse à ce problème sur StackOverflow :

La variable env.BRANCH_NAME contient le nom de la branche.

Depuis le Pipeline Groovy Plugin 2.18, vous pouvez aussi simplement utiliser BRANCH_NAME (env n'est pas requis mais toujours accepté.)

Sous certaines conditions , cette variable peut être vide, ce qui suit devrait résoudre ce problème:

Ajoutez [$ class: 'LocalBranch', localBranch: "**"] aux "extensions" dans votre étape de paiement.

3
fuero

Le travail de pipeline déclaratif Jenkins dans un pipeline multibranches respecte la configuration git du pipeline multibranches qui a défini le travail. Ajoutez le trait "Extraire pour correspondre à la branche locale" à la définition de pipeline multibranches si vous préférez que chaque tâche extrait une branche locale avec un nom qui correspond à la branche distante. Chaque travail créé dans ce pipeline multibranches sera ensuite extrait d'une branche locale nommée.

Si vous utilisez un travail de pipeline déclaratif qui ne fait pas partie d'un pipeline multibranches, vous pouvez utiliser l'extension de branche locale du plugin git pour définir le nom de la branche locale à créer.

0
Mark Waite