问题描述
我有一个带有单个JenkinsBuild.jk设置的CI / CD管道,只要将pull Request合并到master分支,该设置就会自动触发。
我在JenkinsBuild中有一堆命令,例如'docker build'和'docker push',它们创建了类似docker-images的版本:
x.36,x.37,x.38,x.39,x.40,x.41,x.42,x.43,x.44,x.45(将前缀“ x。”添加到删除未加标签的图像。
现在,当我不得不将少量dockerImage部署到生产而不是全部部署时,就会出现问题。示例-x.36,x.40和x.45是部署到产品的映像,其余所有映像都用于非产品环境以测试代码。
当我应用下面的ECR生命周期策略时,它将保留前5个映像,因此所有未部署到prod的版本也将被存储,而最近部署的那些版本将被删除。示例:前5个图像(即x.41,x.42,x.43,x.44,x.45)存储在ECR中,并且由于以下策略(x。 45张未删除,因为它是前5张图片之一。
{
"rulePriority": 1,"description": "Keep last 5 images","selection": {
"tagStatus": "tagged","tagPrefixList": ["x."],"countType": "imageCountMoreThan","countNumber": 5
},"action": {
"type": "expire"
}
}
有人可以帮我ECR策略如何仅删除非生产dockerImages吗?
或
我如何使用JenkinsDeploy.jk在产品部署期间以p.36,p.40,p.45覆盖dockerImages?
请提出您的建议。感谢您阅读我的帖子。
解决方法
由于没有生产ECR图像的图案,因此是手工挑选的。您需要在生产图像中添加一些标识符,并将其从您的ecr生命周期策略中保存。
一种方法是:
- 为每个要升级为产品的ECR图像重命名标签,即在升级之前手动运行此bash脚本:
./rename_tag.sh <repo_name> "x.36" "p.36"
REPO_NAME=$1
IMG_TAG=$2
NEW_TAGE=$3
MANIFEST=$(aws ecr batch-get-image --repository-name "$REPO_NAME" --image-ids imageTag="$IMG_TAG" --query 'images[].imageManifest' --output text)
aws ecr put-image --repository-name "$REPO_NAME" --image-tag "$NEW_TAG" --image-manifest "$MANIFEST"
aws ecr batch-delete-image --repository-name "$REPO_NAME" --image-ids imageTag="$IMG_TAG"
重命名后,您将使用第36页作为生产图像。
别忘了将您的ECR生命周期策略更新为:
{
"rules": [
{
"rulePriority": 1,"description": "Keep 10 production images","selection": {
"tagStatus": "tagged","tagPrefixList": ["p"],"countType": "imageCountMoreThan","countNumber": 10
},"action": {
"type": "expire"
}
},{
"rulePriority": 2,"description": "Keep 5 nonprod images","countNumber": 5
},"action": {
"type": "expire"
}
}
]
}
如果需要,您可以增加prod的数量,并且可以在JenkinsDeploy.jk中运行此脚本(可能基于构建成功),但是由于您说prod促销是手动的,因此手动调用它更有意义。