Jenkins Docker管道未通过退出代码

iq3niunx  于 2022-12-03  发布在  Jenkins
关注(0)|答案(2)|浏览(263)

我们在jenkins docker stages上遇到了一些问题,它们需要以root权限运行(args root:root)。此时,我不能100%回忆起他们为什么做出这个决定,但几个月前我无法回避这个问题。
我们遇到的主要问题是root:root是jenkins不能清理自己,因为docker文件系统由root用户所有。
因此,我在我的全局groovy库中创建了一些mascarade命令

def container_init (myUserId) {
    sh( returnStdout: true, script: """/usr/sbin/useradd -u ${myUserId} dummy;""").trim()
}
def command (input) {
    sh( returnStdout: true, script: """su dummy -c '${input}';""").trim()
}

现在的问题是,有些docker_mask.command()没有传递失败的e2e测试或者失败的terraform部署的退出代码,有些通过了,而且非常令人兴奋,但是不一致。
我能做点什么让你顺利退出吗

kkbh8khc

kkbh8khc1#

tldr

您想要/期待的退出代码被su命令吞噬了。

长版本

基本上,您的退出代码将始终是0,因为您成功地切换到了dummy用户。
解决这个问题“快速而又不太干净”的方法是执行以下操作

su dummy -c '${input}; exit $?'

这将弹出您所期望的退出代码。

相关事件:

我假设您正在尝试解决此处描述的一些难题:https://github.com/jenkinsci/docker-workflow-plugin/pull/57
我主动提出的0.02美元是,这种方法有很多陷阱/“步兵枪”,加上Jenkins和Docker引入的诡计也无济于事。仅仅依赖退出代码将是不可预测的,很难调试,或者几乎不可能干净地取消作业(至少在我的经验中是这样🥲),所以无论你找到什么解决方案,请务必谨慎。

lpwwtiir

lpwwtiir2#

您所面临的问题似乎与Jenkins管道中root:root参数的使用有关。使用root:root作为Docker容器的用户和组可能会导致问题,例如您提到的Jenkins无法清理自身,因为Docker文件系统由root用户所有。
这个问题的一个解决方案是避免使用root:root作为Docker容器的用户和组,而是使用Jenkins有权访问和修改的用户和组。这将允许Jenkins在自己之后进行清理,并避免退出代码的问题。
另一个可能的解决方案是对Docker容器使用jenkins用户和组。这将允许Jenkins以必要的权限运行Docker容器,同时仍然允许它在自己之后进行清理。
最后,您可以考虑在管道中使用docker.withRegistry方法,它允许您指定注册表和凭据来拉入和推送Docker映像。这可以帮助您在Jenkins管道中使用Docker时避免权限和退出代码问题。

相关问题