前置き
社内でJenkinsが使われていことは知っているが、いままで触れる機会が全然なかった。 そんな中突然Jenkinsに触れる機会があったのだが、あれこれ情報源をつまみ食いして試行錯誤した結果「なんかよくわかんないけどこうすれば動くんだろうなー」程度の理解になってしまっており気持ち悪い。 もう少し基本的なところを理解したいと思ったので勉強した。ついでに記事にした。
環境
- NixOS on WSL
- Jenkins Version 2.516.2
参考資料
- JenkinsでCI環境構築チュートリアル (Linux編・macOS編) - ICS MEDIA:導入時にこんなGUIセットアップするのか、という参考にした。ただ自分の環境はNixなので具体的な導入手順は別ページを参照する必要があった
- Jenkins - NixOS Wiki:NixOSでJenkinsをどうセットアップするかの解説ページだが、ただ
services.jenkins.enable = trueにしろとしか書いてない(でもそのシンプルさがNixの良いところ)- 他に設定できるオプションは search.nixos.org を見るとよい
- Jenkins Pipelineを試す - とことんDevOps | 日本仮想化技術のDevOps技術情報メディア:とりあえずどうやってpipeline作って実行すればよいんだという観点で参考にした
- Pipeline(公式ドキュメント):pipelineってどうやって書くんだろうなという参考にした
- [Jenkins]パイプラインジョブがshでハングする問題 #Pipeline - Qiita:ジョブの実行がいつまでたっても終わらなかったり変なエラーで落ちたりしたときに、こちらの記事あるとおりに環境変数設定したら治った。原理はよくわかってない…
- JenkinsにGitHub認証情報を登録してJenkinsfileからジョブを作成できるようにする #GitHub - Qiita:クレデンシャルってどこで設定するのという観点で参考にした
- Declarative Pipeline で Jenkins に保存された認証情報を利用する #JenkinsPipeline - Qiita:作成したクレデンシャルをどうやってpipelineで使うのという観点で参考にした
Jenkinsのインストール
まずはJenkinsが動く環境を整える必要がある。
セットアップは環境次第だが、自分の場合WSL上でNixOSを動かしているので、その上にJenkinsサーバーを動かす。
NixOSの場合は、以下を configuration.nix に追記して nixos-rebuild switch するだけ。
| |
そのほかのオプションの詳細は jenkinsのnixファイル を見てもよいが、公式docのAppendix A. Configuration Options
または search.nixos.org からだと視覚的に見やすい。
例えばデフォルトでは http://localhost:8080 でアクセスできるのだが、以下のように port でポートを変えることも可能。
| |
セットアップ
初回設定
https://localhost:8080 にアクセスすると Unlock Jenkins ページに飛ぶので、指示通り /var/lib/jenkins/secrets/initialAdminPassword ファイルに記載の初期パスワードを入力。

次にプラグインを入れるかどうかが出る。取捨選択するものもよくわからないので、とりあえずInstall suggested pluginを選択する。

プラグインのインストール状況画面が出るので待つ。

続いて初回のAdminユーザを作れといわれる。今回はお試しなので、Skip and continue as adminを選択。

JenkinsのURLを設定する画面が出るが、今回はNot nowを押す。

準備ができましたと言われる。またスキップしたオプションはどこから設定できるのかも表示してくれている。そのままStart using Jekinsを押す。

環境変数の設定
ジョブがシェルコマンドを実行するのに必要なため、環境変数を設定する。
右上からJenkinsの管理を押す。

Systemを押す。

グローバルプロパティ → 環境変数のところで、 PATH+EXTRA: /bin/ を追加して、Saveを押す。

パイプラインに触ってみる
Jenkinsにはジョブの種類がいくつかあるが、本記事ではパイプラインを使ったジョブのみを扱う。
※ 簡易的なジョブの作成にはfreestyleという種類が使えそうだが、Best Practice でもパイプライン使えと言ってるし、そもそも Working with projects にもfreestyleの解説リンクだけ無い
パイプラインの作成
新規ジョブを作成。

適当なジョブ名を入力し、パイプラインを選択し、OKを押す。

以下のようなpipeline定義を書き、Saveを押す。
| |

パイプラインの実行
ビルド実行を押す。

ビルド成功すると緑マーク、失敗すると赤マークが出る。成功したビルドの番号を押す。

Console log画面からビルドのログが見える。

