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

Col*_*RiX 12 git jenkins

我正在努力访问我的 Jenkins 管道中的 GIT 变量

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

我尝试了所有可以在网上找到的东西,但大多是不完整的代码或脚本管道。或者干脆我不能把这些信息放在一起。

给我花多少时间,如果有一个使用声明性管道的完整工作示例会很好。

这是我到目前为止尝试过的:

#1

运行 git inside sh,但 Jenkins 检出提交,而不是分支,导致分离头

#2

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

steps {
  sh 'echo $GIT_BRANCH'
}
Run Code Online (Sandbox Code Playgroud)

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

steps {
  echo "${env.GIT_BRANCH}"
}
Run Code Online (Sandbox Code Playgroud)

打印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.
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了如何做到这一点,并将此代码放在一起:

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

但它失败了,有一个例外

#4

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

#5

在 Jenkinsfile 中寻找其他级别的变量,但显然我只能在脚本化管道上这样做

#5

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

我的詹金斯档案

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
        '''
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Col*_*RiX 15

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

我需要使用脚本命令,获取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
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)


fue*_*ero 5

引用文档

\n
\n

GIT_BRANCH

\n

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

\n
\n

特别是对于 Pipeline 插件, StackOverflow上有这个问题的答案:

\n
\n

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

\n

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

\n
\n

该变量可能为空:

\n
\n

如果您的存储库托管在已知服务中,例如 GitHUB、GitLab、BitBucket 等 xe2x80xa6 那么 xe2x80x99 可能是一个 Jenkins 插件,该插件知道如何使用每一项服务并且为您提供\n环境变量,例如 GIT_BRANCH、GIT_COMMIT、BUILD_TAG 等\xe2\x80\xa6\n因此通常最好的做法是使用此类插件。

\n

但是,如果您的 git 存储库托管在 Microsoft TFS 上,则 \n\n\n\n\xe2\x80\x99s 没有这样的插件(目前)可以很好地与 Jenkins 作业的管道类型配合使用。

\n

在这种情况下,您可能会使用 \xe2\x80\x9cPipeline: SCM Step\xe2\x80\x9d 克隆存储库。

\n
\n

以下应该解决这个问题:

\n
\n

在结账步骤中将 [$class: \'LocalBranch\', localBranch: "**"] 添加到 \xe2\x80\x9cextentions\xe2\x80\x9d 中。

\n
\n

来源

\n