[Concourse]02_gitリポジトリの情報をパイプライン内部で参照する

# 目的

Concourseを用いてgitリポジトリとパイプラインの
連携を実現するための手段について説明します。

# パイプラインの中でgitリポジトリの情報を取得する

以下のようなパイプラインを定義しました。

ただ**gitリポジトリの情報を参照**しつつ、
タスクとして`uname -a`を実行するだけのパイプラインです。

```yaml:02/02_pipeline_repository.yaml
resources:
- name: resource-repository
  type: git
  source:
    uri: git@github.com:Fufuhu/concourse_sample.git
    branch: master
    private_key: ((ssh-key))

jobs:
  - name: job-sample
    plan:
      - get: resource-repository
      - task: task-sample
        config:
          platform: linux
          image_resource:
            type: docker-image
            source:
              repository: alpine
              tag: 3.7
          run: 
            path: /bin/sh
            args:
              - -c
              - -x
              - |
                uname -a
``` 

gitリポジトリの情報を定義している部分は以下の部分です。
リソース(resources)としてgitのリソースを定義しています。
リソースを定義することでジョブの入力、または出力として
ジョブ自体の処理に必要な情報を提供したり、
ジョブの実行結果に応じて情報を出力したりといった設定が可能になります。

```yaml:gitリポジトリの情報部分(抜粋)
resources:
- name: resource-repository
  type: git
  source:
    uri: git@github.com:Fufuhu/concourse_sample.git
    branch: master
    private_key: ((ssh-key))
```

ssh-keyの部分はgitリポジトリにアクセスする際のsshキー情報となるため、
別ファイルにyaml形式で記述しています。

```yaml:ジョブjob-sampleの抜粋
jobs:
  - name: job-sample
    plan:
      - get: resource-repository
```

job-sampleの中でジョブへの入力情報としてgitリポジトリ(`resource-repository`)
を取得(`get`)するよう定義しています。

## パイプライン定義の投入と実行

```bash
$ fly -t home sp -p 02_pipeline_sample -c 02/02_pipeline_repository.yaml -l credentials.yaml
```
`credentials.yaml`にgitリポジトリにアクセスするためのsshキー情報をyaml形式
で記述しています。

以下のような形でのパイプラインが表示されるようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/5482b045-107f-dcc9-d3e1-0c9f797cf1bd.png)

リソース(`resource-repository`)がジョブ(`job-sample`)の入力に
なっているのがわかるかと思います。
しかし、これではただパイプラインにgitのリポジトリが入力として
含まれただけで、ジョブ内部のタスクからは参照できません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/feeb24d3-0857-1161-91d8-d79f52c20d56.png)

しかし、ジョブ(`job-sample`)を実行するとジョブ上では
リソース(`resource-repository`)の情報が認識されていることがわかります。

次はジョブ内部に定義したタスクから参照する方法を記述します。

# ジョブ内部のタスク(`task-sample`)でリソース(`resource-respository`)の情報を取得できるようにする

ジョブ内部のタスクからリポジトリの情報を取得できるように、
設定を変更しました。

```yaml:02_pipeline_repository_input.yaml
resources:
- name: resource-repository
  type: git
  source:
    uri: git@github.com:Fufuhu/concourse_sample.git
    branch: master
    private_key: ((ssh-key))

jobs:
  - name: job-sample
    plan:
      - get: resource-repository
      - task: task-sample
        config:
          platform: linux
          image_resource:
            type: docker-image
            source:
              repository: alpine
              tag: 3.7
          inputs:
            - name: resource-repository
          run: 
            path: /bin/sh
            args:
              - -c
              - -x
              - |
                uname -a
                ls -lah
                ls -lah resource-repository
```

変更部分は以下の部分です。

```yaml:task-sampleの定義(抜粋)
      - task: task-sample
        config:
          platform: linux
          image_resource:
            type: docker-image
            source:
              repository: alpine
              tag: 3.7
          inputs:
            - name: resource-repository
```

先ほどでは記述されていなかった`inputs`の記述があります。
ここで、ジョブの定義で`get`していた`resource-repository`の情報を
タスク内で利用することを宣言することができます。

## パイプライン定義の投入と実行

```bash
$ fly -t home sp -p 02_pipeline_sample_input -c 02/02_pipeline_repository_input.yaml -l credentials.yaml
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/e613557c-7f11-9450-cb82-d8725426d388.png)

パイプラインを実行すると違いが現れます。
タスク(`task-sample`)を実行しているコンテナイメージの内部に
リソース(`resource-repository`)の情報が含まれるようになっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/4ab929bc-7beb-e0f2-72a2-879e1829eaf6.png)

これによってgitリポジトリの情報をコンテナ内部から操作することができるようになりました。
これによってリポジトリに含まれるソースコードからバイナリをビルドするといったことが実現できます。

# まとめ

ここでは、ジョブの中に含まれるタスクの内部でgitリポジトリの情報を
参照するための手段について提供しました。

具体的には、

1. リソースを定義する
2. ジョブの中でリソースを取得(get)する
3. ジョブ内のタスクでリソースを入力(input)する

上記３つを満たすことでタスク内部でgitリポジトリの情報を参照することができます。

今回も、
[Fufuhu/concourse_sample](https://github.com/Fufuhu/concourse_sample)の`02`ディレクトリ配下に
サンプルのyamlファイルを格納しています。