我正在尝试使用Jenkinsfile创建Jenkins工作流程。我想要它做的就是监控“开发”。分支变化。当发生更改时,我希望它git tag并合并到master。我正在使用GitSCM Step,但它似乎唯一支持的是git clone。我不想出去做标签/合并,但我认为没办法解决。有谁知道这是否可能?我正在为我的Git服务器使用BitBucket(本地)。
答案 0 :(得分:23)
目前无法实现,因为GitPublisher
插件,以前负责标记/合并/推送自由式作业的插件尚未更新为与Jenkins管道兼容。您可以在pipeline plugins compatibility page和专用GitPublisher Jira issue上关注该问题。
所以看起来你唯一的选择就是实际发布你的标记/合并命令...但是,请注意,你仍然可以从一些Jenkins内置功能中受益,例如使用Git repo的凭据,这使得根据您的需求进行标记/合并非常简单。
退房示例:
git url: "ssh://jenkins@your-git-repo:12345/your-git-project.git",
credentialsId: 'jenkins_ssh_key',
branch: develop
然后标签/合并/推送将非常简单:
sh 'git tag -a tagName -m "Your tag comment"'
sh 'git merge develop'
sh 'git commit -am "Merged develop branch to master'
sh "git push origin master"
我希望有一天GitPublisher将在管道兼容版本中发布,但是现在这个解决方法应该这样做。
答案 1 :(得分:14)
如果您使用的是git凭据,则可以使用此代理链接中的SSH代理插件:https://issues.jenkins-ci.org/browse/JENKINS-28335?focusedCommentId=260925&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-260925
40%
答案 2 :(得分:5)
在我的情况下,我被迫使用HTTPS。我解决了它:
然后我可以用 git push 来推送。
像这样:
sh 'git config --global credential.helper cache'
sh 'git config --global push.default simple'
checkout([
$class: 'GitSCM',
branches: [[name: branch]],
extensions: [
[$class: 'CloneOption', noTags: true, reference: '', shallow: true]
],
submoduleCfg: [],
userRemoteConfigs: [
[ credentialsId: 'bitbucketUsernamePassword', url: cloneUrl]
]
])
sh "git checkout ${branch}" //To get a local branch tracking remote
然后我可以做以下事情:
sh 'git push'
答案 3 :(得分:5)
是的,它是!! 经过几天的挣扎,我最终得到了这些简单的代码块,用于脚本管道脚本,对我有用。
withCredentials([sshUserPrivateKey(credentialsId: '<credential-id>', keyFileVariable: 'SSH_KEY')]) {
sh("git push origin <local-branch>:<remote-branch>")
}
Enjoyy !!
答案 4 :(得分:2)
我必须执行类似的任务,并设法让它与其中的变体一起使用:https://issues.jenkins-ci.org/browse/JENKINS-28335?focusedCommentId=320383&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-320383
withCredentials([sshUserPrivateKey(credentialsId: 'ci', keyFileVariable: 'SSH_KEY')]) {
sh 'echo ssh -i $SSH_KEY -l git -o StrictHostKeyChecking=no \\"\\$@\\" > local_ssh.sh'
sh 'chmod +x local_ssh.sh'
withEnv(['GIT_SSH=local_ssh.sh']) {
sh 'git push origin develop'
}
}
而ci
是您在Jenkins中设置的凭据的ID。 ssh密钥的路径可用作环境变量SSH_KEY
。
答案 5 :(得分:2)
该线程确实很有帮助。我的Jenkins凭据是用户名/密码,所以我使用了:
withCredentials([usernamePassword(credentialsId: 'fixed', usernameVariable: 'username', passwordVariable: 'password')]){
{
sh("git push http://$username:$password@git.corp.mycompany.com/repo")
}
用户名和密码在日志中均被遮盖:
+ git push http://****:****@git.corp.mycompany.com/repo
答案 6 :(得分:1)
与sshgent在蓝色的海洋上合作(使用https授权)
sshagent(credentials: ["406ef572-9598-45ee-8d39-9c9a227a9227"]) {
def repository = "git@" + env.GIT_URL.replaceFirst(".+://", "").replaceFirst("/", ":")
sh("git remote set-url origin $repository")
sh("git tag --force build-${env.BRANCH_NAME}")
sh("git push --force origin build-${env.BRANCH_NAME}")
}
答案 7 :(得分:1)
借助基本的Jenkins和git功能找到了解决方案
stage('Git Push'){
steps{
script{
GIT_CREDS = credentials(<git creds id>)
sh '''
git add .
git commit -m "push to git"
git push https://${GIT_CREDS_USR}:${GIT_CREDS_PSW}@bitbucket.org/<your repo>.git <branch>
'''
}
}
}
https://www.jenkins.io/doc/book/using/using-credentials/ Username and password in command for git push
答案 8 :(得分:0)
就我而言,我想通过SSH推送到CodeCommit存储库。 sshagent
不起作用,因为它没有设置User
。最终完成了这项工作:
withCredentials([sshUserPrivateKey(credentialsId: CODECOMMIT_CREDENTIALS_ID, keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USER')]) {
withEnv(["GIT_SSH_COMMAND=ssh -o StrictHostKeyChecking=no -o User=${SSH_USER} -i ${SSH_KEY}"]) {
sh 'git push ${CODECOMMIT_URL} ${COMMIT_ID}:refs/heads/${BRANCH}'
}
}
答案 9 :(得分:0)
小飞利浦(Litty Philips)的回答在很大程度上帮助了我,但我还需要定义GIT_SSH_COMMAND。
withCredentials([sshUserPrivateKey(credentialsId: '<credential-id>', keyFileVariable: 'SSH_KEY')]) {
sh """
GIT_SSH_COMMAND = "ssh -i $SSH_KEY"
git push origin <local-branch>:<remote-branch>
"""
}