手元にあるコードを直接Code Engineにデプロイしてみる

手元で開発しているコードをリポジトリにコミットなどすることなく、とりあえずデプロイしてみたいときってありませんか？私は学習環境やPoC環境などでたまに思います。

通常、Code Engineへのデプロイはコンテナイメージを指定する方法や、ソースコードがあるGitリポジトリを指定する方法が、CLIを使うことで、ローカルにあるソースコードを直接デプロイすることができるようになっています！

Cloud Foundryを利用されていた人なら **cf push！** ってなると思いますがまさにそれです。手元てサクッとアプリを作り、挙動を確認しつつ開発したいといったときに便利です。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/7e11d485-ce34-f175-e436-21692c0b2bd0.png)


## デプロイの流れ

1. IBM Cloud CLI
2. Code EngineのプロジェクトとContainer Registryの名前空間作成
3. CLIを利用してローカルコードを直接デプロイ
4. お掃除

## 1. IBM Cloud CLI, Code Engine pluginのインストール

ローカルコードを直接デプロイするにはCLIが必要なので、まずはIBM Cloud CLI(`ibmcloud`)とCode Engine Plugin(`ibmcloud ce`)をインストールします。

最初にIBM Cloud CLIのインストールです

以下のURLからご利用されているOS用のインストールコマンドを実行してください

