Jenkinsに関して気になったことをメモしておくページです。
- 細かい設定手順までは触れません。
- Jenkins Ver 2.300 以上を想定しています。

以下、目次です。
Slaveノード追加
◇使いどころの例
- Masterノードのリソース不足のため、分散させたい。
- 特定ジョブを別ノードで実行させたい(リソース分離)。
◇対象ノード
- javaが実行できる環境なら動く。
- masterから接続できることが前提(linuxはssh接続が手っ取り早い)
◇動作Memo
- ノードにjenkinsは不要(初回接続時にjarファイルがmasterからコピーされる)
- 接続時のユーザで動作する。
- ログファイルはMaster上に残る。
- ワークスペースはSlave上に残る(作られる)。
masterノードはjenkinsユーザによる実行が多いと思う(linuxを想定)。ジョブの作りによってはSlaveノードでもjenkinsユーザによる実行じゃないと都合が悪い場合もある(アクセス権の問題等)。その場合はmasterノードの環境をslaveノードとしてコピーした後に、slaveノードで以下を実施する。
- jenkinsサービスを停止
- jenkinsユーザのログインを有効&ssh鍵を作成
# ログイン有効
usermod -s /bin/bash jenkins
# 鍵作成&秘密鍵確保
sudo su jenkins
cd .ssh
ssh-keygen -t rsa -N "" -f id_rsa -C ""
cat id_rsa.pub >> authorized_keys
cat id_rsa
また、slaveノードの作業場所として「リモートFSルート」が必要になるが、事前に作成して、chownで所有者はjenkinsに変更しておくと良い。
なお、ジョブ数に応じて追加ノードを自動起動させることも出来るらしい(まだ試せていない)
プラグイン
build user vars
◇概要
ビルド実行者のログインIDを出力するためのプラグインです。ビルド実行者に応じて処理を分けたり、出力ファイル名にビルド実行者を付与したり、所々で活用できるかもしれません。
◇実行例
echo $BUILD_USER_ID
→ userA
- スケジュール実行時の「BUILD_USER_ID」は「timer」が入る。
- インストール後はグローバル設定で本プラグインを有効にすることを忘れないこと!

その他
ジョブ毎のログ容量
ジョブ毎のログがディスク容量を圧迫することがあります。以下コマンドによってトップ20を確認することが出来ます。
sudo du -sh /var/lib/jenkins/jobs/* | sort -h -r | head -20
→ジョブ毎に適正なログ保存数(世代数)を設定しましょう。
ジョブキャンセル時のシグナルは「15」
ジョブを「x」でキャンセルした場合のシグナルは「15」(SIGTERM)が発生しました。キャンセル時に「trap」処理(途中ファイル削除やロック解除など)をさせたい場合は「15」で設定しておけばOKになる。
# 例
trap '処理;exit1' 15
# けど15含めて以下で設定したほうが汎用性は高い
trap '処理;exit1' 1 2 3 15
CRON
Jenkinsの場合、左から次の意味となる。
- MINUTE:Minutes within the hour (0–59)
- HOUR:The hour of the day (0–23)
- DOM:The day of the month (1–31)
- MONTH:The month (1–12)
- DOW:The day of the week (0–7) where 0 and 7 are Sunday.
※0が日曜日開始。
タイムゾーン指定は「TZ=JST」のように追記すること。
# 例
TZ=JST
0 19 * * *
# 毎日19時00分に実行する。
0 19 * * *
# 毎日10時,16時に実行する(分は未定義)。
H 10,16 * * *
# 毎週火曜日と木曜日の11時に実行する(分は未定義)。
H 11 * * 2,4
# 毎週日曜日~金曜日の11時に実行する(分は未定義)。
H 11 * * 0-5
cURLでConfig変更
- Config内容によってアップロードに失敗することがあります(actet-streamとすることで回避可)。
- パラメータ説明やジョブ内のシェルスクリプトは「改行コード」が失われます。
- アップロード→再ダウンロードするとXMLインデントが失われます(構文が失われたわけではないためxmllintを通せば直ります)。
以下の流れになります。
- conflg.xmlをダウンロード
- config.xmlを変更
- config.xmlをアップロード
※権限だけ変更できたり、専用のREST APIがあれば良かったのですが、無さそうです。
APIに関する内容はJenkinsジョブから取得可能です。
http://<URL>/job/<jobName>/api
例:http://192.168.x.x/job/testjob/api

# ダウンロード
curl --user <user>:<api_token> -L http://<url>/job/<jobname>/config.xml --output config1.xml
→ config内容はconfig1.xmlというファイル名で保存されます。
# 変更 & 確認例
copy config1.xml config2.xml
vi config2.xml
diff config1.xml config2.xml
# アップロード(反映)
curl --user <user>:<api_token> -X POST http://<url>/job/<jobname>/config.xml -H 'Content-Type: application/xml' -d "@config2.xml"
※ <>は環境に応じて置き換えてください。
ところでXMLファイル内の内容によっては「Content-Type: application/xml」だと失敗します。(curlの-vオプションで確認すると500エラーになる)。この場合、「Content-Type: application/actet-stream」にすると、ひとまずは回避出来ます。
※最初に書いた通り、アップロード後に改行関係は消えてしまいます(Jenkins側の不具合な気もしますが)。xml指定でエラーになるのも日本語などがうまく解釈出来てないのかなって思います。
なお、api_tokenの取得方法は、個人の設定から発行可能です。昔はログイン時のパスワードで通ったようですが、最近はAPIトークンの発行が基本ですね。

まとめ
Jenkinsは便利です。CI/CDといった用途含め、まだまだ現役だと思います。今後も色々と追記していきます。

最後までご覧いただき、ありがとうございました。