Concourse CIの環境構築手順

## 概要
Concourse CIの環境構築手順です。

## 関連記事
- [Concourse CIでRailsアプリケーションをデプロイする](https://qiita.com/Esfahan/items/af6f5b092fbb2a406210)
- [Concourse CIのpipelineの書き方](https://qiita.com/Esfahan/items/81eb53686506ab6bd898)

## 環境
- CentOS 7.2
- kernel 4.12.4-1.el7.elrepo.x86_64
- fly 3.3.4
- docker 17.05.0-ce
- docker-compose version 1.15.0

## 必要要件
以下にあるように、Concourse CIを使うためには、kernelのバージョンは、v3.19以上である必要があります。
`uname -r` コマンドで、kernelのバージョンを確認してください。

https://concourse.ci/single-page.html

> For Linux you'll need kernel v3.19 or later, with user namespace support enabled. Windows and Darwin don't really need anything special.

もし、バージョンが低い場合は、以下を参考にして、アップデートしてください。
[VagrantのCentOS7のカーネルを更新(yum)](http://qiita.com/reflet/items/b1d9f169dfdad69c4d35)

**追記**
kernelをupdateするためのシェルスクリプトを作成しました。
こちらを実行すれば、カーネルがアップデートされます。
CentOS7.2でしか動作検証していません。
https://github.com/Esfahan/kernel-updater

## docker-composeのインストール
こちらを参照
[docker(docker-engine), docker-composeのインストール](http://qiita.com/Esfahan/items/aa5802548ee42d8a98de)

## docker-compose.ymlを作成
任意の場所に、docker-compose.ymlを作成してください。

```yaml:docker-compose.yml
version: '3'

services:
  concourse-db:
    image: postgres:9.5
    environment:
      POSTGRES_DB: concourse
      POSTGRES_USER: "${CONCOURSE_POSTGRES_USER}"
      POSTGRES_PASSWORD: "${CONCOURSE_POSTGRES_PASSWORD}"
      PGDATA: /database

  concourse-web:
    image: concourse/concourse
    links: [concourse-db]
    command: web
    depends_on: [concourse-db]
    ports: ["8080:8080"]
    volumes: ["./keys/web:/concourse-keys"]
    restart: unless-stopped # required so that it retries until conocurse-db comes up
    environment:
      CONCOURSE_BASIC_AUTH_USERNAME: "${CONCOURSE_BASIC_AUTH_USERNAME}"
      CONCOURSE_BASIC_AUTH_PASSWORD: "${CONCOURSE_BASIC_AUTH_PASSWORD}"
      CONCOURSE_EXTERNAL_URL: "${CONCOURSE_EXTERNAL_URL}"
      CONCOURSE_POSTGRES_HOST: concourse-db
      CONCOURSE_POSTGRES_USER: "${CONCOURSE_POSTGRES_USER}"
      CONCOURSE_POSTGRES_PASSWORD: "${CONCOURSE_POSTGRES_PASSWORD}"
      CONCOURSE_POSTGRES_DATABASE: concourse

  concourse-worker:
    image: concourse/concourse
    privileged: true
    links: [concourse-web]
    depends_on: [concourse-web]
    command: worker
    volumes: ["./keys/worker:/concourse-keys"]
    environment:
      CONCOURSE_TSA_HOST: concourse-web
```

## .envの作成
`CONCOURSE_EXTERNAL_URL` にブラウザからアクセスできるURLをセットします。
127.0.0.1 or localhostではダメです。
`CONCOURSE_BASIC_AUTH_USERNAME` , `CONCOURSE_BASIC_AUTH_PASSWORD` には、
ConcourseCIにログインするためのアカウントを設定します。
`CONCOURSE_POSTGRES_USER` , `CONCOURSE_POSTGRES_PASSWORD` には、postgresのアカウントを設定します。

以下のような.envを作成します。

```lang:.env
CONCOURSE_BASIC_AUTH_USERNAME=concourse
CONCOURSE_BASIC_AUTH_PASSWORD=changeme
CONCOURSE_EXTERNAL_URL=http://192.168.33.10:8080
CONCOURSE_POSTGRES_USER=concourse
CONCOURSE_POSTGRES_PASSWORD=changeme
```

## ssh-keyを作成
webとworkerのためにキーを作成。
docker-compose.ymlと同じ階層で実行します。

```
$ mkdir -p keys/web keys/worker
$ ssh-keygen -t rsa -f ./keys/web/tsa_host_key -N ''
$ ssh-keygen -t rsa -f ./keys/web/session_signing_key -N ''
$ ssh-keygen -t rsa -f ./keys/worker/worker_key -N ''
$ cp ./keys/worker/worker_key.pub ./keys/web/authorized_worker_keys
$ cp ./keys/web/tsa_host_key.pub ./keys/worker
```

## docker-compose

```
$ docker-compose up -d --build
```

## ブラウザでアクセス
http://192.168.33.10:8080

<img width="1244" alt="f19e3022d995da01d350220100bed8ac.png" src="https://qiita-image-store.s3.amazonaws.com/0/105936/0a6a8acb-f6ae-5e3c-0287-52f96d69fa76.png">

## CLIのインストール
http://192.168.33.10:8080
で表示されるページの以下の3つのアイコンが、それぞれ、mac, windows, linux用のcliのダウンロードリンクになっているので、環境にあったものをダウンロードするか、

<img width="274" alt="f880efe45c135a80605bb01ac35a4b8d.png" src="https://qiita-image-store.s3.amazonaws.com/0/105936/41807c79-3663-a2ad-c5ca-e7d24430b8b3.png">

こちらのリンク先の、Fly Binariesからダウンロードします。
https://concourse.ci/downloads.html

```
$ curl -L https://github.com/concourse/concourse/releases/download/v3.5.0/fly_linux_amd64 > /tmp/fly
$ sudo mv /tmp/fly /usr/local/bin/fly
$ sudo chmod 775 /usr/local/bin/fly
```

## login
http://192.168.33.10:8080 にログインします。
アカウントは、.envで設定した、以下のものになります。

```lang:.env
CONCOURSE_BASIC_AUTH_USERNAME=concourse
CONCOURSE_BASIC_AUTH_PASSWORD=changeme
```


```
$ fly -t concourseci login -c http://192.168.33.10:8080
```

login時に、以下のようなメッセージが出る場合は、最新版のflyをインストールしなおしてください。

```
fly version (3.4.1) is out of sync with the target (3.5.0). to sync up, run the following:

    fly -t rails-sample sync
```


https://concourse.ci/fly-cli.html
List the current targets

```
$ fly targets
name         url                        team  expiry
concourseci  http://192.168.33.10:8080  main  Sat, 05 Aug 2017 03:46:25 UTC
```

## 動作確認
パイプラインをセットして、動作確認をします。

[flight-school](https://github.com/concourse/flight-school)のサンプルを使ってpipelineを作成してみます。
railsアプリケーションになります。

```yaml:pipeline.yml
---
resources:
- name: flight-school
  type: git
  source:
    uri: https://github.com/concourse/flight-school
    branch: master

jobs:
- name: test
  plan:
  - get: flight-school
    # Resourceに変更があれば自動でジョブを実行するかどうか
    trigger: true
  - task: run-tests
    config:
      platform: linux
      image_resource:
        type: docker-image
        source:
          repository: ruby
      inputs:
      - name: flight-school
      run:
        path: /bin/bash
        args:
        - -c
        - |
          cd flight-school
          bundle install
          bundle exec rspec
```

pipelineをセットします。

```
$ fly -t concourseci set-pipeline -c pipeline.yml -p flight-school
resources:
  resource flight-school has been added:
    name: flight-school
    type: git
    source:
      branch: master
      uri: https://github.com/concourse/flight-school

jobs:
  job test has been added:
    name: test
    plan:
    - get: flight-school
    - task: run-tests
      config:
        platform: linux
        image_resource:
          type: docker-image
          source:
            repository: ruby
          params: {}
        run:
          path: /bin/bash
          args:
          - -c
          - |
            cd flight-school
            bundle install
            bundle exec rspec
          dir: ""
        inputs:
        - name: flight-school
          path: ""

apply configuration? [yN]: y
pipeline created!
you can view your pipeline here: http://192.168.33.10:8080/teams/main/pipelines/flight-school

the pipeline is currently paused. to unpause, either:
  - run the unpause-pipeline command
  - click play next to the pipeline in the web ui
```

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

```
$ fly -t concourseci unpause-pipeline -p flight-school
unpaused 'flight-school'
```

## jobを実行
### コマンドラインで実行する場合

```
$ fly -t concourseci trigger-job -j flight-school/test --watch
```

### web画面で実行する場合
http://192.168.33.10:8080

右上のloginをクリック -> 画面中央のmainをクリックして、以下の画面が表示されたら、.envで設定したアカウントを入力してください。

```lang:.env
CONCOURSE_BASIC_AUTH_USERNAME=concourse
CONCOURSE_BASIC_AUTH_PASSWORD=changeme
```

<img width="1245" alt="19ff2a52fd25bcd3198c9907fc7874f2.png" src="https://qiita-image-store.s3.amazonaws.com/0/105936/9b626f14-e5fa-bbc1-f64c-7e0afdb52ef1.png">

ログインしたら、以下の画面が表示されるので、testをクリックしてください。

<img width="1242" alt="b4af30637a76d996bd8e7ecfcc9ed50e.png" src="https://qiita-image-store.s3.amazonaws.com/0/105936/c4587f63-7d70-45d6-c22d-a7d5a78f641b.png">

以下の画面が表示されたら、右上の `+` ボタンをクリックしてください。ビルドが始まります。

<img width="1245" alt="30f4ddb62e38a90c110ff2c43f16bfb8.png" src="https://qiita-image-store.s3.amazonaws.com/0/105936/672a2bb7-a4e8-2bcc-2eb5-165a0c7ec4be.png">

ビルドが始まると、こんな感じになります。

<img width="1247" alt="d0e9918b78a983774d14fc66ab540e69.png" src="https://qiita-image-store.s3.amazonaws.com/0/105936/04a1f91a-2a50-1c35-b124-9c8504088439.png">

正常に完了すると、緑色になります。

<img width="1245" alt="52890a64207d0831c1e3c402160d5cf2.png" src="https://qiita-image-store.s3.amazonaws.com/0/105936/552c45d7-df8a-20c6-6bed-2f5b41b50511.png">

エラーが出ずに完了し、緑色になれば成功です。

以上

## 参考
- [Docker Repository](https://concourse.ci/docker-repository.html)
- [set-pipeline: Configuring Pipelines](https://concourse.ci/fly-set-pipeline.html)
- [BLOG.IK.AM](https://blog.ik.am/entries/379)
- [DockerでConcourse CIを動かしてみた](http://s-edword.hatenablog.com/entry/2017/05/14/002115)
- [Concourse CIのflyコマンド&設定ファイルまとめ](http://qiita.com/mumoshu/items/aab5de3b9c73e6c7dd56)
- [an example Ruby app we are testing in Concourse called flight-school.](http://engineering.pivotal.io/post/concourse-docker-image-resource-cache-tutorial/)