我希望能够说出类似的内容:
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是我最初在作业顶部获得哈希的分支。它可以工作,但不是最好的。
有人有更好的方法吗?
答案 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'"
}
}
}
}
}