【IBM Cloud】CI/CDをいじってみた　①CIツールチェーンのセットアップ

## はじめに
今回はIBM CloudのDevSecOpsを触りながらソフトウェア開発サイクルを理解し、自ら簡単なアプリケーションをデプロイしてみることを最終目標として検証していきます。
今回はその初めての段階としてCIツールチェーンの作成について記述します。

## 前提条件
今回の作業のためには以下の前提条件をクリアする必要があります。
流れの中で説明されていますが、各インスタンスは同様のリージョン、リソース・グループに設定する必要があります。
今回私は、全てリージョンは「東京」、リソース・グループは「Default」に設定しています。
- IBM Cloudの[アカウント](https://cloud.ibm.com/docs/account?topic=account-accounts)を用意
- IBM Cloud上のパスワードや鍵など、シークレット管理ができるサービスを作成（Secret Managerなど）
    - 参考：[Secret Manager作成について](https://cloud.ibm.com/docs/secrets-manager?topic=secrets-manager-getting-started)
- [こちら](https://cloud.ibm.com/kubernetes/catalog/create)にてKubernetesクラスターを作成
    - 参考：[Kubernetesクラスター作成](https://cloud.ibm.com/docs/containers?topic=containers-clusters)
- [こちら](https://cloud.ibm.com/registry/namespaces)にてContainer Registry名前空間の作成
    - 参考：[Container Registryについて](https://cloud.ibm.com/docs/Registry?topic=Registry-getting-started)
- [こちら](https://cloud.ibm.com/iam/apikeys)にてIBM Cloud APIキー作成
- IBM Cloud CLIインストール
    - 参考：[IBM Cloud CLIインストール](https://cloud.ibm.com/docs/cli?topic=cli-getting-started) 
- [こちら](https://cloud.ibm.com/catalog/services/cloud-object-storage)にてIBM Cloud Object Storageインスタンスとバケット作成
    - 参考：[IBM Cloud Object Storageの作成](https://cloud.ibm.com/docs/devsecops?topic=devsecops-cd-devsecops-cos-config)

## DevSecOpsについて
#### 概念
普段DevOpsという言葉によく触れているかと思います。
DevOps（開発・運用）は一言で言うと、開発者と運用者が常に連携しながら協業していくフレームワークの考え方を示します。アプリの開発の品質と速度を改善し、新規および修正されたソフトウェア機能やリリース時間を短縮を目標としています。

ここでDevSecOpsとは、DevOpsの考え方にSec（Security）が加えられたもので、ソフトウェア開発ライフサイクルのすべてのフェーズにセキュリティーを自動的に組み込み、アジャイルとDevOpsのスピードでのセキュアなソフトウェアの開発を実現するものとなります。
![devsecops.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/354e11a5-79bb-8c2a-c860-786ca0258bda.jpeg)

#### CI（Continuous Integration）とは
CIはとは継続的インテグレーションの略で、各開発者が少なくとも1日に1回、新規コードをメインブランチのコードと統合する、ソフトウェア開発とDevOpsのプラクティスです。
継続的インテグレーションは、DevOpsフレームワークにおいてソフトウェア開発プロセスの初期段階に位置しています。

## CIツールチェーンの作成の流れ
上記記載の前提条件が全て完了しましたら、CIツールチェーンを作成します。
[IBM Cloudコンソール画面](https://cloud.ibm.com/)の`ナビゲーション・メニュー`をクリックし、`DevOps`→`ツールチェーン`にアクセスします。
![スクリーンショット 2023-02-27 15.36.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/d28620d9-5d8b-4710-6fd1-3777d24ed79d.png)

ツールチェーン画面で`ツールチェーンの作成`をクリックします。
![スクリーンショット 2023-02-27 15.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/58e9ac3a-4cbf-eaf1-62ed-6e59c72dcf4c.png)

IBM Cloudで提供している様々なツールチェーンが表示されますが、今回はCIツールチェーンの作成をします。`CI-セキュア・アプリの開発(DevSecOpsプラクティス)`をクリックします。
![スクリーンショット 2023-02-27 15.36.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/27bbdcac-cd4c-93ee-2027-b8f0481d30a1.png)

以下の画面がツールチェーン作成画面となります。上端に社内開発に利用する際の「One -Pipelineバージョン」設定ボタンがありますが、今回は設定なしで進めます。
下の`始動する`ボタンをクリックします。
![FireShot Capture 070 - ツールチェーンの作成 - IBM Cloud - cloud.ibm.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/75168ee3-274e-1561-fd35-e96d46c01598.png)

ツールチェーン設定画面でツールチェーン名やリージョン、リソース・グループを設定します。
注意点として、ツールチェーンのリージョンは、クラスターと各種レジストリのリージョンと同じリージョンやリソース・グループを設定する必要があります。
設定が完了したら`ツールチェーンの作成`をクリックします。

＊ツールチェーンの作成は各ページの下端に表示される`ツールチェーンの作成`ボタンにて、デフォルト値で自動作成されます。もしボタンクリックでも進めない箇所があれば、そのページでの設定を行い、もう一度試してください。
よくあるパターンは、前提条件を満たしていない場合や、上記のリージョンが設定が合わないため、システム的に自動で入力されないケースです。
![スクリーンショット 2023-02-27 15.41.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/54b12afa-6330-2ae9-6d08-83c95948ad6b.png)

次は前提条件で作成したSecrets Managerの設定です。
リージョンやリソース・グループを設定し、`ツールチェーンの作成`をクリックします。
![スクリーンショット 2023-02-27 15.41.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/7c517fb8-f851-040f-5af4-7e34750c5733.png)

次はデプロイメント・ターゲットを設定します。
前提条件として作成したIBM Cloud APIキーを入力します。
もし作成が漏れている場合などは、`新規`ボタンにて作成することができます。
IBM Cloud APIキーは`鍵マーク`をクリックすると、自動に設定されます。
![スクリーンショット 2023-02-27 15.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/c6277bd9-e1b0-ba48-6605-ef443c7522dd.png)
![スクリーンショット 2023-02-27 15.42.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/14d11d19-ce00-f15c-bfb2-62e2083b6832.png)

もしうまくいかない場合には、IBM Cloudコンソール画面で`管理`→`アクセス(IAM)`→`APIキー`に進み、詳細に記載されているIDをコピーして入力ください。
![スクリーンショット 2023-02-27 16.15.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/0f8e5fa6-bdd7-c3c9-01fe-d2a5ca99fc94.png)
![スクリーンショット 2023-02-27 16.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/6cc2b7e7-45c8-2d41-0e15-31c9c29c1744.png)
![スクリーンショット 2023-02-27 16.16.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/a574c28b-49c7-dae3-1600-e23d7059f006.png)

IBM Cloud APIキーの設定が終わったら、下にスクロールし、同様にIBM Kubernetes Serviceのクラスターを設定します。
Container Registryのリージョンや名前空間、開発クラスター・リージョン、リソース・グループなどを設定します。
設定が完了したら、下端の`ツールチェーンの作成`をクリックします。
![スクリーンショット 2023-02-27 15.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/fe1ab255-b1e4-ae63-bdea-bb9806ac520d.png)

次はアプリケーションの Docker イメージに署名するためイメージ署名鍵(GPGキー)を設定します。
今回私は持っていなかったため新規に作成していますが、もしお持ちの方は`鍵マーク`にて自動設定してください。
イメージ署名鍵の設定が終わったら、`ツールチェーンの作成`をクリックします。
![スクリーンショット 2023-02-27 15.43.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/353a7c5b-7924-1dbb-ba56-072d3c58d1fe.png)
![スクリーンショット 2023-02-27 15.43.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/e059f23f-72ef-3663-9ad3-3843ddc6f250.png)

次はオプションで設定できるSlack機能の選択有無です。
Slackと連携することによって、チーム同士での共同作業などにおける通知設定が可能となります。
Slackの通知設定は[Slack API Webサイト](https://api.slack.com/messaging/webhooks)にてWebhookの設定を行うことで可能となります。今回はSlack設定は行っていませんが、もしWebhook設定が必要な方は、私が以前作成した[【IBM Cloud】Event Notificationsを使ってSlackと連携し、通知を飛ばしてみた](https://qiita.com/Sungyun_Moon/items/a1f08663204fe8155243)にWebhook設定の流れが記載されているので、参考にしてください。
設定が完了したら、`ツールチェーンの作成`をクリックします。
![スクリーンショット 2023-02-27 15.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/7c401979-793d-a5e8-a7ab-6d29caba074d.png)
![スクリーンショット 2023-02-27 15.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/991019f2-3c49-e7fd-f485-b77790b14665.png)

ここまで完了すると、自動にツールチェーンの作成が開始され、ツールチェーンインスタンスに表示されます。
![スクリーンショット 2023-02-27 16.36.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/363a7b98-a3fb-5e05-5866-20c6de960666.png)
![スクリーンショット 2023-02-27 16.37.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/3d31f13a-281a-c4de-d9e1-1639e40cb845.png)

## 最後に
今回はDevOpsにおけるCIツールチェーンを作成する流れを整理しました。
最初独学で行ったところ、色々詰まったり失敗した箇所が多く、初めて触る方にもぜひ参考にしていただければと思います。
次回はCDツールチェーンの作成を行い、アプリデプロイに向けて記事を公開していきます。

## 注意点
1. ツールチェーン作成の際、リージョンやリソース・グループは全て統一してください。
2. Qiita記事作成にあたり、環境の時間軸の前後やインスタンス名の違いなどがあります。

## 参考
- IBM Cloud Docs
    - [前提条件のセットアップ](https://cloud.ibm.com/docs/devsecops?topic=devsecops-tutorial-cd-devsecops)
    - [CIツールチェーンのセットアップ](https://cloud.ibm.com/docs/devsecops?topic=devsecops-tutorial-ci-toolchain)
    - [GPG鍵の生成](https://cloud.ibm.com/docs/devsecops?topic=devsecops-devsecops-image-signing)