concourse-ciの環境構築(Mac編)

# concourse-ciの環境構築(Mac編)

## はじめに
concourse-ciはパイプラインベースのCIツールです。
YAMLで処理を定義して、実行と実行結果についてはWebで確認が出来ます。
ここでは、ローカルのMac上での環境構築を適当に纏めています。

## 環境
* Mac os x HighSierra
* Docker Desktop for Mac　Version 2.0.0.3
* concourse/concourse 5.0.1

## 構築

docker-composeを利用して構築を行います。
今回は、タスクの実行環境はlinuxとdarwinを使用出来るようにします。
linuxはDockerイメージを利用したい時に利用していて、
darwinはMac上でしか実行出来ないとかDockerだと面倒な時に利用しています。

### docker-compose.ymlの作成

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

services:
  concourse-db:
    image: postgres
    environment:
      POSTGRES_DB: concourse
      POSTGRES_USER:
      POSTGRES_PASSWORD:
      PGDATA: /database

  concourse-web:
    image: concourse/concourse
    command: web
    privileged: true
    depends_on: [concourse-db]
    volumes: ["./keys/web:/concourse-keys"]
    ports: ["8080:8080","2222:2222"]
    environment:
      CONCOURSE_POSTGRES_HOST: concourse-db
      CONCOURSE_POSTGRES_USER:
      CONCOURSE_POSTGRES_PASSWORD:
      CONCOURSE_POSTGRES_DATABASE: concourse
      CONCOURSE_EXTERNAL_URL: http://localhost:8080
      CONCOURSE_ADD_LOCAL_USER: test:test
      CONCOURSE_MAIN_TEAM_LOCAL_USER: test

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

### .envの作成

環境毎の設定やログイン情報を設定

```bash:.env
POSTGRES_USER=concourse_user
POSTGRES_PASSWORD=concourse_pass
CONCOURSE_POSTGRES_USER=concourse_user
CONCOURSE_POSTGRES_PASSWORD=concourse_pass
CONCOURSE_ADD_LOCAL_USER=test:test
```


### ssh-keyの作成

concourse-ciで使用する`ssh-key`を作成します。
必要なKeyを作成するshellが用意されているので使用します。
https://github.com/concourse/concourse-docker/blob/master/generate-keys.sh

```bash:
$ sh generate-keys.sh --use-pem
```
`--use-pem`がないと、以下のエラーを吐いて起動してくれない
https://github.com/concourse/concourse/issues/2590

```bash:エラー
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xf726f5]

goroutine 1 [running]:
crypto/rsa.(*PrivateKey).Public(0x0, 0x0, 0x0)
	/usr/local/go/src/crypto/rsa/rsa.go:100 +0x5
golang.org/x/crypto/ssh.NewSignerFromSigner(0x7f6f930c8320, 0xc00000ea78, 0xc00000ea78, 0x7f6f930c8320, 0xc00000ea78, 0xe18e01)
	/tmp/build/9674af12/concourse/src/golang.org/x/crypto/ssh/keys.go:681 +0x35
golang.org/x/crypto/ssh.NewSignerFromKey(0x2924340, 0xc00000ea78, 0xe18e08, 0x30, 0x2a085a0, 0xc000c3b778)
	/tmp/build/9674af12/concourse/src/golang.org/x/crypto/ssh/keys.go:656 +0x16a
github.com/concourse/tsa/tsacmd.(*TSACommand).configureSSHServer(0xc000ef8e70, 0xc000639080, 0xc00015cd70, 0x1, 0x1, 0x0, 0x0, 0x0, 0xc00019a620, 0x7, ...)
	/tmp/build/9674af12/concourse/src/github.com/concourse/tsa/tsacmd/command.go:197 +0x167
...
```


