---
title: パイプラインベースのCI/CDツール Concourse CI入門
tags: ["Concourse CI", "Docker"]
categories: ["Dev", "CI", "ConcourseCI"]
date: 2016-04-10T13:29:35Z
updated: 2017-06-04T05:45:29Z
---

**目次**
<!-- toc -->

### Concourse CIとは
[Concourse CI](http://concourse.ci/index.html)は

* Simple
* Scalable
* Reproducable

が売りのパイプラインベースCIです。Pivotalが開発しており、Go言語で書かれています。

元々はCloud FoundryのCI/CD用に作られましたが、単独のCI/CDツールとして汎用的に使用できます。

Thought Worksの[Technology Radar](https://www.thoughtworks.com/radar/tools/concourse-ci)でも2015 NovからASSESS(検討の価値あり)に位置付けられています。

### 他のCI/CDツールとの違い
JenkinsやTravis CI、GoCDとの違いは[こちら](https://concourse.ci/concourse-vs.html)。

Concourse CIではYAMLで簡単にジョブ、パイプラインを記述でき、簡単にスケールでき、結果をUIで視覚的に見ることができます。

Cloud Foundryくらいの大規模プロジェクトになるるとJenkinsの設定方法ではメンテナンス・運用が難しくなったため、このツールが開発されました。
(2016 AprのTechnology Radarでは[Jenkins as a deployment pipeline](https://www.thoughtworks.com/radar/tools/jenkins-as-a-deployment-pipeline)がHOLD(使うなら気をつけろ)に位置付けられています。)

Cloud Foundryのリリースのパイプラインは公開されていています。

https://runtime.ci.cf-app.com/pipelines/cf-release

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/4e14e419-5b1f-75f6-f623-6aac28c9788f.png)

Concourse CIを使うことにより、ジョブ間の依存関係やどこで問題が発生しているのかを視覚的に把握することができます。

### アーキテクチャ

超簡易アーキテクチャを下図に示します。Worker部分でタスクが実行され、ここはスケールアウト可能です。

![concourse.png](https://qiita-image-store.s3.amazonaws.com/0/1852/dd700397-abce-750a-6292-297ad944b18e.png)

WorkerではCloud Foundry内部で利用されているGardenというコンテナマネージャーが使われており、その上でDockerイメージを用いてタスクをコンテナ上で実行します。

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/5a84ee12-2dec-c1f2-863e-1e5650731717.png)

### コンセプト
Concourse CIのパイプラインは以下の[三つのコンセプト](https://concourse.ci/concepts.html)からなります。

* Tasks
* Resources
* Jobs

です。

Taskは任意のスクリプトを隔離された環境で実行します。実際にはスクリプトの実行はDockerコンテナ上で行われます。

Resourceはバージョンチェック、プル(≒ダウンロード)、プッシュ(≒アップロード)できる任意の抽象的な存在です。例えば、Git Resource、S3 Resource、Docker Image Resourceが用意されています。またプッシュしかできないCloud Foundry Resourceや、より抽象的なTime Resourceもあります。
ResourceはJobのinput、outputとして利用可能です。プルしたものをinputとして使い、outputをプッシュすることができます。

JobはResourceとTaskを組み合わせ何かを行います。ジョブはResourceのバージョンアップをトリガーにして実行することもできますし、手動で実行することもできます。Jobは前段のJobに依存することができるため、Jobをつなげてパイプラインを構築することができます。

次のパイプラインを見てみましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/75558f4b-efd3-6723-bd2e-c7b15c86ee21.png)

`job-unit-testing`と`deploy-to-pws`がJobです。`deploy-to-pws`は`job-unit-testing`に依存しています。

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/4af9d207-cce3-b2d5-e54e-4d1357786a77.png)

Jobの間のブロックがResourceです。
GitHubのソース(GitHub Resource)をプルして、`job-unit-testing` JobでユニットテストのTaskを実行し、`deploy-to-pws` JobでPivotal Web Services(CF Resource)にアプリケーションをプッシュしています。

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/88f68094-4fd5-6f47-59f7-5dca3cc42dda.png)

なお、TaskはJobのブロックの中です（クリックすると見ることができます）。


### インストール方法

Consource CIの[インストール方法](https://concourse.ci/installing.html)は

* [Vagrantを使う方法](https://concourse.ci/vagrant.html)
* [スタンドアローンなバイナリを使う方法](https://concourse.ci/binaries.html)
* [BOSHを使ってインストールする方法](https://concourse.ci/clusters-with-bosh.html)
* [Docker Composeを使う方法](http://concourse.ci/docker-repository.html)

の4種類があります。
ちょっと試すならVagrant、軽く運用するならDocker Compose、ちゃんと運用するならBOSHが良いでしょう。

パイプラインの設定ファイルは一度作成すればどこでも再利用できるので、Vagrantを使ってローカルで試したパイプラインをそのまま別の環境でも動かせます。

ここでは最も簡単なVagrantを使う方法を紹介します。

* Docker Composeを使う方法は[こちらの記事](https://blog.ik.am/entries/388)
* BOSHを使う方法は[こちらの記事](https://blog.ik.am/entries/383)

に書きました。

``` console
$ mkdir concourse
$ cd concourse
$ vagrant init concourse/lite
$ vagrant up
```

でConcourse CIのセットアップは完了です。

[http://192.168.100.4:8080](http://192.168.100.4:8080)にアクセスしてください。

![image](https://qiita-image-store.s3.amazonaws.com/0/1852/5879dbc5-0442-95a4-5373-907dced86a6e.png)

CLIのダウンロードリンクが表示されるので、対象のOSのアイコンをクリックし、ダウンロードしたファイルの名前を`fly`にrenameし、パスの通ったフォルダに移動してください。

`fly`コマンドが使えるようになったら、ログインしましょう。

``` console
$ fly -t lite login -c http://192.168.100.4:8080
target saved
```

### はじめてのConcourse CI

[Hello Worldパイプライン](https://concourse.ci/hello-world.html)を試してみましょう。

`hello.yml`を作成して、次の内容を記述してください。

``` yml
jobs:
- name: hello-world
  plan:
  - task: say-hello
    config:
      platform: linux
      image_resource:
        type: docker-image
        source:
          repository: ubuntu
      run:
        path: bash
        args: 
        - -c
        - |
          echo "Hello, world!"
```

`fly`コマンドを使ってパイプラインを設定します。

```
$ fly -t lite set-pipeline -p hello -c hello.yml
```

パイプラインを有効にします。

```
$ fly -t lite unpause-pipeline -p hello
```

`hello-world`ジョブを実行しましょう。

```
$ fly -t lite trigger-job -j hello/hello-world --watch
started hello/hello-world #1

initializing
running bash -c echo "Hello, world!"
Hello, world!
succeeded
```

長くなったので[次の記事](https://blog.ik.am/entries/380)に分けます。改めて1から学びましょう。

---

本記事の画像は同僚の[@The_Shinji62](https://twitter.com/The_Shinji62)から拝借しました。
