我可以像从此处获取的示例中所解释的那样获取凭据-https://jenkins.io/doc/book/pipeline/syntax/#environment
stage('Example') {
environment {
CREDS = credentials('MY_CREDS_DEV')
}
steps {
sh 'echo hello'
}
}
但是我要做的是根据某些条件获取凭据。
例如,我在Jenkins凭证中定义了MY_CREDS_DEV
和MY_CREDS_QA
。而且我在Jenkins的“准备运行环境”一节中定义了一个属性ENV=dev
。
我想根据自己的环境访问凭据,即 ENV 属性。
我尝试使用CREDS = credentials('MY_CREDS_' + ${ENV})
并尝试将字符串串联提取到一个单独的函数中,并像CREDS = credentials(concatenate(${ENV}))
那样调用它,但是我得到了Internal function call parameters must be strings.
所以看来我只能在credentials()
函数中放入一个字符串,这基本上意味着要对其进行硬编码。但是我该如何选择要使用的凭据-dev或qa?
答案 0 :(得分:1)
使用CREDS = credentials('MY_CREDS_' + ENV)
或CREDS = credentials("MY_CREDS_${ENV}")
。 ${ENV}
不会变成'dev'
,而是${'dev'}
,因此它不是字符串。
实际上-在使用groovy控制台播放后-似乎${ENV}
会尝试使用闭包参数$
调用名为{ENV}
的函数,该函数反过来会返回{{ 1}}。如果您定义了类似以下的函数,它将得到与'dev'
相同的结果:
ENV
但是很可能那不是您想要的。
答案 1 :(得分:0)
在詹金斯(Jenkins)中为我工作:2.190.2。尚未在较早版本上进行测试。碰巧是我现在正在使用的那个。
在Jenkins:2.190.2中使用一些常规方法进行了这项工作。尚未在较早版本上进行测试。碰巧是我现在的那个。在多个阶段都能正常工作。
pipeline {
agent {
label "xxxxx"
}
environment {
ROLE = getRole()
}
stages{
stage("write to s3 etc") {
environment {
AWS = credentials("${ROLE}")
}
steps {
script {
sh"""
aws s3 sync build/ "s3://xxxxxxxxxxxx"
"""
}
}
}
}
}
def getRole() {
def branchName = "${env.BRANCH_NAME}"
if (branchName == "xxxxxx") {
return 'some_credential_string'
}
else {
return 'some_other_credential_string'
}
}
答案 2 :(得分:-1)
如果您要根据条件使用其他凭据,可以使用以下示例进行操作:
stage ("Example") {
steps {
script {
if ( params.TEST_PARAMETER == "test_value1" ) {
withCredentials([string(credentialsId: env.CREDENTIALS_1, variable: 'SOME_VARIABLE')]) {
yourFunction()
}
}
else {
withCredentials([string(credentialsId: env.CREDENTIALS_2, variable: 'SOME_VARIABLE')]) {
yourFunction()
}
}
}
}
}
您需要在jenkinsfile的末尾定义yourFunction
。在这种情况下,当作业中TEST_PARAMETER
为test_value1
时,将从Jenkins凭证列表中使用CREDENTIALS_1
。当TEST_PARAMETER
不同时,将使用CREDENTIALS_2
凭据。通过将其修改为case循环,您可以有更多选择。
希望这会有所帮助。