一尘不染

在Jenkins管道外壳中运行嵌套命令

jenkins

我想在Jenkins管道中运行像这样的嵌套shell命令:

docker stop $(docker ps -aq)

不幸的是,当我将其格式化为管道语法时:

sh('docker stop $(docker ps -aq)')

Jenkins似乎无法正确运行它们,但是输出:

"docker stop" requires at least 1 argument(s).

我试图在bash下运行命令,如下所示:
在jenkins管道上运行bash命令, 但最终遇到类似的问题。任何想法如何解决这个问题?


阅读 402

收藏
2020-07-25

共1个答案

一尘不染

如果将shell命令扩展为两行,这对于Jenkins Pipeline来说将变得更加容易:

  • 第一个捕获要停止的Docker容器。
  • 第二个命令停止在第一个命令中捕获的那些Docker容器。

我们使用第一行将shell命令的输出捕获到一个变量中:

containers = sh(returnStdout: true, script: 'sudo /usr/bin/docker ps -aq')

然后,我们使用第二个命令对存储在变量中的第一个命令的捕获输出进行操作:

sh("sudo /usr/bin/docker stop $containers")

请注意,该docker命令通常适合与docker ps -aq其他命令一起使用的输出,但是如果它不喜欢存储在变量中的输出,则可以按照以下方式重新格式化:

containers = sh(returnStdout: true, script: 'sudo /usr/bin/docker ps -aq').trim()

例如,这将删除开头的空白和结尾的换行符。Docker CLI通常并不关心这一点,但是在这里可能需要重新格式化。

由于在此处删除换行符会导致合并的容器ID较长,因此(如您所述),我们需要用空格替换它来界定容器ID。这样就可以格式化存储在containers变量中的字符串:

containers = sh(returnStdout: true, script: 'sudo /usr/bin/docker ps -aq').replaceAll("\n", " ")

2020-07-25