首页 > 解决方案 > 在 Jenkinsfile 中使用变量时如何保留所有 shell 命令

问题描述

stage('build') {
      environment {
        WORKDIR="""${sh(
                returnStdout: true,
                script: 'pwd'
            )}"""
      }
      steps {
        timeout(time: 5, unit: 'MINUTES') {
          sh "usermod -d ${WORKDIR} jenkins"
        }
      }
    }

上述结果给出

usermod -d /var/lib/jenkins/workspace/-www_feature_ci-integration-GWZMSYY6XHJA7QDBD4KWGXZCOVUKOBI35JMKYOQV76QXZTCYE6CA

用法:usermod [选项] LOGIN

我指定的用户发生了什么jenkins,似乎已从命令中删除。有办法保存吗?

标签: jenkinsgroovyjenkins-pipeline

解决方案


使用 调用sh方法时returnStdout: true,通常会在输出中返回换行符。如果将此输出分配给变量,则生成的字符串值也将包含换行符。这意味着你的sh "usermod -d ${WORKDIR} jenkins"意志usermod -d /var/lib/jenkins/workspace/-www_feature_ci-integration-GWZMSYY6XHJA7QDBD4KWGXZCOVUKOBI35JMKYOQV76QXZTCYE6CA\n jenkins"。然后该命令将在没有jenkins用户参数的情况下执行。

要解决此问题,您可以使用该.trim()方法删除换行符(和尾随空格)。

这可以通过以下任一方式轻松完成:

WORKDIR="""${sh(
             returnStdout: true,
             script: 'pwd'
           ).trim()}"""

在分配期间或:

sh "usermod -d ${WORKDIR.trim()} jenkins"

在字符串插值期间。


推荐阅读