Как сохранить все команды оболочки при использовании переменных в Jenkinsfile? - PullRequest
0 голосов
/ 04 октября 2018
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 -gration-GWZMSYY6XHJA7QDBD4KWGXZCOVUKOBI35JMKYOQV76QXZTCYage * 100 * * * * * * *] LOGIN

То, что случилось с пользователем jenkins, которого я указал, похоже, было урезано из команды.Есть ли способ сохранить его?

1 Ответ

0 голосов
/ 04 октября 2018

При вызове метода sh с returnStdout: true часто выводится новая строка с выходными данными.Если вы присваиваете этот вывод переменной, то результирующее строковое значение также будет содержать символ новой строки.Это означает, что ваш sh "usermod -d ${WORKDIR} jenkins" будет usermod -d /var/lib/jenkins/workspace/-www_feature_ci-integration-GWZMSYY6XHJA7QDBD4KWGXZCOVUKOBI35JMKYOQV76QXZTCYE6CA\n jenkins".Затем команда будет выполнена без пользовательского аргумента jenkins.

Чтобы исправить это, вы можете использовать метод .trim() для удаления новой строки (и конечного пробела).

Thisпроще всего это сделать с помощью:

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

во время присваивания или:

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

во время интерполяции строки.

...