morimorihogeです.ちょっと前回から間の空いた投稿になってしまいました.今回はJenkinsの話.
Jenkinsの概要
JenkinsはTDD,BDDなどを使い,自動テストでCI(Continuous Integration)を回していく際に使えるCIサーバです.同等の物としては,GithubにおけるTravis CIやGitLabにおけるGitLab CIなどが挙げられます,ちなみにJenkinsは昔はHudsonという名前でした.
Jenkinsの特徴としては,歴史が長いので動作自体の安定性や導入実績が十分にあること(枯れている),WARコンテナにまとまっているのでインストールが割と楽,プラグインが豊富にあり,機能拡張がやりやすいことなどが挙げられます.Travis CIはGithub専用ですし,GitLab CIは導入実績の面でまだ試行錯誤が必要そうなことや,GitLab系プロジェクト自体がかなりアグレッシブに新しい技術や仕様変更をゴリゴリ行っているので,真面目にインフラとして導入するとなるとそちらのメンテナンス負荷が大きくなってしまうといった問題があります.
JenkinsでRailsプロジェクトのCI環境を構築する方法については「Rails Jenkins」などでぐぐると一通りの構築手順が見つかると思います.以下は参考までに.
ちなみに弊社ではubuntuのaptパッケージにあるjenkinsを入れて使っています.apt-get install jenkinsだけでインストールできるので楽ですねー.
Jenkinsデフォルトインストール状態で困ること
Jenkinsを使うと,トップページは以下の様な画面になります.
ここには登録したJob(ビルド手順)の一覧が,ステータスと一緒に表示されるのですが,このままだと全てのプロジェクトのステータスが誰にでも見られてしまいます.
この問題に対応するには,1つはApacheやNginxなどの別Webサーバを経由してJenkinsに接続するようにし,Apache/Nginx側でBasic/Digest認証をかける,という方法があります.
この方法はアクセス制限をかける上ではお手軽なのですが,Basic/Digest認証を通るユーザは全てのプロジェクトが閲覧できてしまいます.
弊社では案件によってはお客様にも開発環境にアクセスして頂く様に設定することもあるので,その際には開発情報の一つとしてJenkinsのビルド結果も共有したい,ということがあります.
そういった際に前述の方法だと,他のお客様のプロジェクトまで閲覧できてしまうので,これではよろしくないわけです.
また,社員の開発メンバでも,誰でも全てのJobの設定を編集できてしまうと,よく分かっていない人が間違えて編集してしまうという事故も起こり得るので,Jobは誰もが編集できるのではなく,プロジェクトの管理者だけが編集できるのが望ましい所です.
権限管理プラグイン(Role Strategy Plugin)の導入
というわけで,デフォルトのJenkinsではできないのでプラグインを導入して解決します.これまでのrequirementsをまとめると,以下の通りです.
- 全く無関係の人(guest)にはプロジェクトの存在を含めて見せたくない
- 特定のユーザには,そのユーザの関連するプロジェクトのビルド結果,ステータスを見せたい(ビルド設定は編集させない.閲覧only).この時他のプロジェクトは存在を含めて見せたくない
- 社員ユーザには,全てのプロジェクトのビルド結果・ステータスが見られて良いが,Jobの設定変更はできないようにしたい
- 管理者は何でもできる
これらの要求を満たすのがRole Strategy Pluginです.このプラグインを導入すると,Jenkinsにログインしたユーザに合わせて権限を設定することができます.
プラグインのインストール
プラグインのインストールはJenkinsの管理メニューにある「プラグインマネージャ」から行います.
注意点としては,プラグインマネージャでは名前が「Role-based Authorization Strategy」になっている所でしょうか.リンク先のjenkins wikiではRole Strategy Pluginという名前になっているので,この辺りは統一して欲しいものです.
インストール後,Jenkinsの再起動が必要になります.多分.
プラグインの有効化
プラグインを有効化するには,Jenkinsの再起動後「Jenkinsの管理」-> 「システムの設定」を開き「アクセス制御」の項目を「Role-Based Strategy」に変更します.
これでプラグインが有効になります.
権限の作成と設定
次に,権限を作成します.権限の設定にはJenkinsの管理メニューにある「Manage and Assign Roles」を使います(前述の手順でpluginを有効化すると表示されるようになる).
pluginをインストールした直後ではadmin以外の権限が無いので,まずは「Manage Roles」を開き,権限を作成します.
このpluginの権限管理ポリシには,Global RolesとProject Rolesがあります.その名の通り,Global Rolesは全てのJobやJenkins自体の設定に関係する権限で,Project Rolesは特定のJobに限定した権限を設定することができます.
ここでは社員向けのGlobal Roleとして,adminの他に,全てのプロジェクトの状態が閲覧できるread権限を作ります.
※ものすごく横に長いので,詳細はクリックして拡大表示で見て下さい.
次に,Project Rolesは絞り込み条件に正規表現を使ってJob名を絞り込み,それらのJobに対して権限を割り当てる形になります.一般的には「#{Job名}.*」にするのが良さそうです(後々-testとか-migrationみたいなJobが増えても対応できるので).
ここでは,あるプロジェクトについて閲覧のみできる権限と,管理権限を作ってみました.
最後に,作った権限をユーザに対して割り当てます.権限の割り当ては「Assign Roles」メニューから行います.
ここでは以下の様に設定しました.
こんな感じで,権限をユーザ別に割り付けていくことができます.ユーザ数が増えてくると厳しいですが,とりあえず20人くらいまでならこれでどうにかなりそうですね.
まとめ
JenkinsでJobごとに可視・不可視,編集の可否を設定することができるRole Strategy Pluginを紹介しました.Jenkinsの情報は一時期流行ったのかたくさん情報が出回ったのですが,最近は勢いが引いたのか,あまり見かけなくなりました.
使っている人達には当たり前の情報ですが,Techrachoではこういう情報もフォローしていければと思っていますので,今後ともよろしくお願いします:)