带有特殊字符的 Jenkins Secret 在 Shell 脚本中被截断

问题描述 投票:0回答:1

我在 Jenkins 中面临一个问题,其中包含特殊字符(特别是 $ 和 =)的秘密在 shell 脚本中使用时会被截断。详情如下:

我在 Jenkins 中有一个秘密,存储以下字符串:

111111-d032-40bd-b87d1153a9430e92$fmN1pdifFkespherhHjIO70KjIzZfqjevCGY3kAbxjU=

我在 Jenkins 管道中使用这个秘密,如下所示:

string(credentialsId: "${env.PREFIX}-mes-client-secret", variable: 'MYSECRET'),
sh "echo MYSECRET ='$MYSECRET' >> ${env.ENV_FILE}"

但是,当我检查 .env 文件中的输出时,字符串在 $ 处被截断并替换为 =

我怀疑 Jenkins 将 $ 误解为变量替换。如何确保秘密正确传递到我的 shell 脚本中而不被截断或更改?

我尝试过的: 将 credentialId 周围的双引号更改为单引号,但这似乎没有按预期工作。 寻找方法来逃避秘密中的 $,但我还没有找到有效的解决方案。

环境: 詹金斯版本:最新 管道类型:声明式 任何帮助或建议将不胜感激!

jenkins jenkins-pipeline special-characters
1个回答
0
投票

首先您可能想看一下 管道语法

这个问题与 Jenkins 如何处理包含特殊字符的字符串有关,尤其是 $,它将其解释为变量替换。为了防止 Jenkins 误解你的秘密,你可以尝试以下方法:

1-逃离美元符号

string(credentialsId: "${env.PREFIX}-mes-client-secret", variable: 'MYSECRET'),
sh "echo MYSECRET ='\\$MYSECRET' >> ${env.ENV_FILE}"

2- 使用单引号

string(credentialsId: "${env.PREFIX}-mes-client-secret", variable: 'MYSECRET'),
sh 'echo MYSECRET ="$MYSECRET" >> ${env.ENV_FILE}'

3-安全凭证处理和上下文执行

withCredentials([string(credentialsId: "${env.PREFIX}-mes-client-secret", variable: 'MYSECRET')]) {
    dir("/<your directory>/") {
        add_secret_to_file = sh (
            returnStdout: true,
            script: """
                echo MYSECRET ='\\$MYSECRET' >> ${env.ENV_FILE}
            """
        )
    }
}

withCredentials([string(credentialsId: "${env.PREFIX}-mes-client-secret", variable: 'MYSECRET')]) {
    dir("/<your directory>/") {
        add_secret_to_file = sh (
            returnStdout: true,
            script: """
                echo MYSECRET = $MYSECRET >> ${env.ENV_FILE}
            """
        )
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.