シンプルなビルドパイプラインツールwalterをリリースしました
APソリューショングループの相野谷(@ainoya)
APソリューショングループの相野谷(@ainoya)です.このたびATLと共同で,CIやCDにおけるビルドパイプラインの実行を手助けする小さなツールwalterを開発しました.
開発の動機: Jenkinsプラグインに強く依存するビルドパイプライン設定
Jenkinsを使ってCIを実現する場合,複数のジョブを繋げて一連の処理フロー(ビルドパイプライン)を作るのが一般的かと思います.Jenkinsには,ビルドパイプラインを構成するための便利なプラグインがあり,これを使って失敗時の実行制御や,ジョブの並列実行制御を簡単に設定できます.
ところが,こうしたプラグインで実際にCIを運用してみると,ちょっと惜しい点がいくつか出てきました.
dockerやansibleを使って,サーバ構成をソースコードと同じように集約して管理できているのに,Jenkins上でのビルド設定だけJenkins側に寄ってしまっている….この不満点を解決するために,Goでwalterという小さなツールを書きました.
walterの概要
walterというツールでは次のようなことができます;
walterの動作は単純で,独自の設定ファイル(yaml)に記述した実行ルールにしたがって,ジョブを順番に実行していきます.記述方法はtravis-ciの設定ファイル(travis.yml)に似ていますが,walterではジョブの並列実行処理を簡単に書けるようになっています.
ユースケース
walterではpipeline:の下にビルドパイプラインの実行順序と,処理の内容を記述します. 各ジョブの詳細はstageで定義された各プロパティに書いていきます.
各ジョブの設定を記述するstageは次のプロパティを持っています.
具体例として,walterのサンプル設定ファイル(pipeline.yml)を下に示します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# Hipchat通知のための設定情報 messenger: type: hipchat room_id: ROOM_ID token: TOKEN from: USER_NAME # ビルドパイプラインの設定 pipeline: # step 1 - stage_name: ビルドパイプラインの処理開始をHipChatに通知 command: echo "build pipeline is started" message: true run_after: # step 2 - stage_name: ansibleでサーバのプロビジョニング command: ansible-playbook -i hosts site.yml - stage_name: アプリケーションのテスト実行(rspec) command: bundle exec rake test # step 3 - stage_name: Capistranoでアプリケーションをサーバにデプロイ command: bundle exec cap production deploy # step 4 - stage_name: Serverspecでサーバ状態をテスト command: bundle exec rake spec # step 5 - stage_name: ビルドパイプラインの処理終了をHipChatに通知 message: true command: echo "build pipeline is finished" |
上記でpipeline.ymlに定義されたビルドパイプラインは下図のように表すことができます. 図に示した通り,pipelineのトップレベルに定義したstageは,それぞれのジョブの終了を待って順番に実行されます.一方,run_afterに記述されたジョブは並列に実行されます.
その他の実行例として,dockerコンテナをビルドしつつアプリケーションを用意する…というサンプルを用意しています.ご参考にしていただければと思います.
walterを試してみる
GitHubでwalterのビルド済みバイナリを配布しているので,これをダウンロードすればwalterを実行できます.試しに,mac環境でwalterを実行してみましょう.
- mac用ビルド済みバイナリを取得.
- sampleのビルドパイプライン設定ファイルを取得.
- walterを実行します.-cオプションで実行対象のビルドパイプライン定義ファイルを指定します.(無指定時のデフォルトは./pipeline.ymlです)
1 2 3 4 |
wget https://github.com/walter-cd/walter/releases/download/v0.1.0/walter_darwin_amd64.zip unzip walter_darwin_amd64.zip |
1 2 3 4 |
cd walter_darwin_amd64 wget https://gist.githubusercontent.com/ainoya/78971d4b1e2797a59af6/raw/992467e22597e7a6de5834e6a21bf6c624286970/pipeline_sample.yml |
1 2 3 |
./walter -c pipeine_sample.yml |
pipelineで指定した順序通りにstageが実行されたでしょうか?stageの記述や実行順序を変更してみて,挙動が変わるか確かめてみてください.そしてbugが見つかったらissuesまでお願いいたします:-)
Microservices with walter
複数のサービス/サーバ群で構成されるアーキテクチャでは,各々のサービス間に依存関係がある場合,それによってデプロイ順序に制約がかかります.もとはモノリシックだったサービスが,分割されて複数サービスとして運用されるようになった場合にありがちです.
こうした場合にも,前述で説明したwalterの使い方を応用すれば,複数のサービス/サーバ群で構成されるアーキテクチャのビルドパイプラインも楽に記述できます. 下図のように,事前にあるべき必要な2種類のサービスを先にデプロイしておき,それに依存する残りの4種のサービスをデプロイする,といった要件にも対応可能です.
複数サーバのプロビジョニングに関しては,ansibleだけでもwait_for記法や並列実行オプションを使えば実現可能です.しかしながら個人的な感覚としては, ansibleは適切な粒度で実行したほうが取り回しがしやすいと考えています.ansibleによるプロビジョニングの実行単位を適度に区切りつつ, walterでそれらの実行単位をつなぎあわせ,制御することで全体構成の見通しを良くするのが狙いです.
開発の現状と今後の予定
現状のビルドパイプラインの構成方法に対する不満点を解決するために,walterというツールを書きました.コードの品質はまだまだプロトタイプの状態ですが,エラー処理やリトライ機構などを中心に品質を上げていく予定です.もちろん,社内での実運用を通しての改善も随時フィードバックしていきます.また,さらなる利便性を向上を目指して,
などなど機能の充実に取り組んでいく予定です.
コードはGitHubで公開しているので,皆様に使っていただき使用感を教えていただければ幸いです.