2019年8月7日水曜日

Eclipse Che に自作の Che Plugin(java12 & vscode-java) を追加する

この「プラグイン一覧」画面に「Language Support for Java 12」が欲しいわけです。

前提

  • OS: Windows10 Pro
  • Docker: Docker version 19.03.1, build 74b1e89
  • helm: v2.14.2
  • Docker Desktop の Kubernetes 有効化済み
    • Docker Desktop の Kubernetes を使う
  • インストールする che: 7.0.0-rc-4.0

自作プラグイン作成

theia-endpoint-runtime をベースイメージにして、必要な環境一式をインストールすればよい。

Docker イメージは、 Docker Hub の eclipse/che-theia-endpoint-runtime で公開されている。

プラグイン実行用の Docker コンテナを作成

remote-plugin-java11 の DockerfileAdoptOpenJDK の Dockerfile を参考にして、vscode-java の実行環境を組み立てていく。

Dockerfile:

FROM eclipse/che-theia-endpoint-runtime:7.0.0-rc-4.0

LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="1.0.0"
LABEL description "che-theia, remote-plugin-runner-java12"

# from https://github.com/AdoptOpenJDK/openjdk-docker/blob/4dd8db3c0fb30281ead0baa706800a605d3ebbe1/12/jdk/alpine/Dockerfile.hotspot.releases.full#L24
RUN apk add --no-cache --virtual .build-deps curl binutils procps nss \
    && GLIBC_VER="2.29-r0" \
    && ALPINE_GLIBC_REPO="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" \
    && GCC_LIBS_URL="https://archive.archlinux.org/packages/g/gcc-libs/gcc-libs-9.1.0-2-x86_64.pkg.tar.xz" \
    && GCC_LIBS_SHA256="91dba90f3c20d32fcf7f1dbe91523653018aa0b8d2230b00f822f6722804cf08" \
    && ZLIB_URL="https://archive.archlinux.org/packages/z/zlib/zlib-1%3A1.2.11-3-x86_64.pkg.tar.xz" \
    && ZLIB_SHA256=17aede0b9f8baa789c5aa3f358fbf8c68a5f1228c5e6cba1a5dd34102ef4d4e5 \
    && curl -LfsS https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -o /etc/apk/keys/sgerrand.rsa.pub \
    && SGERRAND_RSA_SHA256="823b54589c93b02497f1ba4dc622eaef9c813e6b0f0ebbb2f771e32adf9f4ef2" \
    && echo "${SGERRAND_RSA_SHA256} */etc/apk/keys/sgerrand.rsa.pub" | sha256sum -c - \
    && curl -LfsS ${ALPINE_GLIBC_REPO}/${GLIBC_VER}/glibc-${GLIBC_VER}.apk > /tmp/glibc-${GLIBC_VER}.apk \
    && apk add /tmp/glibc-${GLIBC_VER}.apk \
    && curl -LfsS ${ALPINE_GLIBC_REPO}/${GLIBC_VER}/glibc-bin-${GLIBC_VER}.apk > /tmp/glibc-bin-${GLIBC_VER}.apk \
    && apk add /tmp/glibc-bin-${GLIBC_VER}.apk \
    && curl -Ls ${ALPINE_GLIBC_REPO}/${GLIBC_VER}/glibc-i18n-${GLIBC_VER}.apk > /tmp/glibc-i18n-${GLIBC_VER}.apk \
    && apk add /tmp/glibc-i18n-${GLIBC_VER}.apk \
    && /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true \
    && echo "export LANG=$LANG" > /etc/profile.d/locale.sh \
    && curl -LfsS ${GCC_LIBS_URL} -o /tmp/gcc-libs.tar.xz \
    && echo "${GCC_LIBS_SHA256} */tmp/gcc-libs.tar.xz" | sha256sum -c - \
    && mkdir /tmp/gcc \
    && tar -xf /tmp/gcc-libs.tar.xz -C /tmp/gcc \
    && mv /tmp/gcc/usr/lib/libgcc* /tmp/gcc/usr/lib/libstdc++* /usr/glibc-compat/lib \
    && strip /usr/glibc-compat/lib/libgcc_s.so.* /usr/glibc-compat/lib/libstdc++.so* \
    && curl -LfsS ${ZLIB_URL} -o /tmp/libz.tar.xz \
    && echo "${ZLIB_SHA256} */tmp/libz.tar.xz" | sha256sum -c - \
    && mkdir /tmp/libz \
    && tar -xf /tmp/libz.tar.xz -C /tmp/libz \
    && mv /tmp/libz/usr/lib/libz.so* /usr/glibc-compat/lib \
    && apk del --purge .build-deps glibc-i18n \
    && rm -rf /tmp/*.apk /tmp/gcc /tmp/gcc-libs.tar.xz /tmp/libz /tmp/libz.tar.xz /var/cache/apk/*

RUN wget -q https://download.java.net/java/GA/jdk12.0.2/e482c34c86bd4bf8b56c0b35558996b9/10/GPL/openjdk-12.0.2_linux-x64_bin.tar.gz \
    && tar xf ./openjdk-12.0.2_linux-x64_bin.tar.gz -C /opt \
    && rm ./openjdk-12.0.2_linux-x64_bin.tar.gz

ENV JAVA_HOME /opt/jdk-12.0.2
ENV PATH $PATH:/opt/jdk-12.0.2/bin

RUN chmod 777 /home/theia
WORKDIR /projects

この Dockerfile を使ってビルド・プッシュする。

docker build -t mikoto2000/remote-plugin-runner-java12:latest .

コンテナレジストリに登録

Docker Hub に push。

docker push mikoto2000/remote-plugin-runner-java12:latest

(mikoto2000/remote-plugin-runner-java12 ではなく mikoto2000/che-remote-plugin-runner-java12 とするべきだったかもしれない...)

自作プラグインを登録した docker-plugin-registry を作成

che-server は、「どんなプラグインがあるか・つかえるか」を、 che-plugin-registry に問い合わせ、 その結果を前述のプラグイン一覧に表示している。

なので、自作プラグインを登録した che-plugin-registry を作成する必要がある。

この章で che-plugin-registry を作っていく。

eclipse/che-plugin-registry をクローン

$CHE_PLUGIN_REGISTRY_SOURCE にクローンしたものとして話を進める。

バージョニングのポリシーががわからないのでとりあえず master で進めてしまう。

git clone https://github.com/eclipse/che-plugin-registry
cd che-plugin-registry
$CHE_PLUGIN_REGISTRY_SOURCE=$(pwd)

$CHE_PLUGIN_REGISTRY_SOURCE/v3/plugins/ にプラグイン情報を追加

v3/plugins/redhat/java11/latest を参考に、 java12 版を作成。

ディレクトリ構成:

$CHE_PLUGIN_REGISTRY_SOURCE/
    +- v3/
        +- plugins/
            +- mikoto2000/
                +- java12/
                    +- latest/
                        +- meta.yaml
  • mikoto2000: publisher
  • latest: version
  • meta.yaml: プラグイン情報を記載したメタデータファイル

meta.yaml:

apiVersion: v2
publisher: mikoto2000
name: java12
version: latest
type: VS Code extension
displayName: Language Support for Java 12
title: Language Support for Java(TM) by mikoto2000
description: Java Linting, Intellisense, formatting, refactoring, Maven/Gradle support
  and more...
icon: https://www.eclipse.org/che/images/logo-eclipseche.svg
repository: https://github.com/redhat-developer/vscode-java
category: Language
firstPublicationDate: "2019-08-02"
spec:
  containers:
  - image: mikoto2000/remote-plugin-runner-java12:latest
    name: vscode-java
    memoryLimit: "1500Mi"
  extensions:
  - https://github.com/microsoft/vscode-java-debug/releases/download/0.19.0/vscode-java-debug-0.19.0.vsix
  - https://download.jboss.org/jbosstools/static/jdt.ls/stable/java-0.46.0-1549.vsix

適当にまねして書き換えただけなので説明省略。

che-plugin-registry のコンテナを作成

cd $CHE_PLUGIN_REGISTRY_SOURCE
docker build -t mikoto2000/che-plugin-registry:latest -f ./build/dockerfiles/Dockerfile --target registry .

コンテナレジストリに登録

docker push mikoto2000/che-plugin-registry:latest

che の設定とデプロイ

che-server が、先ほど作った che-plugin-registry に問い合わせを投げるように設定して、デプロイしなおす。

$CHE_SOURCE/deploy/kubernetes/helm/che/custom-charts/che-plugin-registry/values.yaml を編集

che-plugin-registry/values.yamlchePluginRegistry で、 先ほど作った mikoto2000/che-plugin-registry を使用するように修正。

before:

chePluginRegistry:
  image: quay.io/eclipse/che-plugin-registry:nightly
  imagePullPolicy: Always
  memoryLimit: 32Mi
  memoryRequests: 16Mi

after:

chePluginRegistry:
  image: mikoto2000/che-plugin-registry:latest
  imagePullPolicy: Always
  memoryLimit: 32Mi
  memoryRequests: 16Mi

che のデプロイ

helm upgrade で更新を認識してくれなかったので削除してインストールしなおししている。 helm の使い方勉強しなきゃ...。

cd $CHE_SOURCE/deploy/kubernetes/helm/che
helm delete --purge che
helm init --service-account tiller --wait --upgrade
helm dependency update
helm upgrade --install che --namespace che --set cheImage=eclipse/che-server:7.0.0-rc-4.0 --set global.cheWorkspacesNamespace="che" --set global.ingressDomain=${CHE_DOMAIN}.nip.io ./

プラグインが追加されていることを確認

start http://che-che.${CHE_DOMAIN}.nip.io/ で che を開いたら、 Workspaces -> Add Workspace ボタン押下 -> SELECT STACKJava Gradle を選択 -> 右上の下向き三角形ボタンを押下 -> Create & Proceed Editing -> Plugins タブ選択 -> プラグイン一覧に Language Support for Java 12 が増えているのが確認できる。

以上。

参考資料

更新履歴

日付 更新内容
2019/8/07 新規作成
2020/6/10 docker build のコマンド間違いを修正

0 件のコメント:

コメントを投稿