### 起動
docker-composeで起動させます。  
起動して、[localhost:8080](http://localhost:8080/)にアクセス出来たら成功

```text:構成
├── .env
├── docker-compose.yml
├── generate-keys.sh
└── keys
    ├── web
    │   ├── authorized_worker_keys
    │   ├── session_signing_key
    │   ├── session_signing_key.pub
    │   ├── tsa_host_key
    │   └── tsa_host_key.pub
    └── worker
        ├── tsa_host_key.pub
        ├── worker_key
        └── worker_key.pub
```

```bash:
$ docker-compose up -d
Creating network "concourse_default" with the default driver
Creating concourse_concourse-db_1 ... done
Creating concourse_concourse-web_1 ... done
Creating concourse_concourse-worker_1 ... done
```


### 停止または削除
docker-composeの停止させます。  

```bash:停止
$ docker-compose stop
```

```bash:削除
$ docker-compose down
```

##flyのインストール
concourse-ciでは、パイプラインの実行はWEBから操作出来ますが登録や削除などはFlyというCLIツールを使って行います。

以下の場所からダウンロードしてください。 
[https://concourse-ci.org/download.html](https://concourse-ci.org/download.html)
あとは任意の場所に置いてパスを通してください。

```bash:とりあえず起動
$ wget https://github.com/concourse/concourse/releases/download/v5.0.1/fly-5.0.1-darwin-amd64.tgz
$ tar zxvf fly-5.0.1-darwin-amd64.tgz
$ ./fly --version
5.0.1
```

flyを使うには、ログインする必要がありますが、ブラウザを使ってログインする必要があります。
以下のコマンドを叩いて、表示されたURLでログインすればflyコマンドが使えるようになります。

```bash:
$ ./fly -t tutorial login -c http://localhost:8080
logging in to team 'main'

navigate to the following URL in your browser:

  http://localhost:8080/login?fly_port=59005

or enter token manually: 
target saved
```
`tutorial`は任意のターゲット名を指定しています。

##Macのworkerを構築
workerを起動させる為にはconcourse-ciをMacにインストールさせる必要があります。

以下の場所からダウンロードしてください。 
[https://concourse-ci.org/download.html](https://concourse-ci.org/download.html)
あとは任意の場所に置いてパスを通してください。

```bash:とりあえず起動
$ wget https://github.com/concourse/concourse/releases/download/v5.0.1/concourse-5.0.1-darwin-amd64.tgz
$ tar zxvf concourse-5.0.1-darwin-amd64.tgz
$ sudo concourse/bin/concourse worker --work-dir /opt/concourse/worker --tsa-host 127.0.0.1:2222 --tsa-public-key ./keys/worker/tsa_host_key.pub --tsa-worker-private-key ./keys/worker/worker_key
{"timestamp":"2019-03-27T08:28:51.806578000Z","level":"info","source":"baggageclaim","message":"baggageclaim.listening","data":{"addr":"127.0.0.1:7788"}}
{"timestamp":"2019-03-27T08:28:51.806565000Z","level":"info","source":"worker","message":"worker.garden.started","data":{"session":"1"}}
{"timestamp":"2019-03-27T08:28:51.843553000Z","level":"info","source":"worker","message":"worker.beacon-runner.beacon.registered","data":{"session":"9.1"}}
```
concourse-ciがdockerで起動していなかったり、接続情報が間違っているとエラーを吐き出していると思います。

```bash:エラー
{"timestamp":"2019-03-27T08:32:15.293364000Z","level":"info","source":"worker","message":"worker.garden.started","data":{"session":"1"}}
{"timestamp":"2019-03-27T08:32:15.293453000Z","level":"info","source":"baggageclaim","message":"baggageclaim.listening","data":{"addr":"127.0.0.1:7788"}}
{"timestamp":"2019-03-27T08:32:15.293484000Z","level":"error","source":"worker","message":"worker.beacon-runner.beacon.failed-to-connect-to-tsa","data":{"error":"dial tcp 127.0.0.1:2222: connect: connection refused","session":"9.1"}}
{"timestamp":"2019-03-27T08:32:15.293673000Z","level":"error","source":"worker","message":"worker.beacon-runner.beacon.dial.failed-to-connect-to-any-tsa","data":{"error":"all worker SSH gateways unreachable","session":"9.1.1"}}
{"timestamp":"2019-03-27T08:32:15.293707000Z","level":"error","source":"worker","message":"worker.beacon-runner.beacon.failed-to-dial","data":{"error":"all worker SSH gateways unreachable","session":"9.1"}}
{"timestamp":"2019-03-27T08:32:15.293747000Z","level":"error","source":"worker","message":"worker.beacon-runner.beacon.exited-with-error","data":{"error":"all worker SSH gateways unreachable","session":"9.1"}}
{"timestamp":"2019-03-27T08:32:15.293808000Z","level":"error","source":"worker","message":"worker.beacon-runner.failed","data":{"error":"all worker SSH gateways unreachable","session":"9"}}
```

###起動の確認

以下のコマンドで、`platform`に`darwin`が追加されてれば大丈夫

```bash:
$ fly -t tutorial workers
name                   containers  platform  tags  team  state    version
d06145c75abb           0           linux     none  none  running  2.1    
hostname.local         0           darwin    none  none  running  2.1   
```

これで、一旦`concourse-ci`が使える状態になったので使い方を別記事で書くかも

##参考

* [公式](https://concourse-ci.org/)
* [公式チュートリアル](https://concourse-ci.org/)