そもそもこのカレンダーの題材であるConcourseとは何なのかを説明します。
🙆話すこと
- Concourseの概要や特徴
🙅話さないこと
- Concourseの用語(Resource, Job, Task, etc.)の詳細な説明
- 他CI/CDツールとの詳細な比較
Concourseとは
GitHub: concourse/concourse: Concourse CI
Doc: Concourse CI - Docs
Concourseは、Goで書かれたパイプラインベースのCI/CDツールです。
Cocnourseの特徴をまとめていきます。
詳細はConcourse CI - Docs をご覧ください。
Configration As Code
パイプラインをコードとして管理することができます。
以下が例です。
resources:
- name: booklit
type: git
source: {uri: "https://github.com/vito/booklit"}
jobs:
- name: unit
plan:
- get: booklit
trigger: true
- task: test
file: booklit/ci/test.yml
このようなコードをgit等にpushしておくと、チームメンバーの誰でもパイプラインを構築、編集することができます。
Fancy Visualization
WebUIでパイプラインが可視化されます。
下図がConcourseのWebUIです。
Concourse Pipeline UI Explained – Concourse CI – Medium
パイプラインの進行状況、失敗箇所がわかりやすいです。
(あとかっこいい、なんとなく画面を出しておくとドヤれそう)
CI Under Source Control
fly
というcliが提供されています。
fly set-pipeline
コマンドでpipelineをconcourseにsetします。
$ fly -t ci set-pipeline -p booklit -c pipeline.yml
この特徴の利点は気軽にパイプラインの開発ができるというところです。
大抵のciツールはgit等と連携し、コミットし、そのコードがマージされるまでパイプラインに反映されることはありません。
パイプラインが正常に動作するようになるまで、ひたすらコミット/PRを量産した経験ないですか?
Concourseでは、手元のコードを元にパイプラインをsetできるため、開発を柔軟に行うことが可能です。
Reproducible, Debuggable Builds
全てはコンテナ上で実行されるため、まっさらな環境での動作が保証されています。
(実行に必要なDockerImageも任意のものを指定することができます。)
これによりスノーフレーク化されたサーバをなくすことができるということが利点の1つとされています。(参考: パイプラインベースのCI/CDツール、Concourseとは? | Think IT(シンクイット))
また、実行コンテナに入ることが可能であるため、パイプラインのデバッグが容易です。
多くのCIツールは、実行の失敗のログを見ることは可能ですが、実行環境で任意のコマンドを実行することはできません。
Rapid Local Iteration
パイプラインをConcourseにsetしなくても、手元で動作を検証することが可能です。
fly execute
というコマンドを利用するのですが、今回は説明を省きます。
都度都度commitをしたり、gitにpushしたりする必要がないし、ビルドログの汚染を防ぐこともできます。
Bring Your Own Integrations
Concourseには複雑なプラグインシステムは存在しません。
しかし、単一の強力な抽象概念があります。
それがResource
と呼ばれるものです。
このResourceは、指定したリソースの変更を監視したり、リソースを取得, 更新することができます。
Resourceにはビルドインされたものとカスタムされたものがあります。
ビルドインResourceは以下のようなものがあります。
- concourse/git-resource: tracks commits in a branch of a Git repository
- concourse/docker-image-resource: a resource for docker images
- etc.
これらはビルドインされているため、Concourseのバージョンによって使用できるバージョンが決まっています。
カスタムResourceも非常に豊富です。例としては以下のようなののがあります。
- cloudfoundry-community/slack-notification-resource: Concourse CI resource for sending notifications to Slack.
- spring-io/artifactory-resource
- concourse/concourse-pipeline-resource: Concourse resource for interacting with concourse pipelines
- etc.
もちろん自分で実装することもできます。
そのガイドについて後半のアドベンドカレンダーでまとめるつもりです。
まとめ
ConcourseはパイプラインベースのCI/CDツールです。
見やすくかっこいいUI、パイプライン自体の開発が柔軟、周辺Componentの開発も容易なことが特徴です。