IBM Cloud DevOps ToolChain "Develop a Kubernetes app toolchain"をカスタマイズしてオリジナルのToolChainを作成する

翔泳社より2018年3月15日に「コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤」が発売されました。
本記事はこの中のKubernetes on IBM Cloud Container Service章で取り上げた
IBM Cloud DevOps ToolChainを試してみる。の番外編です。

本記事ではDevOps ToolChainをカスタマイズして独自のコンテナアプリケーションプロジェクトをIBM Cloud Container Serviceへデプロイします。

https://www.shoeisha.co.jp/book/detail/9784798155371

# なぜ番外編？
IBM Cloud Container ServiceをIBM Cloud DevOps ToolChainを利用してアプリケーションのコンテナをビルド・デプロイする部分を書籍では紹介しました。

書籍では、[Develop a Kubernetes app toolchain](https://www.ibm.com/cloud/garage/content/toolchains/develop-kubernetes-app-toolchain)を書籍で紹介するアプリケーションのソースコードが入ったプロジェクトを標準でビルドするようにToolChainや、DeliveryPipelineをカスタマイズしていました。

ToolChainやDeliveryPipelineの部分は書面においては、Kubernetesから大きく外れるため、番外編としてQiitaでの記事掲載としました。

# IBM DevOps ToolChain
OpenToolChainというプロジェクトをご存知ですか？
IBM Cloudで利用できるDevOpsサービスは、[DevOps toolchains](https://www.ibm.com/cloud/garage/category/tools/)として、幾つものToolChainパターンのサンプルが公開されています。

IBM Cloud Container Serviceを利用した[Develop a Kubernetes app toolchain](https://www.ibm.com/cloud/garage/content/toolchains/develop-kubernetes-app-toolchain)や、IBM Cloud Container Service + Kubernetes Helmを利用した[Develop a Kubernetes app with Helm toolchain](https://www.ibm.com/cloud/garage/content/toolchains/develop-kubernetes-app-with-helm-toolchain)をはじめ、CloudFoundryや、Jenkinsを組み合わせたToolChainのサンプルが公開されています。

このQiita記事では書籍で使用したToolChainレポジトリを作成する手順とSlackを利用した通知部分までを紹介したいと思います。

# ToolChainをカスタマイズしてみる
## ToolChainのインポート
[DevOps toolchains](https://www.ibm.com/cloud/garage/category/tools/)のページ上に`Create the Toolchain`と描かれたアイコンがありますが、このリンクはIBM Cloud側にGitレポジトリをURLとして提供し、そのGitレポジトリからToolChainの設定ファイルを読み込むという仕組みとなっているようです。

GitHubには、[OpenToolChain](https://github.com/open-toolchain/secure-kube-toolchain)のプロジェクトが存在し、[Develop a Kubernetes app toolchain](https://www.ibm.com/cloud/garage/content/toolchains/develop-kubernetes-app-toolchain)も、[secure-kube-toolchain](
https://github.com/open-toolchain/secure-kube-toolchain)という名称でレポジトリが公開されています。(※現在のDevelop a Kubernetes app toolchainとなる前は、`Secure Kubernetes toolchain`という名称で公開されていました。)

今回はGitHubの機能を利用してプロジェクト作成時のImportして改良してみましょう。

### まずはNew repository
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/736cfe84-6b31-79a7-f8ed-f80d2d834206.png)

### お好きな名前でrepositoryを作る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/b4eb041d-583e-ef0e-aa54-1f252b383dac.png)

### import code from another repositoryから、「Import code」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/453111c8-68b6-8648-c890-cc0d245104ac.png)

### クローン元URLを入力してImport開始
今回はDevelop a Kubernetes app toolchainのレポジトリURLを入力します。
「https://github.com/open-toolchain/secure-kube-toolchain」
入力後「Begin import」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/ae88caf9-a4be-ae03-c914-894b9679f650.png)

### あたたかいお茶を飲んでひといき。
完了すると以下のような表示になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/1ed4c001-f96e-7f75-d197-5dbd535165ce.png)

## Toolchainの中身
toolchainのフォルダ構造の中身を表にまとめました。
主に今回修正するファイルメインで記載しているので、随時判明次第ほかファイルについては説明書きを追記します。

|ファイル名|説明|ファイル形式|備考|
|:--|:--|:--|:--|
|README.md|gitページに説明や「Create toolchain」ボタンを配置|markdown||
|.cfignore|cf push時に除外するファイル/フォルダ一覧|dot-ignore|未使用|
|.gitignore|git push時に除外するファイル/フォルダ一覧|dot-ignore||
|.bluemix/pipeline.yml|DevOps Delivery Pipelineの挙動をyaml記述しているもの|yaml|編集|
|.bluemix/toolchain.yml|toolchainの挙動をyaml記述しているもの|yaml|編集|


### 主に変更するポイント

repo_urlとその紐づくrepo_nameを置き換えます。
repo_nameやhello-world-repoの要素名はは{{repo_name}}や{{hello-world-repo}}として参照していることから、併せて変更していきます。

```yaml:toolchain.yaml
services:
  hello-world-repo:
    service_id: hostedgit
    parameters:
      repo_name: 'hello-containers-{{timestamp}}'
      repo_url: 'https://github.com/open-toolchain/hello-containers'
      type: clone
      has_issues: true
      enable_traceability: true
```

他、pipeline.ymlはデプロイ時のsvc、app名の修正を行うことで完全にオリジナルのプロジェクトが作成出来ます。

Create toolchainボタンで読み込みするGETパラメータ、repository=のurlを修正します。

```yaml:README.md

[![Deploy To Bluemix](https://console.bluemix.net/devops/graphics/create_toolchain_button.png)](https://console.bluemix.net/devops/setup/deploy/?repository=https%3A//github.com/open-toolchain/secure-kube-toolchain)
```

## Application Projectの中身
アプリケーションソースコードを配置するプロジェクトは以下ファイルが存在することで動作が行われます。
ご自身の好きなプロジェクトに併せて配置してみてください。

ch07-appを例にファイル一覧と説明をまとめます。


|ファイル名|説明|ファイル形式|備考|
|:--|:--|:--|:--|
|README.md|アプリケーション　ソースコードを配置するプロジェクト側の説明ファイル|markdown||
|Dockerfile|Dockerコンテナのイメージをビルドするファイル|Dockerfile||
|deployment.yml|KubernetesのDeploy/Serviceなどをまとめたyamlファイル。toolchainのdeploymentステージで実行される|yaml||
|app/|Dockerファイル上でコピーするappソースコード|ディレクトリ|（例）|

# まとめ
1. toolchainの処理のすべてはtoolchain.ymlに記載されている
2. アプリケーションコード側は既存のDockerプロジェクトにkubernetes向けのyamlファイルを追加していくだけでtoolchainに乗せることができる

# 番外編
slackや他機能の追加方法は順次アップデートしていきます。おたのしみに！