在AWS ECS EC2中使用Jenkins更新任务定义

时间:2018-12-18 07:38:00

标签: shell jenkins amazon-ecs

我有两个任务在单个任务定义中运行(将该服务的期望计数设置为2),我正在使用Jenkins进行连续部署。更新服务任务时,首先,我需要关闭两个正在运行的任务。

我正在尝试这样做

首先使用

获取当前任务
def currentTask = sh (
      returnStdout: true,
      script:  " aws ecs list-tasks  --cluster ${clusterName} --family  ${taskFamily} --output text | egrep 'TASKARNS'| awk '{print \$2}' "
     ).trim()

然后使用

停止该任务
if (currentTask) {
sh "aws ecs stop-task --cluster ${clusterName} --task ${currentTask}"
}

,但它仅停止第一个任务。我试图用for循环编写“ bash脚本”来迭代“当前任务”变量,但不能使用Jenkins格式。

我尝试使用以下脚本停止任务,但无法正常工作

 if (currentTask) {
 sh " 
       for oldtask in ${currentTask}; do
            aws ecs stop-task --cluster ${clusterName} --task ${oldtask};
       done "
   }

您知道如何与詹金斯一起使用“ for循环”来停止两个正在运行的任务吗?

2 个答案:

答案 0 :(得分:0)

在这里,我必须支持Imran的评论-通常,您无需手动停止任务。如果将服务更新到新定义,则ECS将正常地从运行旧定义的任务过渡到运行新定义的任务,如果可能的话,它会平稳地无停机(取决于您的其他一些设置)。您不必停止它们。

如果您确实想手动阻止它们,那么您将需要解释“它不起作用”的含义。您收到错误消息了吗?如果是这样,该怎么办?在詹金斯生成的那部分期间有任何输出吗?

答案 1 :(得分:0)

这是一个可以尝试的bash脚本。由于您是在CLI之外使用JSON响应,因此最好使用jq,但可以与其他人一起尝试。请告诉我您的情况如何。

clusterName="myCluster"
taskFamily="myTaskFamily"
for task in $(aws ecs list-tasks --cluster $clusterName --family ${taskFamily} | jq -r '.taskArns[]'); do
    aws ecs stop-task --cluster ${clusterName} --task ${task};
done

注意-

  1. 在最佳实践中,并不是像这样停止任务,而是像Geoffrey建议的那样,使用适当的部署配置来进行更好的管理。