CI高速化 Part 1: 並列化

Rocro株式会社 CTOの峯尾です。今日からRocro Engineering Blogを始めます。このBlogでは、弊社のプロダクトについてだけでなく、その開発過程で得た様々なノウハウもお伝えできればと思います。

RocroはGitHubやBitbucketと連携するソフトウェア開発者向けのサービス群です。既に数多くの優秀なサービスがある中で、なぜ私がこのRocroプロジェクトを企画したのか。その理由の一つが、更にCIの高速化を押し進めることです。メニーコアCPUやオートスケール可能なクラウドサービスが普及した現在において、ジョブをなるべく細かく分割して並列化することがCI高速化の王道です。今回は、Rocroがどのように並列化をサポートしているかを説明します。

RocroのInspecode/Docstandは、すべてのツールを並列に実行します*1。例えば、Inspecodeにおいて下記のようなrocro.ymlを記述した場合、gofmt, golint, go testの3つが並列に実行されます。

inspecode:
    gofmt: default
    golint: default
    go-test: default

このようにシンプルにツール名を書き並べるだけで並列化することができます。また、rocro.ymlを記述しなくても、InspecodeはGitレポジトリ内の主要言語を検出して、その言語に適したツールを自動的に並列実行します。

ツールへの入力を分割して、更に細かく並列化することも可能です。例えば、下記のように記述することで、go testの入力が2分割され、それぞれ並列に実行されます。

inspecode:
    gofmt: default
    golint: default
    go-test:
        - input:
            - /path/to/package1
            - /path/to/package2
        - input:
            - /path/to/package3
            - /path/to/package4

ジョブ全体の時間に対して特定のツールの実行時間が支配的な場合、ツールレベルの並列実行だけではあまり速くはなりません。そういう場合は、そのツールへの入力を適宜分割して高速化を図るのがよいでしょう。

次回は、リソース配分の最適化による高速化を取り上げる予定です。

*1 rocro.ymlは、並列化などの最適化を自動で行いやすくするために、可能な限り宣言的な記述スタイルを採用しています。