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>
。