在Jenkins管道shell中运行嵌套命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Jenkins管道shell中运行嵌套命令相关的知识,希望对你有一定的参考价值。

我想在Jenkins管道中运行嵌套的shell命令,例如:

docker stop $(docker ps -aq)

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

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

Jenkins似乎没有正确运行它们,但输出:

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

我尝试在bash下运行命令,就像告诉这里:Run bash command on jenkins pipeline但最终有类似的问题。任何想法如何解决这个问题?

答案

如果将shell命令扩展为两行,Jenkins管道将变得更容易:

  • 第一个捕获要停止的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", " ")

另一答案

我没有用这种方式使用docker stop命令,但docker rm命令的语法相同。管道代码块+ OP的行例如:

...
    withEnv(["port=$port", "user=$user", "env=$env"]) {
        sh '''
            ssh -p $port $user@$env docker rm \$(docker ps -aq) || true; \
            ssh -p $port $user@$env docker rmi \$(docker images -aq) || true; \
            ssh -p $port $user@$env docker stop \$(docker ps -aq) || true
        '''
    }
...
另一答案

你尝试过类似的东西:

docker stop `docker ps -aq`

?

以上是关于在Jenkins管道shell中运行嵌套命令的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何 Maven 命令可以在 Jenkins shell 上运行来分析 SonarQube 中的打字稿代码?

在 jenkins 中运行命令 shell

带有容器的 Jenkins Docker Sidecar 运行守护程序命令

Flyway with Jenkins - 无法解析位置

Jenkins 管道 sh 在 Windows 上因“无法运行程序 nohup”而失败

以root用户运行jenkins中shell命令 重要