これまで GUI から行っていた Jenkins のシステム設定を yaml で設定できる Configuration as Code プラグインについて解説します。
これまでの Jenkins as Code
〇〇 as code は近年いろいろなところで見かけますが、設定をコード化するとソフトウェア開発のプラクティスを適用できるようになり、以下のようなメリットがあります。
- バージョン管理できる
- 変更を追跡できる
- 変更に問題があったときに素早く前の状態に戻せるので安全
- GUI では設定が多いときに時間がかかるけど、コードで自動化されれば高速
- 簡単に再利用できる
Jenkins にも as code の波は来ています。例えば Docker を使えば Jenkins の master の環境構築をコード化できますし、ジョブの設定は Jenkinsfile を使えば groovy で記述することができます。
実はシステム設定についてもこれまでにコード化しようとする取り組みはありました。例えば、JENKINS_HOME に init.groovy
という groovy スクリプトを置くと Jenkins の起動時にスクリプトを実行することができる仕組みがあります。
Post-initialization script - Jenkins - Jenkins Wiki
しかし、この仕組みを使うには groovy と Jenkins 内部への理解が必要で、GUI と比較すると手軽とは言えないものでした。
Configuration as Code プラグイン
上記の問題を解決するために新たに開発されたのが Configuration as Code プラグインです。このプラグインの記述は yaml なので特定のプログラミング言語の知識が必要なく、GUI の設定をそのままコード化したような構造なので Jenkins 内部への理解も必要ありません。
Configuration as Code のデザインについては JEP-201 で確認できます。
デモ用リポジトリ
Configuration as Code プラグインにはデモ用のリポジトリが存在します。
このプラグインの仕組みを理解するために動かしてみます。将来的には以下の手順が古くなって動かなくなる可能性があるので注意してください。ちなみに、この記事執筆時点のコミットハッシュは 5a89395d060c6059a754d6e587e8dac6a2c119f3 です。
このデモ環境を構築するためには、以下のものを事前に用意しておきます。
- github アカウント
- Jenkins の admin アカウントのパスワード
- ssh の秘密鍵を
~/.ssh/id_rsa
に保存
用意できたら動かしてみます。
$ git clone https://github.com/Praqma/praqma-jenkins-casc.git $ cd praqma-jenkins-casc $ vi jenkins.yaml # "username: ReleasePraqma" となっている部分を用意した github のユーザー名に変更して保存 $ echo -n "<用意した github アカウントのアクセストークン>" > /var/deploy/secrets/github $ echo -n "Jenkins の admin に設定するパスワード" > /var/deploy-secrets/adminpw $ docker-compose up --build
もし mac で ERROR: for jenkins Cannot create container for service jenkins: invalid mount config for type "bind": bind source path does not exist
というエラーが表示された場合は、Docker → Preferences → File Sharing で /var/deploy/secrets
とこのデモ用リポジトリのディレクトリを追加する必要があります。
起動したら、localhost
にアクセスすると Jenkins の画面が表示されるはずです。右上の「ログイン」をクリックし、ユーザー名 demoAdmin
、パスワードは /var/deploy/secrets/adminpw
に設定したパスワードでログインできます。
「Jenkins の管理」→「システムの設定」を見るといろいろ設定されているのが確認できます。
プラグインの仕組み
このデモ用リポジトリを元にプラグインの仕組みを見てみます。
まず、デモ環境はリポジトリ直下にある jenkins.yaml
を元に Jenkins のシステム設定が行われます。例えば、jenkins.yaml
を見てみると以下のような設定があります。
jenkins: systemMessage: "Welcome to the demo setup for Jenkins Configuration as Code plugin. For more information look in the official repo with our demo setup: https://github.com/Praqma/praqma-jenkins-casc"
この設定は、システムの設定にある「システムメッセージ」に対応しています。jenkins
ブロック下の設定は Jenkins 本体のシステム設定に相当するみたいです。GUI の設定と対応がわかりやすいので、なんとなくでも理解はできますね。
シークレットの変数埋め込み
credentials: system: domainCredentials: - credentials: - usernamePassword: scope: SYSTEM id: github-user username: miyajan password: ${github}
credentials
ブロックには上のような設定が書かれています。usernamePassword
はユーザーの設定のようです。
${github}
の変数部分はシークレットを yaml に直接書かずに渡すための書き方です。/var/deploy/secrets
に置いたファイルが docker-compose
の secrets
で Jenkins コンテナの /run/secrets
下に置かれ、プラグインが /run/secrets
下のファイル名をキー、中身を値として変数に埋め込んでくれるようです。
読み込む jenkins.yaml の指定
docker-compose.yml
の中に以下のような設定があります。
environment: - CASC_JENKINS_CONFIG=/var/jenkins_home/jenkins.yaml
Configuration as Code プラグインは CASC_JENKINS_CONFIG
という環境変数を見て jenkins.yaml を読み込むようです。ここにはローカルファイルのパスだけでなくて、URL を指定することもできます。
Configuration as Code プラグインについての画面
「Jenkins の管理」→「Configuration as Code」に遷移すると Configuration as Code プラグインについての画面が表示されます。
例えば、"Documentation" リンクをクリックすると jenkins.yaml
の設定のドキュメントが表示されます。インストールされているプラグインによって変わるので Jenkins から動的に生成しているようです。
"Export Configuration" をクリックすると現在の Jenkins の設定がこのプラグインで使える jenkins.yaml
として出力されます。しかし、この機能で出力される yaml はそのまま使えるレベルではなく、あくまでも設定の参考にするための機能のようです。(ちなみに、自分が普段使ってる Jenkins で試したところ Java のスタックトレースが yaml の中に含まれていましたw)
プラグインの対応状況
他のプラグインが Configuration as Code プラグインに対応するには、プラグインを修正する必要があるようです。プラグイン開発者向けのドキュメントがあります。
また、各プラグインの Configuration as Code プラグインに関する issue を一覧するためのダッシュボードがあります。
JCasC Compatibility - Jenkins JIRA
これを見ればある程度はプラグインの互換性についての問題を把握できます。
まとめ
デモを軽く動かしたレベルですが、Configuration as Code プラグインについてまとめてみました。
正直まだドキュメントが少なく、他プラグイン側での対応もまだこれからと思われるので、実用的になるのはまだ先ではないかと思われます。
しかし、Jenkins おじさんであればシステム設定をコード化したいと思ったことが一度はあるはずなので、このプラグインが発展していけばより堅牢な Jenkins が運用できるようになるのではと思われます。今後に期待です。