質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Groovy

Groovyは、Java用のオブジェクト指向型プログラミング言語です。PythonやRuby、Perl、そしてSmalltalkに似た特徴を有する動的な言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

0回答

1152閲覧

groovyのwhile処理から抜け出せない

Daimian

総合スコア53

Groovy

Groovyは、Java用のオブジェクト指向型プログラミング言語です。PythonやRuby、Perl、そしてSmalltalkに似た特徴を有する動的な言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2018/12/19 08:53

編集2018/12/19 08:55

前提・実現したいこと

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を挿入してみましたがループから抜け出せず。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YasuhiroMiyake

2018/12/19 09:09

breakが書かれている行、もしくはif文の判定がtrue になっていることは確認済みでしょうか。 純粋に呼ばれる条件を満たせていないという話はないということで良かったでしょうか。
Daimian

2018/12/19 09:30

ご指摘ありがとうございます。。その恐れが多いにあります。。。ただいま確認してます。。
Daimian

2018/12/19 09:32

stateの出力を確認してみたところ(printIn state)、state = healthyと出力されました。この場合、"${state}" == "healthy"の判定が効いていないとすると、どのようにすれば良いでしょうか。 state == "healthy"も試してみましたが、状況変わらずでした。
YasuhiroMiyake

2018/12/20 02:59

該当のif 文は呼ばれていることは間違いないということで良かったでしょうか。 構文については詳しくないのですが、特に文字列と結合したりフォーマットしないのであれば、そのまま変数と該当文字列を比較してみてはいかがでしょうか。 > if (state == "healthy")
Daimian

2018/12/20 03:47

if文は呼ばれています!しかしながら、 if ("${state}" == "healthy")ここの記述に何か間違いがあり、明らかにstateがheakthyという文字列になっているはずが、elseの方を読みにいってしまいます。 if (state == "healthy")も試しましたが、状況変わらずでした。。
YasuhiroMiyake

2018/12/20 04:12

stateの値に何か空白や改行が入っていないか、トリムなどを行ってから比較してみてはいかがでしょうか。 試しに前方一致でヒットするか確認するのも一つの手段だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問