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

Jenkins任务通过下拉选择删除AWS ECR镜像报错,求修复方案

问题:Jenkins任务删除AWS ECR镜像报错

我想要实现一个Jenkins任务,通过下拉菜单选择并删除AWS ECR中的Docker镜像:

pipeline {
    agent any
    environment {
      AWS_ACCOUNT_ID="123456"
      AWS_DEFAULT_REGION="us-east-1"
      IMAGE_NAME="testio"
      IMAGE_TAG="latest"
      REPOSITORY_URI = "123456.dkr.ecr.us-east-1.amazonaws.com/testio:latest"
      REPOSITORY_NAME = "testio"
    }

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
                script {
                    INPUT_IMAGE_TO_DELETE = input message: 'Please Select Docker Image to delete', ok: 'Next',
                                                          parameters: [
                                                          choice(name: 'IMAGE_NAME', choices: getDockerImages(), description: 'Select Docker Image to delete')]
                                                          
                    aws ecr batch-delete-image --region $AWS_DEFAULT_REGION --repository-name $REPOSITORY_URI --image-ids "$REPOSITORY_URI"
                                      
                }
            }
        }
    }
}

def getDockerImages() {
    output = sh(returnStdout: true, script: "aws ecr list-images --repository-name testio --output json").trim()
    json = readJSON text: output
    println json
    return json.imageIds.imageTag
}

镜像名称已成功填充到下拉菜单中,但我遇到了如下错误:

groovy.lang.MissingPropertyException: No such property: ecr for class: groovy.lang.Binding
    at groovy.lang.Binding.getVariable(Binding.java:63)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:285)

解决方法

错误原因

直接在Groovy脚本中写aws ecr ...会被Groovy解析为调用变量aws的ecr属性,但这个变量不存在,因此报错。必须通过Jenkins的sh步骤执行shell命令。

具体修正点

  1. 用sh步骤执行AWS命令:所有系统命令必须放在sh块中执行。
  2. 修正batch-delete-image参数:
    • --repository-name应传入仓库名(如testio),而非带标签的完整URI
    • --image-ids需要指定imageTag=你的标签格式,不能直接填URI
  3. 统一参数命名:输入参数选择的是镜像标签,将参数名从IMAGE_NAME改为IMAGE_TAG,避免和环境变量中的仓库名混淆
  4. 处理无标签镜像:在getDockerImages中过滤出带有imageTag的镜像,避免空值报错

修正后的完整代码

pipeline {
    agent any
    environment {
      AWS_ACCOUNT_ID="123456"
      AWS_DEFAULT_REGION="us-east-1"
      REPOSITORY_NAME = "testio"
      REPOSITORY_URI = "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${REPOSITORY_NAME}"
    }

    stages {
        stage('Delete ECR Image') {
            steps {
                script {
                    // 获取用户选择的镜像标签
                    def selectedTag = input message: '请选择要删除的Docker镜像标签', ok: '确认删除',
                                 parameters: [
                                    choice(name: 'IMAGE_TAG', choices: getDockerImages(), description: '选择要删除的镜像标签')
                                 ]
                    
                    // 执行删除命令
                    sh """
                        aws ecr batch-delete-image \
                            --region ${AWS_DEFAULT_REGION} \
                            --repository-name ${REPOSITORY_NAME} \
                            --image-ids imageTag=${selectedTag}
                    """
                    echo "已成功删除镜像: ${REPOSITORY_URI}:${selectedTag}"
                }
            }
        }
    }
}

def getDockerImages() {
    def output = sh(returnStdout: true, script: "aws ecr list-images --repository-name ${REPOSITORY_NAME} --output json").trim()
    def json = readJSON text: output
    // 过滤出带有imageTag的镜像,并提取标签列表
    return json.imageIds.findAll { it.imageTag }.collect { it.imageTag }
}

内容的提问来源于stack exchange,提问作者Peter Penzov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:47:38