このログを見ると、なんとなくpipeline定義とビルドの実行ログが対応しているなとわかる。
Running on Jenkins ...で、Jenkinsサーバー上でビルドが実行されているのかがわかる- 1つのビルドは複数のステージに分かれる
- 1つのステージは複数のステップに分かれる
ノードを1台追加してみる
Jenkinsにはノードという概念があり、ジョブをどのノードが実行するかといったものを制御できるみたい。
試しにノードを1つ追加してみる。
ノードの追加
まず Jenkinsの管理 → Node の画面に行き、New Node を押す。

ノード名を入力し、Permanent Agentのラジオボタンを選択し、Createを押す。

必要事項を入力
- リモートFSルート: ノードの作業ディレクトリのようなもの。お試しで作って動かしてみるだけなので、とりあえずホームディレクトリに適当なディレクトリ
/home/bombrary/jenkins-node-worksを切って設定しておく - ラベル:ノードに設定するラベルを設定する。後でpipeline実行するときに、このノードを選択するための条件に使う
- 起動方法:「Launch agent by connecting it to the controller」 または 「SSH経由でUnixマシンのスレーブエージェントを起動」が選べるようだ
- 今回はとりあえずノードが稼働しているということがわかればよいので、前者にする

保存を押すと元の画面に戻る。作成したnode-01を押す。

このコマンド入力すればagentが起動できるよ、という案内がある。

ノードの稼働
ノードを追加をJenkinsから実施したが、実体となるエージェントがまだいないので起動する。
Nixの場合、まず java コマンドが動作するシェル環境を準備する。お試しであれば、 flake.nix を次のようにして nix develop コマンドを実行すればよい。
| |
javaが起動する作業環境を準備。
| |
JenkinsのUIで案内されていたコマンドを実行すると、agentが稼働状態になる。
| |
JenkinsのUIからも、ノードが稼働状態になったことを確認。

これで、pipelineの定義を以下のようにしてビルドしてみる。違いは agent の部分で、「 ラベルが mynode であるようなノード上でビルドを実行する」という意味になる。
| |
これで実行してみると、Running on node-01 ... のように、ちゃんと node-01 上で実行したというログが見える。

クレデンシャルを使ってみる
Jenkinsでは、秘匿したい認証情報を登録する機能があるので使ってみる。
クレデンシャルの作成
まずJenkinsの管理から Credentials を押す。

Stores scoped to Jenkins の欄のSystemを押す。

グローバルドメインを押す。

Adding some credentials を押す。

今回は種類「ユーザ名とパスワード」として作成する。ユーザ名とパスワードを適当に入力し、Createを押す。

作成後、クレデンシャル一覧画面に戻る。作成したクレデンシャルの下にIDがあるのでそれを控えておく。

クレデンシャルの利用
最初に作ったジョブのpipeline定義を以下のようにしてビルドしてみる。
environment { 変数名 = credentials('クレデンシャルのID') }のように、クレデンシャルを環境変数として宣言する変数名_USR、変数名_PWDのように環境変数として参照ができる
| |
ビルドしてみると、Console Outputにてパスワードがちゃんと出力されていないことがわかる。

パラメータ付きビルド
続いて、ジョブのビルド時にパラメータが設定できるようにしてみる。
pipeline定義を以下のようにする。
| |
これでSaveする。このパラメータ設定はJobを一度ビルドしないとpipeline定義が読み込まれず反映されないらしいので、まずは適当にJobを再ビルドする。
How to make sure list of parameters are updated before running a Jenkins pipeline? - Stack Overflow
そのあとジョブの設定にもう一度移動してみると、「ビルドのパラメータ化」のところにチェックが入っており、pipelineで定義したパラメータが設定されていることが分かる。

そして、「ジョブのビルド」と書いてあったものが「パラメータ付きビルド」に代わっており、押すと次のようにパラメータを入力する画面に飛ぶ。

ビルドしてみると、ちゃんと入力したパラメータがログに出ていることがわかる。

アンインストール & クリーンアップ
NixOSの場合、以下 services.jenkins.enable = true を消して再度 nixos-rebuild switch するだけ。
| |
データも全部消したいなら /var/lib/jenkins も消す。
| |
終わりに
Jenkinsを導入し、ジョブのビルド、クレデンシャルの設定、パラメータの設定などいくつか機能を試してみた。
pipelineの定義を実際に書いてみて、なるほどpipelineはstepやstageの集まりなんだなという学びを得られたので有意義だった。