在声明式 Jenkins 管道中使用 GIT 变量

在声明式 Jenkins 管道中使用 GIT 变量

我无法在 Jenkins 管道中访问 GIT 变量

我需要知道在管道的某个阶段中,某个 bash 代码中签出了哪个 GIT 分支。我将使用它来创建不同的输出文件名。我的管道是声明式的,而不是脚本式的,我使用的是 Jenkins 2.150.1

我尝试了网上能找到的所有方法,但大多数都是不完整的代码或脚本管道。或者根本无法将信息整合在一起。

考虑到我在这上面花了多少时间,如果有一个使用声明性管道的完整工作示例就好了。

这是我迄今为止尝试过的:

#1

在里面运行 git sh,但 Jenkins 签出的是提交,而不是分支,导致头部分离

#2

从 shell 中查找环境变量,但没有设置与 GIT 相关的变量。此代码片段

steps {
  sh 'echo $GIT_BRANCH'
}

总是返回空。然后我在 Groovy 上尝试:

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

印刷null

#3

在“全局变量参考”中有这样一段话:

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.

我在网上搜索了如何做到这一点,并整理了以下代码:

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

但它失败了,出现了异常

#4

使用environment命令并尝试以某种方式获取该值

#5

在 Jenkinsfile 中寻找其他级别的变量,但显然我只能在脚本管道上执行此操作

#5

尝试访问构建 URL 和 API 调用,但我使用了代理,这使 URL 变得复杂。

我的 Jenkinsfile

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
        '''
      }
    }
  }
}

答案1

最后我找到了一个例子并且能够理解如何做到这一点。

我需要使用脚本命令,获取Map返回的checkout并将其保存Map为环境变量:

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
    ...
  }
}

答案2

引用文档

GIT_BRANCH

对于基于 Git 的项目,此变量包含为构建而签出的 Git 分支(通常是 origin/master)

对于 Pipeline 插件,这个问题的答案在堆栈溢出

env.BRANCH_NAME 变量包含分支名称。

从 Pipeline Groovy Plugin 2.18 开始,您也可以只使用 BRANCH_NAME(env 不是必需的但仍然可以接受。)

该变量可能为空:

如果您的存储库托管在已知服务中,例如 GitHUB、GitLab、BitBucket 等...那么可能有一个 Jenkins 插件知道如何与每个服务协同工作并为您提供环境变量,例如 GIT_BRANCH、GIT_COMMIT、BUILD_TAG 等...因此使用这样的插件通常是最佳做法。

但是如果你的 git 存储库托管在 Microsoft TFS 上,那么目前没有这样的插件可以与管道类型的 Jenkins 作业很好地配合使用。

在这种情况下,您可能会使用“管道:SCM 步骤”来克隆存储库。

下面的方法可以修复这个问题:

在结帐步骤中的“extentions”中添加 [$class: 'LocalBranch', localBranch: "**"]。

来源

答案3

使用 step 时,Git 环境变量不会自动设置checkout。相反,它们会作为 Map 返回,我们必须自己设置它们。

pipeline {
  options {
    skipDefaultCheckout true
  }
  stages {
    stage('Checkout source code') {
      steps {
        script {
          Map scmVars = checkout([/* Some checkout paramaters */])
          // Setting up GIT_* env variables manually
          scmVars.each { k, v ->
            env[k] = v
          }
        }
      }
    }
    stage('Print GIT env variables'){
      steps {
        sh 'env | grep GIT_'
      }
    }
  }
}

答案4

我发现这很有效。定义一个可以在后续阶段使用的环境变量。

  environment {
    GIT_COMMIT_REV=''
  }
  stages {
    stage('Configure') {
      steps {
        script {    
          GIT_COMMIT_REV = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
        }
      }
    }
  }

取自Jenkins 管道示例

相关内容