如何使用 git pull 与 Jenkins sh 步骤?

如何使用 git pull 与 Jenkins sh 步骤?

git pull由于某种原因,无法与 Jenkins 配合使用。我更新了本地 PC 上的一些文件并将其推送到 Github。我可以在那里看到更改。然后我运行 Jenkins build,其中包含从此存储库中提取的 sh 命令,它显示“已更新”。这是错误的,因为我显然将新版本推送到了 Github,如果我去那里并在浏览器中打开文件,我可以看到更改。这只发生在 Jenkins 运行 git pull 时,因为如果我连接到我的虚拟机并git pull自行运行,它会正常工作并更新我的文件。为什么会发生这种情况?

我的詹金斯文件:

pipeline{
  agent any
  stages{
    stage("build"){
      steps{
        echo 'build'
        sh 'cd /var/atlassian/application-data/jira/scripts'
        sh 'eval "$(ssh-agent -s)"'
        sh 'ssh-add ~/.ssh/id_ed25519'
        sh 'git pull [email protected]:mightyajax/scripts.git'
      }
    }
    stage("test"){
      steps{
        echo 'test'
      }
    }
    stage("deploy"){
      steps{
        echo 'deploy'
      }
    }
  }
}

答案1

据我所知,sh '...'Jenkins 中的每个命令都经过单独的 /bin/sh 进程,因此对进程级环境的任何更改都只会在该特定命令运行时保留。

例如,cd在 'sh' 中,第 1 行仅影响第一个 /bin/sh 实例 - 一旦处理完该行,shell 就会退出,所有更改都会丢失。然后,第 2 行在继承了原来的Jenkins 的工作目录。(因此,你从“git pull”中得到错误的结果,因为你当时错误的存储库。

类似地,当 'sh' 第 2 行通过 eval 设置一些环境变量(即 SSH_AUTH_SOCK)时,它们也会在 shell 退出时立即丢失,因此后续的 'ssh-add' 不知道代理在哪里。

Jenkins                                Interactive

jenkins                                sshd
├─ shell                               └─ shell
│  └─ cd /var/atlassian/etc               ├─ cd /var/atlassian/etc
├─ shell                                  ├─ eval $(ssh-agent)
│  └─ eval $(ssh-agent)                   ├─ ssh-add
├─ shell                                  └─ git pull
│  └─ ssh-add
└─ shell
   └─ git pull

为了避免这种情况,请将所有东西都作为单身的脚本:

sh: 'cd /var/foo && eval $(ssh-agent) && ssh-add && git pull <url>'

cd您还可以通过使用-C选项告诉 Git 自行执行此操作来避免使用手册: git -C /var/foo pull <url>

相关内容