Jenkins 2.xのPipelineとは結局なんなのか?
ここ数週間、職場でxUnitに関するハンズオンを開催していて、その関連の話題としてJenkins 2.0で導入されたPipeline機能についても調べていました。従来サードパーティのプラグインとして存在していたPipelineがこのバージョン(2016年4月リリース)から本体にデフォルトで備わったかたちで提供されるようになったのだそうです。
誤った類推
ただこのPipeline、「使い方」を示す例はまま見かけるのですが、「Pipelineとは結局なんなのか?」「何がどうPipelineなのか?」「何をするためのPipelineなのか?」「何がメリットなのか?」を説明する記事は日本語記事では見かけませんでした。そういうわけで「Pipeline」というワードから私が想像したのはデザインパターンPipes and Filtersでした。
もし仮にそれが正しいとすれば(事実は正しくないのですが)、UNIX/LinuxのShellでお馴染みのパイプやNode.jsの標準ライブラリが提供しているStream(Gulpのgulpfile.jsで主役を果たすアレ)と、JenkinsのPipelineは親戚関係ということになります。そしてJenkinsのPipelineを定義するためのDSLの構文はどうみてもこのPipes and Filtersパターンに該当するようには見えません(例えばGulpとGruntの比較でいえば断然後者に似ています)。
もちろんこの類推は正しくなくて、答えはJenkinsの公式サイトのリファレンスに示されていました*1。
疑問への答え
まず第一に重要な点、それは「PipelineはPipes and Filters PatternのそれではなくContinuous Delivery Pipeline(CDP)のそれである」ということです。
CDはCIを拡張した概念で、ざっくりいうと、製品の本番環境デプロイをも射程に入れたオートメーション化により、品質の保証、生産性の向上、そしてスピーディなサービスインを目指す考え方・実践(*-ism)のようです*2。
「化石燃料や水道などと同じく、ソフトウェア(やその新機能)も淀みない流れのように、速やかに・恒常的に顧客のもとに送り届けられるべきだ」ということらしいのです。
その上で第二に重要な点、Jenkins2.xのPipelineは以下の2点を実現するための機能だということです:
1. CDを実現する基盤を提供してくれる
- ワークスペースの用意、SCMからのコードのチェックアウト、ビルド、テスト、メトリクス収集、パッケージング、デプロイといったステップを自動化してパイプラインを構築する基盤を提供。
- でも、これだけなら従来からできた(フリースタイルジョブを使って画面から各ステップを担当するジョブを登録すればよかった)。
2. CDをスクリプトで記述できるようにしてくれる
- Groovyで実装されたDSLを使って、各ステップをスクリプトで(≠画面で)定義することが出来る。
- そしてこれこそが重要なところ。スクリプトであることでそれ自体を容易にバージョン管理できるし、柔軟(≒複雑)なステップから構成されるPipelineを構築できる。
CDの各ステップの連なり(≒Pipeline)をスクリプトで作成できること。こう書いてしまえばどうということもないものですが、これこそが核心となる事項です。
Web上の日本語記事のほとんどが「Pipeline機能はCDを実現するためのものであること」や「画面でなくコードで記述するのが重要であること」という、「そもそもの前提となる事項」についてまったく言及していません。ことほどさように「CD/CIなんて業界的には当たり前」ということかもしれないが・・・。
*1:右のURLを参照のこと: https://jenkins.io/doc/book/pipeline/
*2:CDもしくはCDPについての解説は右のURLなどを参照のこと:https://devops.com/continuous-delivery-pipeline/