【问题标题】:Update AWS Task definition.json file from jenkins file dynamically从 jenkins 文件动态更新 AWS Task definition.json 文件
【发布时间】:2020-10-31 12:33:42
【问题描述】:

我在 Gitlab 存储库中有一个 AWS ECS 任务定义.json 文件,我正在从我的 jenkins 文件中调用它来创建新的任务定义。

任务定义文件中的所有内容,即容器定义细节都是硬编码的。但我希望将 ECR 中的 docker 映像路径动态传递给相同的路径。

谁能帮帮我。

【问题讨论】:

    标签: amazon-web-services jenkins jenkins-pipeline devops amazon-ecs


    【解决方案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-deployyoke,以防您正在寻找一些可重用的组件。他们还支持更改任务定义,例如更改新的环境变量。后者(我正在参与其中)也可以通过适当的模板引擎使其适用于每个环境。

      【讨论】:

        猜你喜欢
        • 2012-06-19
        • 2018-08-04
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-10
        • 1970-01-01
        • 2013-04-29
        相关资源
        最近更新 更多