我有一个由shell脚本构成的Jenkins作业,我用它来管理我的git流程。该脚本通过SSH连接到远程git仓库,并对分支dev
和master
进行更改。我希望它将这两个分支推回到远程仓库。
Git Publisher构建操作允许您将HEAD推送到一个远程分支,但不允许推送多个分支](https://issues.jenkins-ci.org/browse/JENKINS-21681)。
我尝试从shell脚本执行“git push”但我得到“Permission denied(publiuc key)”。在构建日志中,我可以看到Jenkins使用插件为预构建和后构建操作注入SSH凭据:
[WS-CLEANUP] Deleting project workspace...
[WS-CLEANUP] Done
Cloning the remote Git repository
Cloning repository git@my.repo.url:path/to/repo/test.git
> git init /home/jenkins/workspace/node-injection/release # timeout=10
Fetching upstream changes from git@my.repo.url:path/to/repo/test.git
...
Seen branch in repository origin/dev
Seen branch in repository origin/master
Seen 2 remote branches
# ... do some work
+ git push origin master dev --follow-tags
Fetching origin
Permission denied (publickey).
fatal: Could not read from remote repository.
有没有办法将SSH凭据传递给shell脚本,以便它可以git push
?
我不想将用户/密码传递给shell脚本,因为这会迫使我为每个我管理的存储库创建一个用户,而我可以为单个用户创建多个部署密钥(这更容易管理)。
答案 0 :(得分:1)
我最终找到了答案:
GIT_SSH_KEYS_PATH
。为每个需要它的命令注入ssh凭据,如下所示:
GIT_SSH_COMMAND="ssh -i $GIT_SSH_KEYS_PATH" <git-command>
例如:
GIT_SSH_COMMAND="ssh -i $GIT_SSH_KEYS_PATH" git push origin master dev --follow-tags
答案 1 :(得分:0)
有没有一种方法可以将SSH凭据传递到Shell脚本,以便它可以进行git push?
您可以使用sshagent plugin将凭据上下文注入您的Shell脚本执行中(pipeline script示例的相关片段):
stage('Build') {
steps {
sshagent(['a1b36f46-341c-4ffd-941f-5f2fd547d8f8']) {
sh "./my-git-push-script.sh"
}
}
}
因此,将使用给定的凭据建立共享会话,如果成功,将使用shell脚本。 Git push命令将利用此ssh会话与SCM通信。
注意:您必须在詹金斯语中提供previously setup credential unique identifier