[https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli&locale=ja#shell_install](https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli&locale=ja#shell_install)

例：mac: `$ curl -fsSL [https://clis.cloud.ibm.com/install/osx](https://clis.cloud.ibm.com/install/osx) | sh`

次にCode Engine Pluginのインストールです。こちらのコマンドを実行してください

```bash
$ ibmcloud plugin install code-engine
```

インストールできたか確認します

```bash
$ ibmcloud ce --help
```

以下のような実行結果が表示されていればOKです

```bash
NAME:
  code-engine, ce - Manage Code Engine components

USAGE:
  ibmcloud ce command [arguments...] [options...]

COMMANDS:
  application, app    Manage applications.
  build, bd, b        Manage configurations for generating images from source code.
  buildrun, br        Generate images from a build.
  configmap, cm       Manage configmaps.
  job                 Manage jobs to configure tasks.
  jobrun, jr          Manage instances of a job.
  project, proj       Manage Code Engine projects.
  reclamation, recl   Manage Code Engine project reclamations.
  registry            Manage image registry access secrets.
  repo                Manage Git repository access secrets.
  revision, rev       Manage application revisions.
  secret              Manage generic secrets.
  subscription, sub   Manage event subscriptions.
  version, v          Display the 'code-engine' command-line interface version.

Enter 'ibmcloud ce help command' for more information about a command.
```

## 2. Code EngineのプロジェクトとContainer Registryの名前空間作成

デプロイ先のCode Engineプロジェクトや、ビルドしたコンテナイメージの保管先として指定するContainer Registryの名前空間を作成します

作成方法はこちらをご参照ください

[数分でアプリがデプロイできるコンテナ環境！IBM Cloud Code Engine - Qiita](https://qiita.com/satokota/items/b3cecd591e244fed391f)

## 3. CLIを利用してローカルコードを直接デプロイ

CLIを利用してローカルコードを直接デプロイします。

1. IBM Cloud CLIでログインを行い
2. Code Engineのプロジェクトを選択し
3. サンプルコードをローカルに配置
4. 最後にローカルコードを直接デプロイ

という流れです。

3-1. IBM Cloud CLIでログインを行います。`ibmcloud login`を実行しログインのメールアドレスや利用するリージョン選択を行います

```bash
# IBM Cloud へのログイン
$ ibmcloud login -r jp-tok
API endpoint: https://cloud.ibm.com

Email> {メールアドレス}

Password>
Authenticating...
OK

Targeted account kota-xxx (xxxxxxxxxxxx) <-> 123456

Select a region (or press enter to skip):
1. au-syd
2. in-che
3. jp-osa
4. jp-tok
5. kr-seo
6. eu-de
7. eu-gb
8. ca-tor
9. us-south
10. us-east
11. br-sao
Enter a number> 4
Targeted region jp-tok

Users of 'ibmcloud login --vpc-cri' need to use this API to login until July 6, 2022: https://cloud.ibm.com/apidocs/vpc-metadata#create-iam-token

API endpoint:      https://cloud.ibm.com
Region:            jp-tok
User:              {メールアドレス}
Account:           kota-xxx (xxxxxxxxxxxx) <-> 123456
Resource group:    No resource group targeted, use 'ibmcloud target -g RESOURCE_GROUP'
CF API endpoint:
Org:
Space:
```

3-2. 次に利用するCode Engineプロジェクトの選択を行います

```bash
# Default以外のリソースグループを利用されている場合は利用するリソースグループを指定します
$ ibmcloud target -g kota-labs

# Code Engineプロジェクトの選択
$ ibmcloud ce project select -n satokota-labs

Selecting project 'satokota-labs'...
OK

# 確認
$ ibmcloud ce app list

Listing all applications...
OK

Name  Status  URL  Latest  Age  Conditions  Reason
```

3-3. ログインとプロジェクトの選択が完了したので、次に手元にコードを用意します
今回は、いつものHelloworldアプリを使っていきたいと思います

```bash
# サンプルコードを取得
$ git clone https://github.com/kota661/ce-helloworld.git 

# ソースコードのフォルダに移動
$ cd ce-helloworld

# ファイルの確認
$ ls 
README.md    docs         package.json public       server.js
```

3-4. ついに本日のメインであるローカルのコードを直接Code Engineにデプロイする瞬間がやってきました！

カレントディレクトリにはサンプルコードが配置されている状態です。もちろんDockerfileはなくて問題ありません！

```bash
.
├── README.md
├── docs
│   └── helloworld-app.png
├── package.json
├── public
│   └── images
│       └── developer.png
└── server.js
```

デプロイに利用するコマンドは`ibmcloud ce app create`です

```bash
ibmcloud ce app create --name ${アプリ名} \
  --build-source . \ # カレントディレクトリを指定することでローカルのコードを元にビルドします
  --build-strategy buildpacks \  
  --image private.jp.icr.io/${作成した名前空間}/${アプリ名} 
```

それでは実際にやってみましょう。

```bash
$ ibmcloud ce app create --name helloworld \
  --build-source . \
  --build-strategy buildpacks \ 
  --image private.jp.icr.io/satokota-labs/helloworld 

Creating application 'helloworld'...
Packaging files to upload from source path '.'...
Submitting build run 'helloworld-run-220725-125341643'...
Creating image 'private.jp.icr.io/satokota-labs/helloworld:220725-0353-b880c'...
Waiting for build run to complete...
Build run status: 'Running'
Build run completed successfully.
Run 'ibmcloud ce buildrun get -n helloworld-run-220725-125341643' to check the build run status.
Waiting for application 'helloworld' to become ready.
Configuration 'helloworld' is waiting for a Revision to become ready.
Ingress has not yet been reconciled.
Waiting for load balancer to be ready.
Run 'ibmcloud ce application get -n helloworld' to check the application status.
OK

https://helloworld.qtdvd9tf7jg.jp-tok.codeengine.appdomain.cloud
```

最後に出力されたアプリURLへのアクセスと、Code Engineのダッシュボード上での稼働状況を確認してみます。正常にアプリが起動しており、Code Engineのダッシュボードにもアプリが表示されています！

![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/569e93df-21b8-06ca-bbec-bc539a5d4877.png)
![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/ec001414-9dd3-6f9c-1cde-88a3953e457d.png)


ついでに、アプリのコードを少し変えてアプリの再デプロイができるか試してみます
server.jsの23行目のHello, Worldに！！！！と追加します。

![Untitled 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/6d9f6481-c7a7-ed7f-f45f-9e22c18190e4.png)

先程のデプロイコマンドの app craete の部分を app update に変更し実行します

```bash
$ ibmcloud ce app update --name helloworld \
  --build-source . \
  --build-strategy buildpacks \
  --image private.jp.icr.io/satokota-labs/helloworld
```

Update完了後、再度アプリにアクセスして更新ができていることを確認します。（もし表示が変わらない場合は、ブラウザのキャッシュをクリアしてみてください。）

![Untitled 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136580/edddd6f5-80c6-3430-04a4-afae59e666c2.png)

IBM Cloud CLI＋Code Engine Pluginを利用した、ローカルのコードのデプロイは思った以上にサクッと直接デプロイすることができました！きちっとリポジトリでコード管理を行い、デプロイすることはもちろん大切ですが、たまにはお試しコードや学習環境のデプロイなど、サクッとデプロイしたいときには便利な機能なのではないでしょうか

## 4. 最後にお掃除

こちらのQiitaにあるContainer Registryの名前空間の削除と、Code Engineプロジェクトの削除を行ってください。

[数分でアプリがデプロイできるコンテナ環境！IBM Cloud Code Engine - Qiita](https://qiita.com/satokota/items/b3cecd591e244fed391f)

## より詳しく

- IBM Cloud CLI
    - [スタンドアロン IBM Cloud CLI のインストール | IBM Cloud 資料](https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli&locale=ja#shell_install)
- IBM Cloud Code Engine
    - [IBM Cloud Code Engine CLI | IBM Cloud 資料](https://cloud.ibm.com/docs/codeengine?topic=codeengine-cli)
    - [Deploying your app from local source code with the CLI](https://cloud.ibm.com/docs/codeengine?topic=codeengine-app-local-source-code)