Jenkins git 推送多个分支

Jenkins git push multiple branches

我有一个由 shell 脚本组成的 Jenkins 作业,我用它来管理我的 git 流程。该脚本通过 SSH 连接到远程 git 存储库,并对分支 devmaster 进行更改。我希望它将这两个分支推回远程仓库。

Git 发布者 post 构建操作允许您将 HEAD 推送到一个远程分支,但不允许推送多个分支](https://issues.jenkins-ci.org/browse/JENKINS-21681).

我尝试从 shell 脚本执行 "git push",但我得到 "Permission denied (publiuc key)"。在构建日志中,我可以看到 Jenkins 使用插件为预构建和 post-构建操作注入 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

我不想将 user/password 传递给 shell 脚本,因为这会迫使我为我管理的每个存储库创建一个用户,而我可以为一个单个用户(更容易管理)。

我最终找到了答案:

  1. 当您为 git 存储库创建 SSH 凭据时:don't use a passphrase
  2. 在您的 Jenkins 作业配置中,检查 "Use secret text(s) or file(s)" 并添加带有所需凭据的 "SSH Credentials" 条目。在 "Key File Variable" 字段中,输入 GIT_SSH_KEYS_PATH.
  3. 像这样为每个需要它的命令注入 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
    

Is there a way to pass SSH credentials to the shell script so it can git push ?

您可以使用 sshagent plugin to inject credentials context into your shell script execution (relevant fragment of pipeline script 样本):

stage('Build') {
        steps {
            sshagent(['a1b36f46-341c-4ffd-941f-5f2fd547d8f8']) {
                sh "./my-git-push-script.sh"
            }
        }
    }

因此,将使用给定的凭据建立 sshagent 会话,如果成功,将执行 shell 脚本。 Git push 命令将利用此 ssh 会话与 SCM 通信。

注意:您必须在 Jenkins

中提供 previously setup credential unique identifier