【问题标题】:How to use user-scoped credentials in an AWS credentials parameter in Jenkins pipeline?如何在 Jenkins 管道的 AWS 凭证参数中使用用户范围的凭证?
【发布时间】:2020-09-23 11:45:54
【问题描述】:

我正在尝试访问通过管道作业中的参数提供的 AWS 凭证。

我有一个管道作业,我正在使用这样定义的 AWS 凭证参数:

credentials (
    credentialType: 'com.cloudbees.jenkins.plugins.awscredentials.AWSCredentialsImpl', 
    defaultValue: 'jenkins-deploy-proj', 
    description: '''
    My description
    ''', 
    name: 'AWS_ACCOUNT'
)

我是通过 Jenkins UI 中的“管道语法 > 声明性指令生成器 > 参数”获得的。

我需要稍后在工作中访问这些凭据。 From other discussions 似乎我应该使用 withCredentials 块来访问凭据,所以我尝试了这个

script {
    withCredentials([[
        $class: 'AmazonWebServicesCredentialsBinding', 
        accessKeyVariable: 'AWS_ACCESS_KEY_ID', 
        secretKeyVariable: 'AWS_SECRET_ACCESS_KEY',
        credentialsId: "${params.AWS_ACCOUNT}"
    ]]) {
        sh 'bash myscript.sh'
    }
}

我是通过 Jenkins UI 中的“管道语法 > 片段生成器 > withCredentials”获得的。

管道使用默认凭据(所有用户都可以访问)运行良好,但是当我尝试使用我的个人凭据(仍在全局域中)时,我收到来自 Jenkins 的错误,告诉我凭据不存在:

ERROR: Could not find credentials entry with ID '557ff283-70f3-402b-b065-fb4c9f28305e'

我可以在像这样配置的其他(非管道)Jenkins 作业中使用这些相同的凭据作为参数,并且它们工作正常:

我确实采取了额外的措施,通过创建一个新的凭据对象来确保问题不只是与那个凭据对象有关,但我得到了相同的 Could not find credentials entry with ID 错误。

【问题讨论】:

  • 听起来好像您的凭证尚未添加到 AWS 凭证插件设置的列表中。
  • 该设置是否特定于管道作业?我会检查一下,但奇怪的是非管道作业不需要该设置,而管道作业需要。
  • 管道也可以使用纯文本凭据,但这有安全隐患。
  • 是的。我在这里使用用户范围凭据的原因是因为我们想根据他们是否可以提供必要的凭据来锁定谁可以在给定环境中运行作业。因此,一组共享的凭据(或明文凭据)并没有太大帮助。此外,“共享凭据”方案无需修改即可工作。

标签: jenkins jenkins-pipeline jenkins-plugins


【解决方案1】:

我能够联系到 CloudBees 支持(他们在 Jenkins 之上提供工具和服务),他们提到了 JENKINS-58170 中引入的更改,该更改允许使用凭据参数的名称作为 id 来访问凭据.这是this CloudBees article about using user scoped credentials in pipeline jobs 中提到的解决方案。在这种情况下,解决方案看起来像:

script {
    withCredentials([[
        $class: 'AmazonWebServicesCredentialsBinding', 
        accessKeyVariable: 'AWS_ACCESS_KEY_ID', 
        secretKeyVariable: 'AWS_SECRET_ACCESS_KEY',
        credentialsId: 'AWS_ACCOUNT'
    ]]) {
        sh 'bash myscript.sh'
    }
}

这可能适用于许多 Jenkins 用户。

不过,这些改进来自 the credentials plugin 的 2.3 版。由于我们运行的是旧版本的插件,因此此功能不可用。

相反,我们不得不使用JENKINS-58170 中提到的“特殊语法”:credentialsId: '${credentialsParameterName}'。请注意,单引号在这里很重要!从票:

当前仅在使用以前的模板语法提供凭据 ID 时才查找用户范围的凭据

'{userScopedCredsParameterName}' 语法。

所以最终的工作管道定义如下所示:

script {
    withCredentials([[
        $class: 'AmazonWebServicesCredentialsBinding', 
        accessKeyVariable: 'AWS_ACCESS_KEY_ID', 
        secretKeyVariable: 'AWS_SECRET_ACCESS_KEY',
        credentialsId: '${AWS_ACCOUNT}'
    ]]) {
        sh 'bash myscript.sh'
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多