Jenkins管道:checkout显式git commit

时间:2017-04-25 13:10:22

标签: jenkins jenkins-pipeline

我希望能够说出类似的内容:

git branch: commitHash, credentialsId: credentialsId, url: url

用例:我在不同的平台上进行并行构建和测试运行,并希望确保每个都获得相同的代码。它是C ++,我们构建在不同的平台上以及构建它们。

如果我执行上述操作,则会失败 - 底层代码假定给定分支实际上是分支,或者您得到类似的内容:

[Linux64 Build]  > git rev-parse origin/e4b6c976a0a986c348a211579f1e8fd32cf29567^{commit} # timeout=10
[Pipeline] [Linux64 Build] }
[Pipeline] [Linux64 Build] // dir
[Pipeline] [Linux64 Build] }
[Pipeline] [Linux64 Build] // node
[Pipeline] [Linux64 Build] }
[Linux64 Build] Failed in branch Linux64 Build

我之前已经看过这个问题的变化,虽然没有实际的答案 - 只是建议改为隐藏源代码等等。不是我真正想要的。

文档建议应该可以提供显式提交哈希值,可能使用分支代替,但我无法解决语法问题,也无法找到任何示例。当我这样做时,我得到了主分支,我认为 - 在我们的设置中,主人不起作用。

到目前为止,我发现的唯一解决方案是检查分支,然后显式调用git来获取提交:

                git branch: branch, credentialsId: credentialsId, url: url
                sh 'git checkout ' + commitHash

(其中branch是我最初在作业顶部获得哈希的分支。它可以工作,但不是最好的。

有人有更好的方法吗?

3 个答案:

答案 0 :(得分:19)

使用general scm步骤

checkout([$class: 'GitSCM', branches: [[name: commitHash ]],
     userRemoteConfigs: [[url: 'http://git-server/user/repository.git']]])

答案 1 :(得分:7)

当jenkins由于初步结账而缺少工作空间时,Yuri G的例子对我不起作用。在这种情况下,以下工作。我不明白他们为什么会那么不同。

    def commitId = "<insert sha here>"

    checkout ( [$class: 'GitSCM',
        branches: [[name: commitId ]],
        userRemoteConfigs: [[
            credentialsId: 'deploy key for your repo', 
            url: 'repo url']]])

答案 2 :(得分:0)

要从存储库中检出特定的哈希值,请在Jenkins管道中执行以下操作:

pipeline {
  agent none
  options {
      timeout(time: 1, unit: 'HOURS')
  }
  environment {
    // Jenkins credentials for git auth
    SOURCECODE_JENKINS_CREDENTIAL_ID = 'sourcecode-credential'
    // URL of the repo
    SOURCE_CODE_URL = 'https://sourcecode.com/repo.git'
    // branch
    RELEASE_BRANCH = 'dev'
    // hash
    GIT_HASH = 'your_hash'
  }
  stages {
    stage('Git') {
      agent any
      steps {
        sleep(5)
        
       // Clean dir
        deleteDir()
        
        // Checkout branch
        git branch: "$RELEASE_BRANCH", credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID" , url: "$SOURCE_CODE_URL"
        
    // Checkout hash
        withCredentials([usernamePassword(credentialsId: "$SOURCECODE_JENKINS_CREDENTIAL_ID", usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PASS')]) {
          sh "git checkout '$GIT_HASH'"
        }  
      }
    }
  }
}