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命令。
具体修正点
- 用
sh步骤执行AWS命令:所有系统命令必须放在sh块中执行。 - 修正
batch-delete-image参数:--repository-name应传入仓库名(如testio),而非带标签的完整URI--image-ids需要指定imageTag=你的标签格式,不能直接填URI
- 统一参数命名:输入参数选择的是镜像标签,将参数名从
IMAGE_NAME改为IMAGE_TAG,避免和环境变量中的仓库名混淆 - 处理无标签镜像:在
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
相关产品推荐
相关产品推荐

