Concourse CIでビルドした結果をS3互換なオブジェクトストレージサーバMinioにアップロードする

[Concourse CI](https://concourse.ci/)でビルドした結果のレポートなどをどこかにアップロードして、ブラウザから見えるようにしたい。のですが、S3などを使える環境ではないのでS3とAPI互換のある[Minio](https://www.minio.io/)にアップロードするようにしてみました。

Minioからも以下のようにファイルをブラウザから確認することはできるのですが、HTMLとして出力されたレポートを見たいので別途WebサーバをApacheでたてています。

![Minio_Browser_と_Minio_Browser.png](https://qiita-image-store.s3.amazonaws.com/0/6092/2fb12cda-ec2f-004d-0e88-dd18d1aa5701.png)

## 環境構築

Concourse CIとMinio、Apacheはdocker-composeで立ち上げました。
Minioでファイルが格納されるディレクトリとApacheのドキュメントルートを同じディレクトリに`volumes`でマウントしてやることで、アップロードされたファイルをApache側にアクセスすることでブラウザ上で見ることが出来るようになります。

```bash
$ git clone https://github.com/tenten0213/s3-resource-simple
$ cd s3-resource-simple
# Concourseの鍵の生成などしてから
$ docker-compose up -d
```

```yaml:docker-compose.yml
concourse-db:
  image: postgres:9.5
  environment:
    POSTGRES_DB: concourse
    POSTGRES_USER: concourse
    POSTGRES_PASSWORD: changeme
    PGDATA: /database

concourse-web:
  image: concourse/concourse
  links: [concourse-db]
  command: web
  ports: ["8080:8080", "2222:2222"]
  volumes: ["./keys/web:/concourse-keys"]
  environment:
    CONCOURSE_BASIC_AUTH_USERNAME: concourse
    CONCOURSE_BASIC_AUTH_PASSWORD: changeme
    CONCOURSE_EXTERNAL_URL: http://localhsot:8080
    CONCOURSE_POSTGRES_DATA_SOURCE: |-
      postgres://concourse:changeme@concourse-db:5432/concourse?sslmode=disable

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

minio:
  image: minio/minio:RELEASE.2017-05-05T01-14-51Z
  volumes: ["./minio-data:/export"]
  ports: ["9000:9000"]
  environment:
    MINIO_ACCESS_KEY: minio
    MINIO_SECRET_KEY: minio123
  command: server /export

httpd:
  image: httpd:2.4
  ports: ["8000:80"]
  volumes: ["./minio-data:/usr/local/apache2/htdocs"]
```

## パイプラインの設定

Concourse CIのパイプラインは以下の通り。
タイトルにビルドと書きましたが、今回はGitHubから持ってきたファイルをアップロードするだけです。

```yaml:pipeline.yml
# Pipeline that clones this repository, then uploads it to S3. Local usage:
#
#   fly set-pipeline -t lite -n -c test/pipeline.yml -p s3-resource-simple-test -v aws-access-key=minio -v aws-secret-key=minio123 -v aws-bucket=report -v aws-s3-endpoint=http://localhost:9000/
#
resource_types:
- name: s3-upload
  type: docker-image
  source:
    repository: making/s3-resource-simple
resources:
- name: files
  type: git
  source:
    uri: https://github.com/tenten0213/s3-resource-simple.git
    branch: master
- name: s3-bucket
  type: s3-upload
  source:
    access_key_id: {{aws-access-key}}
    secret_access_key: {{aws-secret-key}}
    bucket: {{aws-bucket}}
    endpoint: {{aws-s3-endpoint}}
    disable_ssl: true
    use_v4: true
jobs:
- name: custom-resource-example
  plan:
  - get: files
  - put: s3-bucket
```

パイプラインをセットする際に、access keyやsecret keyを渡してやります。
変数名が`aws-`となっていますが、minioのaccess keyやsecret keyを渡します。
`bucket`は、同名のbucketを先にMinioで作成しておきます。

```bash
$ fly set-pipeline -t lite -n -c test/pipeline.yml -p s3-resource-simple-test -v aws-access-key=minio -v aws-secret-key=minio123 -v aws-bucket=html -v aws-s3-endpoint=http://192.168.11.6:9000/
```

パイプラインをセットすると以下のようにブラウザからパイプラインを確認することができます。

![s3-resource-simple-test_-_Concourse_と_Minio_Browser.png](https://qiita-image-store.s3.amazonaws.com/0/6092/acdac7ab-192c-da8b-0b10-a5459bb7fc56.png)

## パイプラインの実行

パイプラインを実行し、成功すると冒頭の画像の通り、Minioにファイルがアップロードされます。

![custom-resource-example__2_-_Concourse_と_Minio_Browser.png](https://qiita-image-store.s3.amazonaws.com/0/6092/808831de-5d6b-b59d-649b-5392f7ed17ce.png)

Apache側にアクセスするとこんな感じです。

![Index_of__scripts_files.png](https://qiita-image-store.s3.amazonaws.com/0/6092/e1ae20f2-b6b7-0a66-aed6-a7b5195a9492.png)

HTMLも表示してみます。

![Upload_to_Minio.png](https://qiita-image-store.s3.amazonaws.com/0/6092/82b79a73-dfe7-855a-b92c-200ed10e50f2.png)

## まとめ

今回初めてMinioを使ってみましたが、S3と同様のAPIで扱えるのでサンプルなどが多く大変助かりました。
これでテストや静的解析結果のレポートのアップロード先とブラウズする仕組みが出来たので、次回はレポート出力から今回の仕組みに繋げるところを試してみようと思います。

試したモロモロは以下に置いてあります。

* https://github.com/tenten0213/s3-resource-simple