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

问题描述 投票:3回答:3

我想在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 jenkins-pipeline
3个回答
4
投票

如果将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", " ")


1
投票

我没有用这种方式使用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
        '''
    }
...

0
投票

你尝试过类似的东西:

docker stop `docker ps -aq`

?

© www.soinside.com 2019 - 2024. All rights reserved.