You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何跨AWS账号将S3 Bucket文件列表设为Jenkins Choice Parameter

在Jenkins声明式管道中配置跨账号S3文件列表作为Choice Parameter

核心方案

声明式管道的默认参数是静态的,要实现动态加载跨账号S3文件列表,需借助Active Choices插件(功能更灵活)结合AWS跨账号角色凭证来实现,以下是具体步骤:

1. 必备插件安装

  • 安装Active Choices Plug-in
  • 安装AWS Credentials Plugin和AWS SDK Plugin,用于处理AWS身份验证和跨角色访问

2. 配置跨账号角色凭证

在Jenkins凭证管理中添加类型为AWS Role ARN的凭证,填入目标AWS账号的跨角色ARN(格式:arn:aws:iam::目标账号ID:role/跨账号角色名),同时确保当前Jenkins所在环境(如EC2实例的IAM角色)拥有sts:AssumeRole权限来扮演这个跨账号角色。

3. 声明式管道代码实现

直接在管道中编写动态参数逻辑,通过STS获取跨角色凭证后调用S3 API获取文件列表:

pipeline {
    agent any
    parameters {
        activeChoiceParam(name: 'TARGET_S3_FILE',
            description: '选择目标S3桶中的文件',
            filterable: true,
            choiceType: 'SINGLE_SELECT',
            script: {
                // 导入AWS SDK类
                import com.amazonaws.services.s3.AmazonS3ClientBuilder
                import com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider

                // 配置跨账号角色信息
                def crossAccountRoleArn = 'arn:aws:iam::123456789012:role/jenkins-cross-account-s3-role'
                def sessionName = 'jenkins-s3-fetch-session'
                
                // 获取跨角色凭证
                def credentialsProvider = new STSAssumeRoleSessionCredentialsProvider.Builder(
                    crossAccountRoleArn, sessionName
                ).build()

                // 初始化S3客户端
                def s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(credentialsProvider)
                    .withRegion('us-east-1') // 替换为你的S3桶区域
                    .build()

                // 指定目标桶名,获取文件列表(排除文件夹)
                def targetBucket = 'my-target-cross-account-bucket'
                def objectSummaries = s3Client.listObjects(targetBucket).getObjectSummaries()
                def fileOptions = objectSummaries.findAll { !it.getKey().endsWith('/') }.collect { it.getKey() }

                return fileOptions
            }
        )
    }
    stages {
        stage('验证选择') {
            steps {
                echo "选中的S3文件路径: ${params.TARGET_S3_FILE}"
            }
        }
    }
}

4. 权限与调试要点

  • 目标账号的跨角色必须配置s3:ListBucket权限,允许访问指定的S3桶
  • 如果需要过滤特定前缀的文件,改用listObjectsV2并传入prefix参数,例如:
    def objectSummaries = s3Client.listObjectsV2(targetBucket, 'release-packages/').getObjectSummaries()
    
  • 若遇到权限报错,可在脚本中添加echo语句打印凭证获取状态或S3请求详情,方便排查

内容的提问来源于stack exchange,提问作者Kratika Tripathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:45:43