Отключение эха в выводе консоли Jenkins

Я следую руководству, как подписать Android apk с помощью Jenkins. Я параметризовал работу Дженкинса с помощью KSTOREPWD и KEYPWD. Часть конфигурации задания Jenkins (Build-> Execute shell) состоит в том, чтобы принять эти параметры и сохранить их как переменные среды:

export KSTOREPWD=${KSTOREPWD}
export KEYPWD=${KEYPWD}
...
./gradlew assembleRelease

Проблема в том, что когда сборка завершена, любой может получить доступ к сборке «Вывод консоли» и увидеть, какие пароли были введены; часть этого вывода:

08:06:57 + export KSTOREPWD=secretStorePwd
08:06:57 + KSTOREPWD=secretStorePwd
08:06:57 + export KEYPWD=secretPwd
08:06:57 + KEYPWD=secretPwd

Поэтому я хотел бы подавить эхо перед выводом из export команд и снова включить эхо после export команд.


person Marian Paździoch    schedule 07.11.2014    source источник
comment
подробный ответ на суперпользователя: suppress-execution-trace-for-echo-command   -  person TT--    schedule 20.01.2019


Ответы (3)


По умолчанию Jenkins запускает сценарий Execute Shell с set -x. Это вызывает отображение всех команд

Вы можете ввести set +x перед любой командой, чтобы временно отменить это поведение. Конечно, вам понадобится set -x, чтобы снова начать их показ.

Вы можете переопределить это поведение для всего скрипта, поместив в начало этапа сборки следующее:
#!/bin/bash +x

person Slav    schedule 07.11.2014
comment
Между прочим, я обнаружил, что #!/bin/bash тоже у меня работает. - person vikingsteve; 08.02.2016

Вот пример того, как записать параметр sh в Jenkinsfile без вывода более безопасным способом, как это предлагается в официальная документация. set +x выполняет основную магию, как было написано в этом ответе.

Одиночные кавычки приведут к тому, что секрет будет расширен оболочкой как переменная среды. Двойные кавычки потенциально менее безопасны, поскольку секрет интерполируется Groovy, и поэтому типичные списки процессов операционной системы (а также Blue Ocean и дерево шагов конвейера в классическом пользовательском интерфейсе) случайно его раскроют:

Небезопасное, неправильное использование:

node {
  withCredentials([string(credentialsId: 'mytoken', variable: 'TOKEN')]) {
    sh /* WRONG! */ """
      set +x
      curl -H 'Token: $TOKEN' https://some.api/
    """
  }
}

Правильное использование ✅:

node {
  withCredentials([string(credentialsId: 'mytoken', variable: 'TOKEN')]) {
    sh '''
      set +x
      curl -H 'Token: $TOKEN' https://some.api/
    '''
  }
}
person IvanRublev    schedule 15.03.2019
comment
Вам не нужно использовать set + x в вашей оболочке, блок withCredentials гарантирует, что пароль не выводится на консоль, заменяя любой вывод учетных данных на ****. - person jrodriguez; 25.02.2020
comment
@jrodriguez во многих случаях да. В то же время этот ответ относится к остальным случаям, когда это не так. :) - person IvanRublev; 26.02.2020

В вашей конкретной ситуации (используя gradle и jenkins) вы также можете использовать параметр пароля, используя шаблон Gradle для переменных среды (ORG_GRADLE_PROJECT_prop). Gradle затем установит propproperty в вашем проекте.

В вашем случае это будет выглядеть примерно так

введите описание изображения здесь

И вы можете использовать его в своем gradle.properties вот так

signingConfigs {
    release {
        storeFile file(KEYSTORE)
        storePassword KSTOREPWD
        keyAlias ALIAS
        keyPassword KEYPWD
    }
}

Кстати - я рекомендую использовать плагин привязки учетных данных для KEYSTORE < a href = "https://i.stack.imgur.com/Tfb4s.png" rel = "nofollow noreferrer"> введите описание изображения здесь

person schnatterer    schedule 06.06.2016