IBM Cloud® Code Engine に超シンプルなJava WARアプリをibmcloud CLIからデプロイする


# 概要

1. WAR を作成
1. Dockerfile を作成する 
1. Code Engine にデプロイする

# WAR の準備

サンプルとしてこんなWebアプリを用意しておきます。
今回はJSPを配置しただけのものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/7b1e0289-c1f7-18c2-2fdb-118b8f35a4e3.png)


```jsp:index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
	<h1><%=new java.util.Date()%></h1>
	<ol>
		<li>OK</li>
	</ol>
</body>
</html>
```

```xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>hello-maven-webapp</groupId>
	<artifactId>hello-maven-webapp</artifactId>
	<version>1.0.0.0</version>
	<packaging>war</packaging>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
	</properties>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.9.0</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.3.2</version>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>
</project>
```

mvn package コマンドでビルドすると target ディレクトリに hello-maven-webapp-1.0.0.0.war が生成されます。


# Docker Build の準備

適当なフォルダ（例：hello-ibm-codeengine-tomcat）を作成して、そこに作成済みのWAR（例：hello-maven-webapp-1.0.0.0.war）をコピーしてください。また空のテキストファイルとして Dockerfile を作成し、以下のように編集してください。

ベースとなるTomcatは8.5にしておりますが、お好みのバージョンやリリースで作ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/6c71d35b-faa6-9895-2a0a-93e1f2c70190.png)

```text:Dockerfile
FROM tomcat:8.5-jdk15-openjdk-slim 
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
WORKDIR ${CATALINA_HOME}
COPY hello-maven-webapp-1.0.0.0.war webapps/hello-maven-webapp-1.0.0.0.war
```

# Code Engine の準備

プロジェクトを作成しておきます。
ここでは「demoapp」という名前でプロジェクトを作成してあります。
一つのプロジェクトに対し、複数のアプリケーションをデプロイすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/667c3afc-8799-8405-c037-2a44666b8592.png)

# Code Engine CLI の操作

## 前提

IBM Cloud CLI (ibmcloudコマンド) を事前に準備しておく必要があります

Getting started with the IBM Cloud CLI
https://cloud.ibm.com/docs/cli?locale=ja

Installing the stand-alone IBM Cloud CLI
https://cloud.ibm.com/docs/cli?topic=cli-install-ibmcloud-cli&locale=ja

→ インストーラーはこちら https://github.com/IBM-Cloud/ibm-cloud-cli-release/releases/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/e6de0999-5608-35ba-2640-12f0224803ba.png)



Code Engine CLI プラグインもインストールしておきます

Code Engine CLI プラグインのインストール
https://cloud.ibm.com/docs/codeengine?topic=codeengine-install-cli#install-cli-plugin

→ Code Engine CLI プラグインのインストールコマンドはこちら 

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


## CLIからログイン

```
>ibmcloud login
```

SSO が適用されている場合は --sso オプションを付けます

```
> ibmcloud login --sso
```

複数の組織に紐づいている場合、「ターゲット」を選択します。

```
>ibmcloud login --sso
API エンドポイント: https://cloud.ibm.com
リージョン: jp-tok

https://xxx.xxx.iam.cloud.ibm.com/identity/passcode からワンタイム・コードを取得して、続行します。
デフォルトのブラウザーで URL を開きますか? [Y/n] > Y
ワンタイム・コード >
認証中です...
OK

アカウントを選択:
1. XXX (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)
2. YYY (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) <-> 2222222
3. ZZZ (cccccccccccccccccccccccccccccccc) <-> 3333333
数値を入力してください> 3
ターゲットのアカウント ZZZ <-> 3333333


API エンドポイント:      https://cloud.ibm.com
Region:                  jp-tok
ユーザー:                xxx@xxx.com
アカウント:              ZZZ (cccccccccccccccccccccccccccccccc) <-> 3333333
リソース・グループ:      リソース・グループがターゲットになっていません。'ibmcloud target -g RESOURCE_GROUP' を使用して ください
CF API エンドポイント:
組織:
スペース:
```


## ターゲットリソースの指定

リソースグループを確認します。

```
$ ibmcloud resource groups
```

リソースグループを指定します。（ default でなくて Default になっているときもあります）

```
>ibmcloud target -g default
```

↑のコマンドを実行しておかないと「ターゲットになっているリソース・グループがありません。'ibmcloud target -g RESOURCE_GROUP_NAME' を実行してください。」と叱られます。

## プロジェクトのLIST

Code Engine のWeb画面で作っておいたプロジェクトを表示します。

```
>ibmcloud ce project list
プロジェクトを取得中...
OK

名前     ID                                    状況    有効  選択済み  タグ  領域    リソース・グループ  経過時間
demoapp  XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX  active  true  false           jp-tok  default             39m
```

## デプロイ対象のCode Engineプロジェクトを指定する

どのプロジェクトのアプリをデプロイするのか、を指定します。

```
>ibmcloud ce project select --name demoapp
```

## ビルド・デプロイコマンドの実行

ここが一番重要です。
最後にWebアプリのURLが表示されます。

```
>ibmcloud ce application create --name demo --build-source .
アプリケーション 'demo' を作成中...
パス「.」からアップロードするファイルのパッケージ化...
ビルド実行 'demo-run-NNNNN-NNNNNNNNN'を送信中...
イメージ 'private.jp.icr.io/ce--XXXXX-XXXXXXXXXXX/app-demo:NNNNNN-NNNN-XXXXX' を作成しています ...
ビルド実行が完了するのを待機しています...
ビルド実行状況: '実行中'
ビルド実行が正常に完了しました。
ビルド実行の状況を確認するには、'ibmcloud ce buildrun get -n demo-run-NNNNN-NNNNNNNNN' を実行してください。
アプリケーション 'demo' が作動可能になるのを待機しています。
構成 'demo' は、リビジョンが準備完了になるのを待機しています。
入口はまだ調整されていません。
ロード・バランサーが準備完了になるのを待機しています。
アプリケーション状況を確認するには、'ibmcloud ce application get -n demo' を実行してください。
OK

https://demo.XXXXXXXX.jp-tok.codeengine.appdomain.cloud

>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/a148ade0-2980-2637-aa1c-c959195b6927.png)

## アプリを開いてみる

URL「demo.XXXXXXXX.jp-tok.codeengine.appdomain.cloud/hello-maven-webapp-1.0.0.0/index.jsp」を開いてみます。無事にJSPがコンパイルされて日付が動的に表示されるのを確認できたらOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/f7ff9d2f-2ff9-55d4-eaf0-7b28f8ba7c61.png)


以上です。


# ひとこと

簡単なことは簡単にできたほうがよいです。

# 参考になるかもしれないページ

https://qiita.com/ayatokura/items/ae6f60ecb2b0f0e8e7ae

Deploying your app from local source code with the CLI
https://cloud.ibm.com/docs/codeengine?topic=codeengine-app-local-source-code

Getting started with IBM Cloud Code Engine
https://cloud.ibm.com/docs/codeengine#app-hello

CLI を使用したローカル・ソース・コードからのアプリのデプロイ
https://cloud.ibm.com/docs/codeengine?topic=codeengine-app-local-source-code

Deploying and scaling applications
https://cloud.ibm.com/docs/codeengine?topic=codeengine-deploy-app-tutorial