前提・実現したいこと
jenkinsでパイプラインによるデプロイをしようとしています。
ロードバランサー から一度対象のEC2インスタンスを切り離し、つなぎ直してから、ヘルスチェックで"healthy"が返ってくるか確認する処理を書いています。
内容は下記の通りです。ヘルスチェックが通ったのであればwhileのループを抜け出すために"break"を書いていますが、抜け出せません。理由と、できれば改善策をご教示いただきたく質問します。
ソースコード(諸事情により環境変数を隠しています)
Groovy
1 node { 2 try { 3 stage("Before_job") { 4 notifySlack('SUCCESS', "${INSTANCE_ID1} のデプロイを開始します。") 5 } 6 stage("Cleanup") { 7 deleteDir() 8 sh "mkdir hoge" 9 } 10 stage("Checkout") { 11 dir("hoge") { 12 sh "git clone -b ${PJ_NAME} git@github.com:huge/hoge.git" 13 } 14 } 15 stage("Prepare") { 16 sh "rsync -avz -e 'ssh -o StrictHostKeyChecking=no' hoge/ ${SSH_HOST1}:~/hoge/" 17 } 18 stage("Pull Image") { 19 sh "ssh -o StrictHostKeyChecking=no ${SSH_HOST1} 'cd hoge && sudo `aws ecr get-login --no-include-email --region ap-northeast-1` && sudo /usr/local/bin/docker-compose -f ${COMPOSE_YML} pull'" 20 } 21 stage("Deregister-targets from LB") { 22 sh "ssh -o StrictHostKeyChecking=no ${SSH_HOST1} 'aws elbv2 deregister-targets --target-group-arn ${TARGET_ARN} --targets Id=${INSTANCE_ID1}'" 23 } 24 stage("Down All Container") { 25 sh "ssh -o StrictHostKeyChecking=no ${SSH_HOST1} 'cd hoge && sudo /usr/local/bin/docker-compose -f ${COMPOSE_YML} stop && sudo /usr/local/bin/docker-compose -f ${COMPOSE_YML} kill'" 26 } 27 stage("Deploy") { 28 sh "ssh -o StrictHostKeyChecking=no ${SSH_HOST1} 'cd hoge && sudo /usr/local/bin/docker-compose -f ${COMPOSE_YML} up -d'" 29 } 30 stage("Register-targets to LB") { 31 sh "ssh -o StrictHostKeyChecking=no ${SSH_HOST1} 'aws elbv2 register-targets --target-group-arn ${TARGET_ARN} --targets Id=${INSTANCE_ID1}'" 32 } 33 stage("Healthcheck") { 34 def i = 0 35 while (i < 10) { 36 37 # シェルスクリプトで実行した結果を変数stateで取得しています。返ってくるのはLBに繋がってるインスタンスの状態(unusedやunhealthyやhealthyなど)です。 38 def state = sh returnStdout: true, script: "ssh -o StrictHostKeyChecking=no ${SSH_HOST1} 'aws elbv2 describe-target-health --target-group-arn ${TARGET_ARN} --targets Id=${INSTANCE_ID1} --query TargetHealthDescriptions[].TargetHealth.State --output text'" 39 40 # 状態がhealthyであれば、whileのループを抜け出し、次のstageで記載した処理へ飛ばせたいのですが、ここのbreak;が機能していません。。。 41 if ("${state}" == "healthy") { 42 println "TargetGroupARN: ${TARGET_ARN} InstanceId: ${INSTANCE_ID1} State: ${state}" 43 break; 44 } else { 45 println "TargetGroupARN: ${TARGET_ARN} InstanceId: ${INSTANCE_ID1} State: ${state}" 46 } 47 48 sleep(3000) 49 i++ 50 } 51 } 52 53 stage("Remove") { 54 sh "ssh -o StrictHostKeyChecking=no ${SSH_HOST1} 'cd hoge && docker ps -a -q -f \"status=exited\" | xargs --no-run-if-empty docker rm -v'" 55 } 56 stage("After_job") { 57 try{ 58 sh "ssh -o StrictHostKeyChecking=no ${SSH_HOST1} 'sudo docker rmi $(sudo docker images -f dangling=true -q)'" 59 } catch(Exception e) { 60 echo "no target images." 61 } 62 notifySlack('SUCCESS', 'END') 63 } 64 } catch (e) { 65 notifySlack('FAILED', "${e}") 66 throw e 67 } 68 } 69} 70 71def notifySlack(String notifyStatus = 'INFO', String notifyBody = '') { 72 if (notifyStatus == 'INFO') { 73 color = "#439FE0" 74 } else if (notifyStatus == 'SUCCESS') { 75 color = 'good' 76 } else { 77 color = 'danger' 78 } 79 slackSend color: color, message: "${env.JOB_NAME} - #${env.BUILD_NUMBER} ${notifyBody} (${env.BUILD_URL})" 80} 81
試したこと
「break」の箇所にreturn trueを挿入してみましたがループから抜け出せず。。
あなたの回答
tips
プレビュー