Ехото е изключено в изхода на Jenkins Console

Следвам указания как да подписвам Android apk с Jenkins. Параметризирах работа на Jenkins с KSTOREPWD и KEYPWD. Част от конфигурацията на работата на Jenkins (Build->Execute shell) е да вземе тези параметри и да ги съхрани като променливи на средата:

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

Проблемът е, че когато изграждането приключи, всеки може да получи достъп до "Console Output" на изграждането и да види какви пароли са въведени; част от този резултат:

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 ще зададе propсвойство на вашия проект.

Във вашия случай това би изглеждало по следния начин

въведете описание на изображението тук

И можете да го използвате във вашия 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