【问题标题】:Git Variables in Jenkins Workflow pluginJenkins Workflow 插件中的 Git 变量
【发布时间】:2016-06-03 23:00:21
【问题描述】:

当我在构建流中进一步从 git 签出存储库时,我想访问 git 变量,例如 GIT_COMMITGIT_BRANCH。目前我发现没有可用的变量来访问这两个参数。

node {
    git git+ssh://git.com/myproject.git
    echo "$GIT_COMMIT - $BRANCH_NAME"
}

这些变量是否可用,如果有的话,我在哪里可以找到它们。我不介意它们是否可以通过一些 groovy 变量或任何地方获得,只是我可以访问它们。

也许我缺乏 Groovy 中的调试技能,这很容易找到,但我只是以我有限的技能找不到它。

【问题讨论】:

  • 我尝试将 git 转换为变量,但它似乎返回 null。 def gitInfo = git git+ssh://git.com/myproject.git
  • 我目前正在尝试做同样的事情。解决这个问题会很有帮助。
  • 我在脚本中遇到了完全相同的问题,我想使用 GIT_URL 和 GIT_BRANCH 环境变量(如果我没记错的话,应该在 GitSCM 中填充)。就我而言,我使用“来自 SCM 的管道脚本”,并希望在我的 Git 提交的 Groovy 脚本中获取这些变量。此外,在我的情况下,提到的 hack 不起作用,因为一旦 SCM 轮询发生,头部就会与 master(或任何分支)分离......任何解决方案?
  • 这些不可用是否有原因?

标签: git jenkins groovy jenkins-pipeline


【解决方案1】:

根据您使用的 SCM 插件,checkout 步骤可能会返回有关修订的附加信息。这已在 JENKINS-26100 中解决。发布于2.6 version of the workflow-scm-step plugin

例如,使用 Git 插件,您可以执行以下操作:

final scmVars = checkout(scm)
echo "scmVars: ${scmVars}"
echo "scmVars.GIT_COMMIT: ${scmVars.GIT_COMMIT}"
echo "scmVars.GIT_BRANCH: ${scmVars.GIT_BRANCH}"

这取决于您使用的插件,因此原始答案可能更适合您。


原答案

使用Pipeline Nodes and Processes Plugin 的 2.4 版本,您可以简单地执行以下操作:

def gitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()

【讨论】:

  • 还有一个 --short 标志用于 rev-parse 获取前 7 个字符
  • 确保始终包含trim()
【解决方案2】:

根据您需要的信息,有一个非常简单的解决方案:获取“checkout scm”操作返回:它提供了 GIT_BRANCH、GIT_COMMIT、GIT_PREVIOUS_COMMIT、GIT_PREVIOUS_SUCCESSFUL_COMMIT 和 GIT_URL。

node { 
    stage ("Checkout") {

        scmInfo = checkout scm

        /*...*/
        echo "scm : ${scmInfo}"
        echo "${scmInfo.GIT_COMMIT}"


    }
}

这将输出:

