在 Jenkins 控制台输出中回显

Posted

技术标签:

【中文标题】在 Jenkins 控制台输出中回显【英文标题】:Echo off in Jenkins Console Output 【发布时间】:2015-01-04 00:10:25 【问题描述】:

我正在关注guideline 如何使用 Jenkins 签署 android 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 命令之后重新启用回显。

【问题讨论】:

超级用户的详细回答:suppress-execution-trace-for-echo-command 【参考方案1】:

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

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

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

【讨论】:

顺便我发现#!/bin/bash 也为我工作。 有没有办法防止set +x本身以“临时”的方式被打印出来?【参考方案2】:

下面是一个示例,说明如何按照official documentation 中的建议,以更安全的方式在Jenkinsfile 中写入sh 参数而没有输出。 set +x 的主要魔力正如 this answer 中所写的那样。

单引号将 导致秘密被外壳扩展为环境 多变的。双引号可能不如秘密安全 由 Groovy 插值,所以典型的操作系统进程 列表(以及 Blue Ocean,以及 经典 UI)会不小心泄露出来:

不安全,错误的用法:

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/
    '''
  

【讨论】:

您不需要在 shell 中设置 'set +x',withCredentials 块将确保不会将 passowrd 打印到控制台,将凭证的任何输出替换为 '****' . @jrodriguez 在很多情况下确实如此。同时,此答案适用于其他情况,但并非如此。 :)【参考方案3】:

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

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

您可以像这样在gradle.properties 中使用它

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

顺便说一句-我建议将credentials binding plugin 用于KEYSTORE

【讨论】:

以上是关于在 Jenkins 控制台输出中回显的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins REST API 获取作业和作业控制台日志

从git pull和git fetch到txt文件中回显git消息/输出

如何在批处理文件中回显换行符?

如何在 PHP 中回显 HTML?

如何使用 php 在 WordPress 插件中回显 json 数据 [重复]

如何在laravel刀片中从json解码中回显键名和键值