プライベートリポジトリのアプリコードを使ってCode Engineにアプリをデプロイしてみる

Code EngineにはCICDの機能が組み込まれているため、アプリコードが管理されているGitリポジトリを指定するだけで、コードを取得し、ビルドし、デプロイすることができます。

パブリック・アクセス可能なGitリポジトリであればすぐにアクセスできますが、自分たちで開発しているアプリコードはプライベート・リポジトリで管理していることがほとんどだと思います。今回はそんなプライベートリポジトリとCode Engineを連携する方法を試してみたいと思います

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/35ed3411-6261-595e-5f65-b5afbcc7c099.png)

## コード・リポジトリーのアクセス設定は２つから選べる

SSHキーを利用してプライベートリポジトリにアクセスできるように設定します。

設定方法は２つあり、それぞれでアクセス可能な範囲が変わってきます。

1. アカウント全体に対する設定
    一度設定すればアカウントが持っているすべてのリポジトリにアクセスできる
    一方、付与される権限が強いため、セキュリティ上の考慮が必要になる
    
2. 特定のリポジトリに対する設定
    設定したリポジトリのみアクセス可能で、かつ読み取り専用の設定も可能
    一方、アプリ（リポジトリ）が増えるたび設定しなければならない

## 設定の流れ

1. プライベートリポジトリを用意する
    デプロイされたいアプリをプライベート・リポジトリに用意するか
    [サンプルコード](https://github.com/kota661/ce-helloworld)をForkして用意してください
2. SSH keyの作成
3. GitHubやIBM Cloud上で提供されているGit Repos and Issue Tracking(GitLab)へSSH Keyの公開鍵を登録
4. Code EngineにSSH Keyの秘密鍵を登録
5. プライベートリポジトリを利用したアプリの作成

## SSH Keyの作成

まずは、SSH Keyの作成を行います。

作成に際して、**セキュア・パスフレーズは使用せず**に作成してください。セキュア・パスフレーズを使用した場合Code EngineのBuildフェーズにてエラーが発生します。

```bash

EMAIL=your_email@example.com
EMAIL=satokota@jp.ibm.com
FILENAME=~/.ssh/codeengine_ed25519

ssh-keygen -t ed25519 -C $EMAIL -N "" -f $FILENAME

# SSH 鍵ファイルはセキュア・パスフレーズを使用せずに作成しています。
# 使用してしまった場合はCode Engineのbuildコマンドが失敗します。
```

コマンド実行後に生成されるファイル

```bash

.ssh
├── config
├── codeengine_ed25519　　　　　# Code Engine に登録する秘密鍵
└── codeengine_ed25519.pub    # GithubやGitlabに登録する公開鍵
```

## GitHubへのSSH Keyの登録

### アカウント全体に対する設定

[こちらのURL](https://github.com/settings/keys)からアクセスいただき GitHub の設定のSSH Keys登録画面を開きます

画面右上の **「New SSH key」** をクリックします

![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/27103111-41e7-7a3b-e34f-cf209c03efe7.png)

**「SSH Keys / Add new」** の画面にて必要事項を入力し、**「Add SSH key」** をクリックします

- Title：自分が識別できる名前（サンプルではcodeengine_ed25519と入力しています）
- Key：codeengine_ed25519.pub の中身
    
    ```bash
    # ファイルの中身をクリップボードにコピーするコマンド
    cat $FILENAME.pub | pbcopy
    ```
    

![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/c5dbf313-2b31-d071-45ab-5467b84d9c5b.png)

設定したタイトルのSSH Keyが一覧に表示されていれば登録完了です

![Untitled 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/b9304112-dd0d-0735-b69c-d394a1a28a82.png)

### 特定のリポジトリに対する設定

[GitHub](https://github.com/)にアクセスし設定したいリポジトリを開き、 **「Settings」＞「Deploy Keys」** の順にクリック

Deploy Keys 画面にて **「Add deploy key」** をクリック

![Untitled 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/65943405-a498-8210-9ea9-5f18ae93ef6f.png)

**「Deploy Keys / Add new」** の画面にて必要事項を入力し、**「Add key」** をクリックします

- Title：自分が識別できる名前（サンプルではcodeengine_ed25519と入力しています）
- Key：codeengine_ed25519.pub の中身
    
    ```bash
    # ファイルの中身をクリップボードにコピーするコマンド
    cat $FILENAME.pub | pbcopy
    ```
    
- Allow Write access：OffのままでOK

![Pasted_Image_2022_06_24_10_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/797ba59e-8835-7b40-4951-04ef9fea8f63.png)


## Git Repos and Issue Tracking (GitLab)へのSSH Keyの登録

IBM Cloudの **[Continuous Delivery](https://cloud.ibm.com/catalog/services/continuous-delivery)** の１サービスとして提供されているGit Repos and Issue Tracking（GitLabベース）へのSSH Keyを登録してみます

各リージョンごとにアクセス先が異なりますが、今回は東京リージョンを利用した設定を試してみます

[https://jp-tok.git.cloud.ibm.com/](https://jp-tok.git.cloud.ibm.com/)

### アカウント全体に対する設定

[こちらのURL](https://jp-tok.git.cloud.ibm.com/-/profile/keys)にアクセスし、アカウント設定にあるSSH Keysの設定画面を開きます

**「SSH Keys」** の画面にて必要事項を入力し **「Add key」** をクリックします

- Key：codeengine_ed25519.pub の中身
    
    ```bash
    # ファイルの中身をクリップボードにコピーするコマンド
    cat $FILENAME.pub | pbcopy
    ```
    
- Title：自分が識別できる名前（サンプルではcodeengine_ed25519と入力しています）

![Untitled 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/5a72c037-d99e-34bf-3112-7df6b88d8661.png)

入力した内容でSSH Keyが登録されました

![Untitled 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/ae5bd0a4-ab69-7547-bdfd-f4e77c7c0efb.png)

### 特定のリポジトリに対する設定

**[Git Repos and Issue Tracking](https://jp-tok.git.cloud.ibm.com/)** にアクセスし設定したいリポジトリを開き、 **「Settings」＞「Repository」** の順にクリック 

**「Deploy Keys」** を探し **「Expand」** をクリックし入力フォームを表示させます

必要事項を入力し **「Add key」** をクリックしキーを登録します

- Title：自分が識別できる名前（サンプルではcodeengine_ed25519と入力しています）
- Key：codeengine_ed25519.pub の中身
    
    ```bash
    # ファイルの中身をクリップボードにコピーするコマンド
    cat $FILENAME.pub | pbcopy
    ```
    
- Grant Write permissions to this key：Offのまま

![Untitled 8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/35d4208d-525f-18d7-5125-de239ff8505d.png)

## Code EngineへのSSH Keyの登録

Code Engine のコード・リポジトリ・アクセスに作成したSSH Keyの秘密鍵を登録します

[こちらのリンク](https://cloud.ibm.com/codeengine/projects)からアクセスいただき、利用するプロジェクトを選択します。

（もしまだプロジェクトがない場合はプロジェクトを作成してください）

![Untitled 9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/30c82c84-bd52-306a-0168-84bfb11dd439.png)

プロジェクトの画面にて、左側メニューから **「コード・リポジトリ・アクセス」** を選択、コード・リポジトリ・アクセス画面にて作成をクリックします。

![Untitled 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/427039dc-2105-2d15-b825-944c06af8f69.png)

**「コード・リポジトリ・アクセスの作成」** にて必要事項を入力し作成をクリックします

- 名前：自分が識別できる名前（サンプルではcodeengine_ed25519と入力しています）
- SSH 秘密鍵：codeengine_ed25519 の中身

```bash
# ファイルの中身をクリップボードにコピーするコマンド
# SSH 秘密鍵
cat $FILENAME | pbcopy
```

![Pasted_Image_2022_06_24_10_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/f9fb27ab-e138-d1be-1077-bc705f50343e.png)


設定した名前が一覧に表示されていれば完了です

![Untitled 12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/62ed90a3-0305-ef98-fd76-d080c3b94cc2.png)

以上でプライベート・リポジトリへのアクセス設定は完了です！

## プライベートリポジトリを利用したアプリの作成

それでは早速、プライベート・リポジトリを利用したアプリを作成してみましょう

パブリック・リポジトリと違うところは、**「ビルド詳細の設定」** の、「コード・リポジトリ・アクセス」にて登録したアクセス情報を選択することです。

![Untitled 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/ae33416f-55ae-3876-a9cc-85921669abeb.png)

まずは、プロジェクトの画面から、アプリケーション

![Untitled 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/215b2bb1-0f0b-ce82-9160-9c09454e002a.png)

アプリケーションの作成画面似て必要事項を入力します

名前：お好きな名前（私は ce-helloworld-private-repo と入力しています）

実行するコードの選択：ソース・コード

ソース・コードURL：お持ちのプライベートリポジトリのURL（私は [git@github.com](mailto:git@github.com):kota661/ce-helloworld-private.git と入力しています）

![Untitled 15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/d6e82567-9d83-005d-6b3f-ba4ec8ea808e.png)

ビルドの詳細設定をクリックし、ビルド詳細の設定に移動します

**この画面が今回一番重要** で、プライベート・リポジトリ・アクセスの設定を行います

**コード・リポジトリ・アクセス** にて登録したアクセス情報をします。

あとは、パブリックリポジトリを使ったアプリのデプロイと同じです

その他ブランチ名やコンテキスト・ディレクトリに変更がある場合は入力し **「次へ」** をクリックします

![Untitled 16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/518b5f30-65ea-9247-e0b7-0588322082ba.png)

次は「戦略」です。ここではビルドの方法を設定します

今回はアプリコードだけで自動ビルド（自分でDockerfileを用意しない方法）でのビルドを行うため **「Cloud Native Buildpack」** を選択し、**「次へ」** をクリックします

![Untitled 17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/4a277bd7-ed58-e8f4-bba6-f9ba7b4745c7.png)

最後に **「出力」** です。ここではビルド後のコンテナイメージの名前や保管場所などを設定します

必要事項を入力し、**完了** をクリックします

- 名前空間：最初のステップで作成したContainer Registryの名前空間名
- リポジトリー（イメージ名）：helloworld-private

![Untitled 18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/08da01d9-ccba-b578-6818-2c13b30ec7fc.png)

以上でアプリ作成の設定は完了です！最後に作成ボタンをクリックします

![Untitled 19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/dbd0a6ef-6f8d-b69d-884a-f58f0899d605.png)

作成ボタンをクリック後、すぐにアプリのビルドとデプロイが実行されます。 **「ビルド実行の状況」** が **成功** に、そして **「アプリ」** と、 **「選択されたリビジョン」** のステータスが **準備完了** になればアプリのデプロイが成功しています

**ビルドが失敗した場合**、リポジトリへのアクセス設定が正しく行えていない可能性が高いです。今一度指定したリポジトリにアクセス権限があるか、間違ったSSH Keyを登録していないか等確認してください

![Untitled 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/c9273ff2-3121-e2a1-0a06-f8ae18ca1760.png)

準備完了となったので、早速、アプリにアクセスしてみましょう

**「アプリケーションのテスト」＞「アプリケーションのURL」** の順にクリックしクリックしアプリにアクセスします

![Untitled 21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/afd8552b-d655-903b-3f7b-2b37892538c7.png)

以下のようなHelloworldアプリが表示されればデプロイ成功です！

![Untitled 22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/c98d6c9a-d09c-88b5-8694-6e15973527d5.png)

サンプルコードであればパブリックリポジトリにあるケースが多いですが、実際自分たちがアプリ開発しているコードはプライベートリポジトリの場合がほとんどだと思います。プライベートリポジトリへのアクセス設定を利用して実際に開発されているアプリをCode Engineにデプロイしてみてください

## 関連のリンク

- IBM Cloud Docs
    - [プライベート・コード・リポジトリーへのアクセス | IBM Cloud 資料](https://cloud.ibm.com/docs/codeengine?topic=codeengine-code-repositories&locale=ja)
- GitHub
    - アカウント全体: [Adding a new SSH key to your GitHub account - GitHub Docs](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account)
    - リポジトリごと: [Managing deploy keys - GitHub Docs](https://docs.github.com/en/developers/overview/managing-deploy-keys#deploy-keys)
- GitLab
    - アカウント全体：[Use SSH keys to communicate with GitLab | GitLab](https://docs.gitlab.com/ee/user/ssh.html)
    - リポジトリごと：[Deploy keys | GitLab](https://docs.gitlab.com/ee/user/project/deploy_keys/)