...
[Pipeline] echo
    scm : [GIT_BRANCH:my-branch, GIT_COMMIT:0123456789abcdefabcdef0123456789abcdef01, GIT_PREVIOUS_COMMIT:aaaabbbcccdddeeeefffe0123456789012345678, GIT_PREVIOUS_SUCCESSFUL_COMMIT:aaaabbbcccdddeeeefffe0123456789012345678, GIT_URL:http://my.si.te/my-repository.git]
[Pipeline] echo
    0123456789abcdefabcdef0123456789abcdef01
...

更多详情在这里Jenkins Pipeline SCM Steps

【讨论】:

    【解决方案3】:

    这就是我正在做的,基于example provided in the Jenkins examples repo

    node {
        git url: 'https://git.com/myproject.git'
    
        sh 'git rev-parse --abbrev-ref HEAD > GIT_BRANCH'
        git_branch = readFile('GIT_BRANCH').trim()
        echo git_branch
    
        sh 'git rev-parse HEAD > GIT_COMMIT'
        git_commit = readFile('GIT_COMMIT').trim()
        echo git_commit
    }
    

    编辑您可以通过

    缩短此操作
    git_commit = sh(returnStdout: true, script: "git rev-parse HEAD").trim()
    

    【讨论】:

    • 当我做第一个时,我得到 GIT_BRANCH=HEAD
    【解决方案4】:

    这个例子可能会让你更进一步: https://github.com/jenkinsci/pipeline-examples/tree/master/pipeline-examples/gitcommit

    在此示例中,他们将 git 命令的输出通过管道传输到文件,然后读取该文件。

    【讨论】:

    • 恐怕这不包括分支名称。这是解决其中一个问题的一种方法。分支名称在使用 Git Flow 等时很重要,或者如果您想持续集成各种分支。
    【解决方案5】:

    您可以在 node 中定义您的作业(从上次提交中提取 git 信息)以在队列中执行。

    node {
    
      //Code checkout from SCM (here - `git`)
      checkout scm
    
      stage("GIT INFO"){
        echo ":::::::::::GIT_SHORT_COMMIT::::::::::::::::::::::::"
    
        GIT_SHORT_COMMIT = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
        //echo in jenkins console
        echo GIT_SHORT_COMMIT
        //wanted to send these info to build artifacts, append to any file
        sh("echo ${GIT_SHORT_COMMIT} > GIT_SHORT_COMMIT")
    
        //Similar proceed for other git info's 
        echo ":::::::::::GIT_COMMITTER_EMAIL::::::::::::::::::::::::"
    
        GIT_COMMITTER_EMAIL = sh(returnStdout: true, script: "git show -s --pretty=%ae").trim()
        sh("echo ${GIT_COMMITTER_EMAIL} > GIT_COMMITTER_EMAIL-${GIT_COMMITTER_EMAIL}")
    
    
    
        echo ":::::::::::GIT_COMMITTER_NAME::::::::::::::::::::::::"
    
        GIT_COMMITTER_NAME = sh(returnStdout: true, script: "git show -s --pretty=%an").trim()
        sh("echo ${GIT_COMMITTER_NAME} > GIT_COMMITTER_NAME-${GIT_COMMITTER_NAME}")
      }
    

    工作完成后,您将在工作区中看到上述任务的三个附加文件:

    . |-- GIT_COMMITTER_EMAIL_email@gmail.com |-- GIT_COMMITTER_NAME-username |-- GIT_SHORT_COMMIT_<commit-short-ID-ef9e91c>

    【讨论】:

      【解决方案6】:

      我现在解决这个问题的好方法是使用多分支管道,知道 Bitbucket 和 Github 在 Jenkins 中有插件可以建立组织并自动发现新项目可能会很好。这适用于 env.GIT_BRANCH

      对于提交 ID,我建议@mkobit 上面写的内容。

      【讨论】:

      • GIT_URL有什么建议吗?我还没有找到解决办法
      • 还没有恐怕,我希望看到以前的变量按原样实现,但是在我研究这个的时候,Jenkins 的 git 插件阻止了这个,也许已经更新了。
      【解决方案7】:

      在Jenkins中通过Jenkinsfile获取Git变量的最简单方法

      node {
        def scmVars = checkout scm
        echo 'scm : the commit id is ' +scmVars.GIT_COMMIT
        echo 'scm : the commit branch  is ' +scmVars.GIT_BRANCH
        echo 'scm : the previous commit id is ' +scmVars.GIT_PREVIOUS_COMMIT
        def commitEmail = sh(returnStdout: true, script: "git --no-pager show -sformat=\'%ae\'")
        echo " the commiter email is'${commitEmail}'"
        def commitName = sh(returnStdout: true, script: "git --no-pager show -s format=\'%an\'")
        echo " the commiter name is'${commitName}'"
      }
      

      在控制台中你会得到

      GIT_COMMIT:
      GIT_BRANCH:
      GIT_PREVIOUS_COMMIT:
      commitEmail:
      commitName:
      

      【讨论】:

        【解决方案8】:

        附加信息: 如果您使用代理,例如管道中的 docker,代理应该在容器内安装 git。如果没有 git,它不会添加诸如“GIT_COMMIT、GIT_BRANCH、GIT_COMMITTER_EMAIL ... 等”之类的变量

        如果容器内没有安装 git,你可以使用 Jenkins 的 git 插件进行 checkout 并与 git 变量交互,如下所示:

        stage ('Clone') {
          steps {
            script {
              def scmVars = checkout BbS(branches: [[name: '*/develop']], credentialsId: 'bitbucket-jenkins', extensions: [], gitTool: 'default-git', id: '436fd534-c616-4a81-94d9-f67f32c03c1c', projectName: 'intuence-discovery-analysis-configuration', repositoryName: 'api-gateway-elasticsearch-proxy', serverId: 'b4943a46-b885-4aa3-90be-033e40460794')
              echo "scmVars.GIT_COMMIT"
              echo "${scmVars.GIT_COMMIT}"
              env.GIT_COMMIT = scmVars.GIT_COMMIT
              sh "printenv"
            }
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-23
          • 2016-03-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多