我可以查询AWS ECR以在jenkins中填充主动选择反应参数吗



我想使用主动选择参数插件来搜索AWS ECR图像标签,并在基于另一个选择参数的Jenkins声明性脚本中显示一个动态过滤的结果列表作为参数选项。

假设我的jenkins控制器(和代理(节点安装了awscli,并且具有访问ECR存储库所需的IAM角色权限,并且有一个名为"ENVIRONMENT"的单独的choiceParam,我想运行以下命令:

aws ecr list-images --region us-east-1 --repository-name web-app --query "imageIds[?starts_with(imageTag,'${ENVIRONMENT}')].imageTag" --output text

并返回显示为选项的结果;使用参数构建";。我看到有证据表明,其他人已经通过主动选择-反应参数实现了这一点,但我没有成功实现。

如果我插入Jenkins控制器(k8s上的docker容器(并执行上面的命令,我会得到所需的结果,没有问题。在groovy脚本控制台中进行了大量实验后,我已经找到了转义引号的正确语法,并尝试了以下几种groovy代码的格式:

def command = "aws ecr list-images --region us-east-1 --repository-name web-app --query "imageIds[?starts_with(imageTag,'${ENVIRONMENT}')].imageTag" --output text"
def output = command.execute()
def images = output.text.tokenize()
return images

无论我将$ENVIRONMENT选项参数更改为什么,这个脚本的结果都是[None]。我绝对相信应该会返回结果,因为有些图像的标记以$environmental开头,我可以在我的jenkins控制器上的shell中运行相同的awscli命令并查看结果。

我已经尝试过在jenkins_host/scriptApproval/with";groovy沙箱";选项打开和关闭。

基于我看到的其他stackOverflow答案,我尝试了许多"命令"行措辞的变体,包括:

def command = "aws ecr list-images --region us-east-1 " + 
"--repository-name web-app " +
" --query "imageIds[?starts_with(imageTag,'${ENVIRONMENT}')].imageTag" "+ 
"--output text"
// or 
def command = ["aws", "ecr", "list-images", "--region", "us-east-1", "--repository-name", "web-app", "--query", ""imageIds[?starts_with(imageTag,'${ENVIRONMENT}')].imageTag"", "--output", "text"]

所有返回相同的结果:[None]

我错过了什么?提前感谢您的帮助。

如果其他人想知道的话,我真的很难解决这个问题,但最终发现,由于某种原因,我不完全理解Jenkins在计算aws命令的查询部分时遇到了问题。我也无法让grep或jq工作。因此,最终我让groovy处理命令的过滤部分,下面的groovy脚本对我有效

def cmd = "aws ecr list-images --region us-east-1 --repository-name app --output text"
def output = cmd.execute()
output.waitFor()
def imageList = output.in.text.tokenize().toUnique().sort().reverse()
def images = imageList.findAll { it =~ /^$ENVIRONMENT-(.*)/ }
return images

最新更新