在Jenkins控制台输出中回声

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

我正在关注guideline如何用Jenkins签名安卓apk。我已经使用KSTOREPWD和KEYPWD参与了Jenkins的工作。 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命令之后重新启用echo。

jenkins android-gradle echo android-keystore
3个回答
99
投票

默认情况下,Jenkins使用set -x启动Execute Shell脚本。这会导致所有命令都被回显

您可以在任何命令之前键入set +x以临时覆盖该行为。当然你需要set -x再次开始展示它们。

您可以通过将以下内容置于构建步骤的顶部来覆盖整个脚本的此行为: #!/bin/bash +x


1
投票

在您的特定情况下(使用gradle和jenkins),您还可以使用密码参数,使用Gradle's pattern for environment variablesORG_GRADLE_PROJECT_prop)。Gradle将在您的项目中设置propproperty。

在你的情况下,这看起来像这样

enter image description here

你可以在你的gradle.properties中使用它

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

顺便说一句 - 我建议使用credentials binding plugin用于KEYSTORE enter image description here


1
投票

这是一个如何在sh中编写Jenkinsfile参数的示例,没有以更安全的方式输出,如official documentation中所述。 set +xthis answer写的主要魔法。

单引号将导致shell将密钥扩展为环境变量。由于Groovy插入了秘密,因此双引号可能不太安全,因此典型的操作系统进程列表(以及Blue Ocean和经典用户界面中的管道步骤树)将意外地泄露它:

node {
  withCredentials([string(credentialsId: 'mytoken', variable: 'TOKEN')]) {
    sh /* WRONG! */ """
      set +x
      curl -H 'Token: $TOKEN' https://some.api/
    """
    sh /* CORRECT */ '''
      set +x
      curl -H 'Token: $TOKEN' https://some.api/
    '''
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.