Dev Spacesで始めるOpenLiberty（IBM Semeruランタイムを使用する編）

# はじめに
「[Dev Spacesで始めるOpenLiberty](https://qiita.com/mi-ta/items/6f2293164fd4bf1b91c8)」で、リモート開発環境を起動できることを確認しました。Libertyを扱うプロジェクトではIBMが提供するJDKを選択する機会が多いと思いますので、IBM Semeruランタイムを使用するための設定を考えていきます。

# Universal Developer Imageについて
Dev Spacesを単純に起動してもJavaを動かすことができました。JDKは何が使われているのでしょうか。開発コンテナのターミナルでJavaのバージョンを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/b22ab606-f311-59f8-8160-1266396708bb.png)

プレーンな起動では、Red HatのOpenJDKが適用されていることが確認できました。
「GitHubのコードを解析して利用言語専用の開発コンテナを選択しているの？」という感じで動いているのかと想像していたのですが、この環境ではPythonなどその他言語も扱えるよう幅広に設定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/d318fda9-6ac2-7d67-5be1-35f0137c579a.png)

Dev Spacesの標準開発イメージとして「[Universal Developer Image](https://catalog.redhat.com/software/containers/devspaces/udi-rhel8/)」（UDI）が存在します。これは「Universal Base Image」（UBI）という軽量なベースコンテナに各種開発ツールをインストールしたイメージとなっています。全部盛りにすることで、多様なシチュエーションに対応できる仕組みとなっています。特に指定が無い場合、これがデフォルトとして選択されます。
上記リンクのなかのDockerfileを確認すると、UBIに各種ツールをまとめてインストールしていることが認識できます。

# IBM Semeruランタイムを導入した開発イメージを使う
実際の開発プロジェクトでは、UDIのビルドに使用されたDockerfileを元にしながら
・不要なインストールを削除する
・必要なインストールを追加する
などのカスタマイズを行い、オリジナルの開発イメージをつくる必要がありそうです。

この記事では、複雑な対応を行わずにSemeruランタイムを使えるように
・既存のUDIにSemeruランタイムを追加する
・Semeruをデフォルトのランタイムと定義する
という簡易的な対応でオリジナルの開発イメージを作成します。

そしてリポジトリの起動時にこのオリジナル開発イメージを選択するように設定していきます。

### Semeruランタイムを使うイメージを作成する
まずはカスタムイメージ構築用のContainerfile（またはDockerfile）を作成します。

```
FROM registry.redhat.io/devspaces/udi-rhel8:latest

RUN dnf install -y https://github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.10%2B7_openj9-0.43.0/ibm-semeru-open-17-jdk-17.0.10.7_0.43.0-1.x86_64.rpm

RUN rm -rf ${HOME}/.java/current && \
    mkdir -p ${HOME}/.java/current && \
    ln -s /usr/lib/jvm/ibm-semeru-open-17-jdk/* ${HOME}/.java/current
```
FROMにUDIを指定し、記載の例ではSemeruのJDK17をインストールしています（JREではコンパイルができないためJDKを選択します）。
UDIのDockerfileを参照すると、複数のJDKをまとめてインストールしてそのなかからデフォルトを選択しているようです。ですので、SemeruのJDK17がデフォルトとして選択されるように指定します。

```
podman build -t semeru-17-devspaces .
```
Containerfileと同じディレクトリで、イメージビルドを行ないます。これでオリジナルのイメージ「semeru-17-devspaces」がローカルに作成されました。
（事前にregistry.redhat.ioレジストリーへのログインが必要です）

```
podman login ghcr.io -u (Username) -p=(token)
podman push (imageID) ghcr.io/(Username)/semeru-17-devspaces
```
この記事では、GitHubのコンテナレジストリにイメージを登録していきます。
コンテナレジストリ向けにログインを行ない、プッシュします。名前は「semeru-17-devspaces」としています。
プッシュ後に参照できるようvisibilityをpublicに変更します。

### 起動時にカスタムイメージを使用する
開発環境を起動する際に、カスタマイズされた開発環境を使いたい場合はdevfile.yamlという定義ファイルを準備します。ここに開発環境の設定を記述して開発リソースのリポジトリのルートに配置しておきます。

devfileの詳細はこの記事では触れません。[こちらのリスト](https://github.com/eclipse-che/che-devfile-registry/tree/main/devfiles)に様々なdevfileのパターンが記載されていますので、各パターンのmeta.yamlにあるリンクからDokcerfileを探してみてください。

今回は次の内容で準備します。
```
schemaVersion: 2.2.0
metadata:
  name: semeru sample
  version: 0.1.0
components:
  - name: dev
    container:
      image: ghcr.io/mi-ta-build/semeru-17-devspaces
      memoryRequest: 256Mi
      memoryLimit: 2Gi
      cpuRequest: 100m
      cpuLimit: 2000m
      mountSources: true
      sourceMapping: /projects
      volumeMounts:
        - name: cache
          path: /cache
      endpoints:
        - exposure: public
          path: /
          name: ep1
          targetPort: 9080
          protocol: http
  - name: cache
    volume:
      size: 1G
```
ポイントとして、コンテナのイメージとして先ほどプッシュしたsemeru-17-devspacesを指定しています。

このdevfile.yamlを組み込んだ開発リポジトリを指定して、Dev Spacesを起動します。
起動終了後に、コンテナのターミナルでJavaのバージョンを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/7f459f15-be59-4752-b5d1-1b874c742e3d.png)

Semeruが選択されていることが確認できました。

# まとめ
Dev Spacesで開発プロジェクトに合わせた環境をカスタマイズできることを確認できました。
また、devfileのカタログを見ていくと様々な開発環境の指定方法を学ぶことができます。プロジェクトにフィットした環境を準備して、よりスムーズな開発プロセスのスタートダッシュを体験してみてください。

# 参考URL
https://access.redhat.com/documentation/en-us/red_hat_openshift_dev_spaces/3.12/html/user_guide/devfile-introduction