git pull
由于某种原因不适用于詹金斯。我已经更新了本地 PC 上的一些文件并将其推送到我的 Github。我可以看到那里的变化。然后我运行 Jenkins 构建,它有 sh 命令从这个 repo 中提取,它说“已经是最新的”。这是错误的,因为我清楚地将新版本推送到了 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'
}
}
}
}
据我所知,
sh '...'
Jenkins 中的每个命令都通过一个单独的 /bin/sh 进程运行,因此对进程级环境的任何更改仅在该特定命令运行时才会保留。例如,
cd
in 'sh' 行#1 只影响第一个 /bin/sh 实例——一旦处理该行,shell 就会退出并且所有更改都将丢失。第 2 行然后在一个全新的 /bin/sh 中处理,它继承了Jenkins 的原始工作目录。(所以你从“git pull”得到错误的结果,因为你当时在错误的存储库中。)同样,当'sh' line #2 通过eval 设置一些环境变量(即SSH_AUTH_SOCK)时,它们在shell 退出时也会立即丢失,因此后面的'ssh-add' 不知道代理在哪里。
为避免这种情况,请将所有内容作为单个脚本运行:
cd
您还可以通过使用-C
告诉 Git 自己做的选项来避免对手册的需求:git -C /var/foo pull <url>
.