从 jenkins 文件动态更新 AWS Task definition.json 文件
Posted
技术标签:
【中文标题】从 jenkins 文件动态更新 AWS Task definition.json 文件【英文标题】:Update AWS Task definition.json file from jenkins file dynamically 【发布时间】:2020-10-31 12:33:42 【问题描述】:我在 Gitlab 存储库中有一个 AWS ECS 任务定义.json 文件,我正在从我的 jenkins 文件中调用它来创建新的任务定义。
任务定义文件中的所有内容,即容器定义细节都是硬编码的。但我希望将 ECR 中的 docker 映像路径动态传递给相同的路径。
谁能帮帮我。
【问题讨论】:
【参考方案1】:在这种情况下,您需要在将 json 文件推送到 AWS 之前对其进行预处理。您可以使用 sed
将占位符或默认值替换为当前管道的值 - 它应该足以满足您的需求。
【讨论】:
【参考方案2】:你需要两个步骤
创建新修订版 针对上述修订添加新的任务定义但我希望将 ECR 中的 docker 映像路径动态传递给相同的路径。
以下脚本将完全满足您的需求,您只需定义或替换这些 ENV
TAG="BUILD_NUMBER"
NODE_ENV="development"
AWSREGION="us-west-2"
创建revision.sh
# task defintion dyanmic variable
TAG="BUILD_NUMBER"
NODE_ENV="development"
AWSREGION="us-west-2"
# Creae new revesion
NEW_TASK_DEFINITION=$(echo `cat <<EOF
"containerDefinitions": [
"portMappings": [
"hostPort": 3000,
"protocol": "tcp",
"containerPort": 3000
],
"environment":
[
"name": "NODE_ENV",
"value":"$NODE_ENV"
],
"ulimits": [
"name": "nofile",
"softLimit": 65536,
"hardLimit": 95536
],
"logConfiguration":
"logDriver": "awslogs",
"options":
"awslogs-group": "$ENV_nodejs",
"awslogs-region": "$AWSREGION",
"awslogs-stream-prefix": "ecs"
,
"memoryReservation": 500,
"image": "1234.dkr.ecr.$AWSREGION.amazonaws.com/test/nodejs:$TAG",
"name": "$ENV-nodejs"
],
"family": "$ENV-nodejs"
EOF`
)
echo "New Revesion"
echo "$NEW_TASK_DEFINITION" | python -m json.tool
#####################
#####Step 2#########
# Registering New Task Definition,
aws ecs register-task-definition --region $AWSREGION --cli-input-json "$NEW_TASK_DEFINITION"
如果您想从管道中调用此脚本,那么您需要进行这些更改。
# task defintion dyanmic variable
TAG="$1"
NODE_ENV="$2"
AWSREGION="$3"
.
.
.
所以调用这个脚本
./update_task.sh build_tag development us-west-2
【讨论】:
谢谢,所以你建议我在我的 git 分支中创建这个 shell 脚本文件并从我的 jenkins 管道脚本中调用它并动态传递参数给它,对吗? 是的,它是正确的,但是如果将其作为脚本调用,则需要进行一些更改 我相应地更新了问题以使用 Jenkins 文件。 谢谢..你能告诉我如何从我在jenkins中的内联管道脚本或jenkis文件中调用gitlab中的revision.sh文件, 我不确定 gitlib,但是你可以从 gitlib 传递环境变量吗?【参考方案3】:@Adiii 描述的整体方法没问题,只要来自 ECR 的 Docker 映像是每次部署中唯一改变的东西。请记得force a new deployment afterwards,并附上:
aws ecs update-service --force-new-deployment # ... cluster and service here
仅供分享,另请参阅ecs-deploy 和yoke,以防您正在寻找一些可重用的组件。他们还支持更改任务定义,例如更改新的环境变量。后者(我正在参与其中)也可以通过适当的模板引擎使其适用于每个环境。
【讨论】:
以上是关于从 jenkins 文件动态更新 AWS Task definition.json 文件的主要内容,如果未能解决你的问题,请参考以下文章
git aws.push 从服务器中删除动态创建的文件 [重复]
如何从 AWS Elastic BeanStalk 获取更新的“上传”文件夹?
Jenkins:使用 docker compose 部署到 AWS ECS
Jenkins - 动态选择参数 - 从列表中删除文件扩展名
如何在 AWS ECS 集群的服务中运行 AWS ECS 任务,而不是将服务从 Circle CI 的“aws-ecs/run-task”中排除