【IBM Cloud】IBM Cloud Kubernetes上で継続的デリバリーのツールチェーンを構築し、Slackと連携してみた

## はじめに
今回はIBM Cloud Kubernetes Serviceのクラスター上にCICDパイプラインを構築し、Slackと連携してみたので、その流れを整理します。

作業における前提は以下のとおりです。

- IBM Cloudの[アカウント](https://cloud.ibm.com/docs/account?topic=account-accounts)（無料利用可能）の準備
- IBM Cloud Kubernetes Service（IKS）のクラスター作成
    - クラスター作成手順は、[こちら](https://qiita.com/Sungyun_Moon/items/a698cfd7b0f053fb1554)を参照ください。
    - 今回はクラシッククラスターの最小構成で作成しております。
- CICDに関する簡単な紹介については[こちら](https://qiita.com/Sungyun_Moon/items/fe7cbba9df924a4bfb60)を参照ください。

## 検証の流れ
### 1. サンプル・アプリケーションの作成
IBM Cloudコンソール画面から、`ナビゲーションメニュー`→`DevOps`→`ツールチェーン`をクリックします。
![スクリーンショット 2023-12-18 15.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/fe75a9cc-6bc7-66cf-0eb0-4fc10556c40f.png)
リソース・グループやロケーションを選択肢、`ツールチェーンの作成`をクリックします。
![スクリーンショット 2023-12-18 15.44.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/4cff0546-6eec-0b47-e4d5-cd1202702aeb.png)
ツールチェーンの作成画面が表示されたら、検索欄に`Kubernetes`と検索し、`Kubernetesアプリの開発(Helm)`を選択します。
![スクリーンショット 2023-12-18 15.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/ad51993f-fde0-48d2-30e1-3447ecd1cb28.png)
ツールチェーンのインスタンス名やリージョン、リソースグループなどを設定し、下の`ツール統合`カテゴリから`Delivery Pipeline`をクリックします。
![スクリーンショット 2023-12-18 15.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/762ad7ce-99d0-e88e-29ea-851df2e4c7d8.png)
Delivery Pipelineの設定ではIBM Cloud APIキーを記入する必要がありますが、今回私は新規作成しています。もし既存のAPIキーがある場合はそれを選択し、ない場合には`新規`をクリックします。
また、前提条件として既に作成したKubernetesクラスターを選択し、下の`作成`をクリックします。
![スクリーンショット 2023-12-18 15.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/4f4fc3c8-1e4e-f366-9a1d-caf9a930b542.png)
パイプラインが作成されたら、早速ステージが走り始めます。しばらく経つとDeployまで成功されるかと思います。（この作業には数分程度かかります）

:::note
クラシックではなくVPCクラスターの場合、 「Check health」 ジョブは失敗しますが、無視して進めても大丈夫です。
:::

![スクリーンショット 2023-12-18 13.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/8ddf071d-b569-132b-4528-95022ab65115.png)
![スクリーンショット 2023-12-18 13.58.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/07e08cc5-dae9-8243-ccae-fa4a3669fab4.png)

パイプラインが完了されるまで多少時間がかかるため、その間に事前に作成したKubernetesクラスターに移動し、Ingressサブドメインを取得します。（新しいタブで開くことをおすすめします）
Ingressサブドメインはクラスターの概要画面で確認できますが、この後何回も使用するので別途メモしておきます。
![スクリーンショット 2023-12-18 16.05.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/54584d0e-4158-1065-49de-15505c6119e5.png)
パイプラインの画面に戻り、DEPLOYの`歯車ロゴ`をクリックし、`ステージの構成`をクリックします。
カテゴリーで`環境プロパティー`に移動し、`プロパティーの追加`→`テキスト・プロパティー`をクリックします。
![スクリーンショット 2023-12-18 16.11.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/18ca05c1-653d-8554-bc62-9eb3b259c006.png)
![スクリーンショット 2023-12-18 16.11.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/3b138a35-f892-63b2-5558-328ad29df1c4.png)
そうすると、新しいプロパティーの行が追加されるので、前の`NAME`には`HELM_UPGRADE_EXTRA_ARGS`を、`値`には`--set ingress.enabled=true,ingress.hosts={dev.INGRESSサブドメイン}`を入力します。
設定を完了したら下の`保存`をクリックします。
![スクリーンショット 2023-12-18 16.16.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/80c9acad-1228-6b3d-bd4b-aefd6510c515.png)

:::note warn
注意点
- `値`の最前にハイフン二つ`--`を必ず含めてください。
    - ハイフンは全角/半角などの区別があるため、もし失敗した場合には変更しながら何回か試してみてください。（私個人はこれでかなり詰まりました。。）
- Ingressサブドメインの前に、必ず`dev.`を含めてください。
- `値`に情報記入する際、括弧`{}`まで必ず含めてください。
:::

その後、DEPLOYの`再生ロゴ`をクリックし、再度DEPLOYステージが成功することを確認した後、URLタブに`dev.INGRESSサブドメイン`を入力するとWeb上に **「Welcome to IBM Cloud DevOps with Docker, Kubernetes and Helm Charts. Lets go use the Continuous Delivery Service」** とのメッセージが表示されます。
![スクリーンショット 2023-12-18 17.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/2b527a91-e3e0-011e-e33b-7f0c6d6c7f08.png)

### 2. アプリケーションの変更と更新のデプロイ
次はアプリケーションを少し修正してみたいと思います。
ツールチェーンの概要画面に戻り、リポジトリーのリンクにアクセスすると、新しいタブでリポジトリーが表示されます。
その中から最下端の`utils.js`ファイルをクリックします。
![スクリーンショット 2023-12-18 17.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/ae3033d7-01d2-4869-ce09-e286fe40f75a.png)
![スクリーンショット 2023-12-18 17.15.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/298f8b6e-66be-b678-b3ae-eb7efdcbfcea.png)

ファイルに入ると、先ほどのWebアプリケーションの内容がJavaScript形式で表示されています（赤色）。
こちらの文章を修正することができますが、`Edit`→`Open in Web IDE`をクリックします。
![スクリーンショット 2023-12-18 17.20.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/de710e46-23c5-963f-6a20-9277e9ab3205.png)

JavaScript画面が表示されたら、メッセージの部分を自由に修正します。今回私は **「こんにちは、IBM Cloudです！」** に修正しました。
修正が完了したら左下の`Create Commit...`をクリックします。
![スクリーンショット 2023-12-18 17.24.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/98463dd3-5bd7-4143-d4d7-2d497a6522c5.png)
修正された項目を比較して表示されますが、最終確認後、再度左下の`Commit`をクリックします。

次の画面で`Create merge request`→`Merge`をクリックします。
![スクリーンショット 2023-12-18 17.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/79c22a1f-3919-7aa4-602e-c12f2a56f2ee.png)
![スクリーンショット 2023-12-18 17.27.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/01297687-ef9f-08c5-dddc-dc9d39e821db.png)

その後、ツールチェーン画面に戻りますと、ステージが最初から走り出していることが確認できます。DEPLOYステージまで成功することを待ちます。
![スクリーンショット 2023-12-18 17.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/615e7533-e0e2-6dbc-08f3-f9a66f3fd882.png)
![スクリーンショット 2023-12-18 17.36.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/8577fb13-1e4f-ec5f-faab-916e78ee4d56.png)
ステージが成功すると、再度URLに`dev.INGRESSサブドメイン`を入力すると、更新されていることが確認できます。
![スクリーンショット 2023-12-18 17.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/45cf0c34-8b0c-4b25-a92d-a01f9348d563.png)

### 3. 実稼働環境へのデプロイ
もし必要に応じてアプリケーションを開発環境と実稼働環境を分けてデプロイパイプラインを作成するときの流れについても簡単にご紹介します。この方法には[複数の方法](https://cloud.ibm.com/docs/account?topic=account-account_setup)がありますが、今回はそれぞれ別の名前空間にデプロイする簡単な方法を試しています。

ツールチェーン画面のDEPLOYステージの`歯車ロゴ`→`ステージのクローン`をクリックします。
![スクリーンショット 2023-12-18 17.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/cfd728d8-950f-960a-952f-2f0292530df1.png)

ステージ構成画面が表示されたら、タイトルを変更し（例：Deploy prodなど）、ステージ・トリガーを`このステージが手動で実行されたときにのみジョブを実行`をクリックします。
また`環境プロパティー`欄をクリックし、先ほど追加したプロパティーの`dev`を`prod`に変更します。（例：`--set ingress.enabled=true,ingress.hosts={**prod**.INGRESSサブドメイン}`）
設定が完了したら最下端の`保存`をクリックします。
![スクリーンショット 2023-12-18 17.46.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/1dd7be12-7f42-9b0a-7eed-eae63b16db1e.png)
![スクリーンショット 2023-12-18 17.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/e894fa39-01dc-7dcd-c059-0d569f1ad866.png)

そして、前段階と同様、Deploy prodステージの`再生ロゴ`をクリックし、ステージが成功になることを待ちます。
（成功写真）

再度URL欄に`dev.Ingressサブドメイン`、`prod.Ingressサブドメイン`を入力すると、別の環境が作成できたことがわかります。
![スクリーンショット 2023-12-18 15.07.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/3f36f648-1326-ed24-dbc6-6dfd2eb2dbd7.png)
![スクリーンショット 2023-12-18 15.07.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/0319ead2-88a0-3d95-91f4-6aff353f34cb.png)

### 4. Slackとの連携
Slackと連携させるためには、ツール選択し統合させる必要があります。
ツールチェーン画面に戻り、右上の`追加`をクリックし、Slackをクリックします。
![スクリーンショット 2023-12-18 18.00.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/15355c1e-dd31-edd7-069f-2561e7cfc2e1.png)
![スクリーンショット 2023-12-18 18.00.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/3a68d244-7482-268d-ab97-3389ffe1a3fb.png)

Slackとの統合のために必要な情報（Slack Webhook、Slack チャンネル、Slack チーム名）を入力する必要がありますが、各取得方法は下に記載します。
![スクリーンショット 2023-12-18 18.02.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/bd7f186a-09c3-28d3-18f5-441e3686d281.png)

#### 1. Slack Webhook取得方法

まず、[Slack Help Center](https://slack.com/intl/en-in/help/articles/115005265063-Incoming-webhooks-for-Slack)にアクセスし、着信Webhookの設定手順が記載されています。
![スクリーンショット 2022-11-21 16.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/a7d322fa-e472-13cc-57a1-abbe7cae2015.png)

メッセージを投稿する新しいワークスペースを作成していきます。
`「Create a new Slack app」`をクリックすると、[Slack API](https://api.slack.com/apps?new_app=1)画面に移ります。
`「Create New App」`をクリックし、アプリケーション名やSlackのワークスペースを選択します。
その後、`「Create App」`をクリックすると作成完了です。
![スクリーンショット 2022-11-21 16.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/13eb1553-04c3-b1da-dd49-c5357ee7618e.png)
![スクリーンショット 2023-12-18 18.13.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/d1ecc1e4-4d01-1900-604a-79abe63ba5ad.png)

アプリケーションを作成したら、`「Incoming Webhook」`ボタンをクリックします。
![スクリーンショット 2022-11-21 16.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/0e483799-cd1d-adb4-7b86-631c8328d890.png)
Incoming Webhooks画面で`「Activate Incoming Webhooks」`を`off`から`on`に変えます。
すると、変更すると非表示になっていた画面が表示されるので、
下の`「Add New Webhook to Work space」`をクリックします。
![スクリーンショット 2022-11-21 16.28.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/b386e591-196c-d108-6b41-7af533ca459e.png)
投稿先のチャンネルを選択する画面が表示されるので、プルダウンし任意のチャンネルを選択し`許可`をクリックします。
![スクリーンショット 2023-12-18 18.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/a1fa9964-c28a-3bd2-cd18-fc5aad4534b4.png)

再度Incoming画面に戻り、Webhook URLが作成されたことが確認できます。
![スクリーンショット 2022-11-21 16.32.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/4864bb8a-6b2a-1197-0cc5-d4a5430f0f2f.png)

#### 2. Slack チャンネルの取得
Slack チャンネルは上記選択したチャンネルを選択します。
![スクリーンショット 2023-12-18 18.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/d1b8e786-5571-82a1-3091-74a574efe8bd.png)

#### 3. Slack チーム名の取得
Slackチーム名はSlackで確認することができます。プロフィールロゴをクリックし、`@@@.slack.com`のアドレスのうち、slack.com前半部分がチーム名となります。（例：moon.slack.comの場合、`moon`がチーム名です）
![スクリーンショット 2023-12-18 18.24.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/f75565df-ca02-f009-cb8e-0ed7baf26f0f.png)
![スクリーンショット 2023-12-18 18.24.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/e11e8126-7a29-d5ab-e755-3dadcedb4615.png)

全ての情報が取得できたら、情報を入力し、`統合の作成`クリックします。
![スクリーンショット 2023-12-18 18.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/ff67a755-9686-f254-b42a-45e66a99114a.png)

すぐSlackと連携され、通知が飛んできます。一度統合すると、そのあとはツールチェーン・デリバリー・パイプラインが実行されるたびに、構成したチャネルにSlack通知が表示されます。
通知の色などはカスタマイズも可能ですので、試してみてください。
![スクリーンショット 2023-12-18 18.37.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/0770e41c-502d-203f-75e1-49dd4246adb8.png)