やりたいこと
テキストにまとめたJenkinsプラグインのインストールをスクリプトで自動化したい。
各ファイルの準備
- インストール用のスクリプト
while read line do java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin $line done < plugins.txt
- プラグインをまとめたテキスト(本当は100個近くある)
git:4.11.0 github:1.34.3 credentials:1087.1089.v2f1b_9a_b_040e4 plain-credentials:1.8 plugin-util-api:2.16.0
while readで実行した結果
スクリプトを実行してみます。
$ sh install.sh Installing git:4.11.0 from update center $
1行しか実行されません。
試しにデバッグオプションで実行してみます。
$ sh -x install.sh + read line + java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin git:4.11.0 Installing git:4.11.0 from update center + read line $
読み込む行がなくなった??
分からんので、試しにスクリプトを書き換えてecho表示してみます。
while read line do echo $line done < plugins.txt
期待通りに全行表示されるし、デバッグオプションで実行しても問題ないです。
$ sh install.sh git:4.11.0 github:1.34.3 credentials:1087.1089.v2f1b_9a_b_040e4 plain-credentials:1.8 plugin-util-api:2.16.0 $ $ sh -x install.sh + read line + echo git:4.11.0 git:4.11.0 + read line + echo github:1.34.3 github:1.34.3 + read line + echo credentials:1087.1089.v2f1b_9a_b_040e4 credentials:1087.1089.v2f1b_9a_b_040e4 + read line + echo plain-credentials:1.8 plain-credentials:1.8 + read line + echo plugin-util-api:2.16.0 plugin-util-api:2.16.0 + read line $
調べた結果
どうやらファイルを開いて1行目を読んだ後、javaコマンドを実行する際にファイルが閉じられるようです。
そのため、1行目しか読み込まれないと。
1行目を読み込んで実行した後、2行目以降から最終行まで一度にjavaコマンドが読み込んでいるようです。 ※コメントいただいて確認したところ、上記の解釈は違っていたので訂正
解決の糸口になったのが以下記事です。 SSHでも同じ事象になるようです。本当に助かりました。
http://site.m-bsys.com/error/whileread-ssh
じゃあどう解決したかというと、for line inに書き直しました。
for line in で期待通りの動作を実現
まずは、スクリプトをfor line inに書き直します。
for line in `cat plugins.txt` do java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin $line done
早速実行してみます。
$ sh install.sh Installing git:4.11.0 from update center Installing github:1.34.3 from update center Installing credentials:1087.1089.v2f1b_9a_b_040e4 from update center Installing plain-credentials:1.8 from update center Installing plugin-util-api:2.16.0 from update center $
期待下通りの結果になりました。
デバッグオプションを付けても同様です。
$ sh -x install.sh ++ cat plugins.txt + for line in '`cat plugins.txt`' +java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin git:4.11.0 Installing git:4.11.0 from update center + for line in '`cat plugins.txt`' +java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin github:1.34.3 Installing github:1.34.3 from update center + for line in '`cat plugins.txt`' +java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin credentials:1087.1089.v2f1b_9a_b_040e4 Installing credentials:1087.1089.v2f1b_9a_b_040e4 from update center + for line in '`cat plugins.txt`' +java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin plain-credentials:1.8 Installing plain-credentials:1.8 from update center + for line in '`cat plugins.txt`' +java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin plugin-util-api:2.16.0 Installing plugin-util-api:2.16.0 from update center $
その他
ほんとはまった!