从 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

在 AWS ECS 上挂载 S3 存储桶

Jenkins - 动态选择参数 - 从列表中删除文件扩展名

如何在 AWS ECS 集群的服务中运行 AWS ECS 任务,而不是将服务从 Circle CI 的“aws-ecs/run-task”中排除