【问题标题】:Escaping Dollar sign in Jenkins credentials在 Jenkins 凭据中转义美元符号
【发布时间】:2020-06-21 06:00:05
【问题描述】:

我有 test$001 作为 Jenkins 秘密文本凭据中的值。稍后在管道脚本中,我将访问该值并将其写入如下所述的 yaml 文件,该文件用作 K8S configmap。

问题在于值中的美元符号。

environment {
    TEST_CRED=credentials('TEST_CRED')
}

脚本.sh

cat << EOF > test.yaml
...
data:
 TEST: ${TEST_CRED}
EOF

预期:test$001

打印:test$$001(注意额外的美元符号会自动插入)

我尝试了所有可能来逃避这个美元符号,但没有任何效果。

TEST_01: '${TEST_CRED}'
TEST_02: ${TEST_CRED}
TEST_03: '$${TEST_CRED}'
TEST_04: $${TEST_CRED}
TEST_05: "$${TEST_CRED}"
TEST_08: $TEST_CRED

【问题讨论】:

  • 您能否尝试将 test\$001 而不是 test$001 放在 Jenkins 秘密文本凭据中,并尝试检查您是否获得了正确的值。因为根据您的测试用例,没有任何工作,这意味着在存储值时,Jenkins 用另一个 $ 符号对其进行了转义,因此 Jenkins 可以处理它。
  • @ShubhamVaishnav 我试过你的建议,现在这就是我得到的test\$$001

标签: bash jenkins yaml


【解决方案1】:

在 Jenkins 秘密文本凭据中存储值时,请转义美元符号。所以,test$001 实际上应该存储test\$001

以下作品适合我:

pipeline {
    agent any

    environment {
        MYTEST_CRED=credentials('TEST_CRED')
    }

    stages {
        stage('Special Char') {
            steps {
                sh """
                    cat << EOF > test.yaml
                    Name: test-config
                    Namespace: default
                    data:
                         TEST: ${MYTEST_CRED}
EOF
                """
            }
        }
    }
}

输出:

【讨论】:

    【解决方案2】:

    我根据您的要求进行了设置并获得了预期的结果。 设置如下图所示,

    1. 设置 Jenkins 秘密文本凭据
    2. 在 Jenkins 作业中设置绑定
    3. 配置构建以创建 test.yaml
    4. test.yaml 的内容
    $ cat test.yaml 
    ...
    data:
     TEST: test$001
    

    【讨论】:

    • 这不是管道工作,所以你无法比较它。
    • @MichaelKüller 这里唯一的关键点是 Jenkins 没有逃避它,我们得到的值与我们配置的相同。在管道作业的情况下,访问秘密的方式会改变,但值不会改变。所以,这可以用来检查我们是否得到了想要的结果。
    • 我认为问题并不那么简单,因为我也面临同样的问题,即使是在非管道工作中。我有一个 Maven 类型作业,其中我在 Maven 目标和选项字段中传递了凭据,并且那里的“$”字符加倍,我还没有找到解决方法。在“执行外壳”块中使用它时不会显示相同的行为,就像在您的示例中一样。
    【解决方案3】:

    这是一个示例,当我通过参数将未转义的字符串传递给 Jenkins 作业时。事情并不如我所愿。

    // Original and expected value. Works fine with pure groovy
    echo env.SECRET_VALUE
    test@U$3r
    
    // But this variable in shell is getting messed up
    
    // sh("\$ENV") and sh('$ENV') are using value of shell env variale
    
    sh("echo \$SECRET_VALUE")
    test@U$$3r
    
    sh('echo $SECRET_VALUE')
    test@U$$3r
    
    // sh("$ENV") and sh("${ENV}") are using value of groovy variables passed to the shell
    
    sh("echo $SECRET_VALUE")
    test@Ur
    
    sh("echo ${SECRET_VALUE}")
    test@Ur
    

    让我们尝试修复它

    env.ESCAPED_SECRET_VALUE = env.SECRET_VALUE.replaceAll(/(!|"|@|#|\$|%|&|\\/|\(|\)|=|\?)/, /\\$0/)
    
    // groovy variable is becoming a bit broken
    
    echo env.ESCAPED_SECRET_VALUE       
    test\@U\$3r
    
    // shell env variable is still broken
    
    sh("echo \$ESCAPED_SECRET_VALUE")
    test\@U\$$3r
    
    sh('echo $ESCAPED_SECRET_VALUE')
    test\@U\$$3r
    
    // But, if we will pass groovy env variable to the shell - it looks good
    
    sh("echo $ESCAPED_SECRET_VALUE")   
    test@U$3r
    
    sh("echo ${ESCAPED_SECRET_VALUE}")
    test@U$3r
    

    如果您直接在sh(script:"") 中使用命令,那么只需传递常规的 ESCAPE 变量。如果您需要调用 shell 脚本文件,请尝试将这个 groovy ESCAPE 变量的值作为输入参数传递给它

    例子:

    sh("./my_super_script.sh $ESCAPED_SECRET_VALUE")

    # my_super_script.sh 
    #!/bin/bash
    SECRET_VALUE=$1
    echo $SECRET_VALUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-17
      • 2021-07-01
      • 1970-01-01
      • 2022-11-22
      • 2020-01-19
      • 1970-01-01
      • 2017-02-19
      • 2021-04-25
      相关资源
      最近更新 更多