2019年8月16日金曜日

Minikube on Debian 10 に Eclipse Che をデプロイする(Hyper-V & ベアメタル版)

前回(Debian 10 に minikube をインストールする(Hyper-V & ベアメタル版)) からの続き。

Running Che locally | Eclipse Che Documentation を実施していく。

必要なツールのインストール

Che のデプロイに必要なものたちをインストールする。

socat

helm でのデプロイ時に使用する。VirtualBox の時には必要なかったけど今回は必要らしい。

apt-get install -y socat

helm

バイナリをダウンロードして /usr/local/bin へ移動。

curl -L https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz -O
tar xf helm-v2.14.3-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/
sudo mv linux-amd64/tiller /usr/local/bin/
rm -rf helm-v2.14.3-linux-amd64.tar.gz linux-amd64/

Snappy(snap?) を使うとパッケージとして管理できるようだがとりあえずバイナリダウンロードで済ませてしまう。

chectl

こちらもバイナリをダウンロード。

2019/8/15 時点のドキュメントで指定されているバージョンは、--domain オプションの指定が正しく動かないので、現時点で最新のバージョンである 20190802065601 をダウンロードしてくる。(ベアメタルインストールの場合、 --domain オプション使わないけど...)

RELEASE="20190802065601/chectl-linux"
URL=https://github.com/che-incubator/chectl/releases/download/${RELEASE}
sudo curl -L ${URL} -o /usr/local/bin/chectl
sudo chmod +x /usr/local/bin/chectl

Minikube の設定

なし。root で起動するだけ。

sudo minikube start

Eclipse Che のデプロイ

sudo chectl server:start

動作確認

Windows から http://${DEBIAN_IP}.nip.io に接続。

  • ${DEBIAN_IP}: Debian の IP アドレスに置き換える。

OK.

参考資料

Debian 10 に Minikube をインストールする(Hyper-V & ベアメタル版)

前提

前回前々回と、 VirtualBox を使用してきたが、 Minikube をベアメタルで動かせば Nested Virtualization 無しで環境構築ができそうだったので試した。

  • ホスト OS: Windows 10 Pro
  • Hyper-V 上の Debian にて動作確認
  • ゲスト OS: Debian 10
  • 最小構成インストールに、以下のパッケージを導入・設定した状態
    • sshd
    • sudo
  • Minikube をベアメタルインストール

必要なツール群のインストール

必要なパッケージのインストール

各種ツールインストールで使用するパッケージ群を、 apt でインストールする。

sudo apt-get update
sudo apt-get install -y apt-transport-https curl gnupg2 ca-certificates software-properties-common

Docker のインストール

Get Docker Engine - Community for Debian | Docker Documentation の通りにインストールを進める。

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

kubectl のインストール

Install and Set Up kubectl - Kubernetes に従ってインストール。

echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" \
 | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y kubectl

minikube のインストール

Linux | minikube に従ってインストールとセットアップを行う。

インストール

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_1.3.1.deb \
 && sudo dpkg -i minikube_1.3.1.deb
sudo rm minikube_1.3.1.deb

セットアップ

sudo minikube start --vm-driver=none
sudo minikube config set vm-driver none

動作確認

kubectl get pods で、それっぽい pod が起動していることを確認する。

sudo kubectl get pods --all-namespaces

参考資料

2019年8月15日木曜日

Minikube on Debian 10 に Eclipse Che をデプロイする

前回(Debian 10 に minikube をインストールする) からの続き。

Running Che locally | Eclipse Che Documentation を実施していく。

必要なツールのインストール

Che のデプロイに必要なものたちをインストールする。

helm

バイナリをダウンロードして /usr/local/bin へ移動。

curl -L https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz -O
tar xf helm-v2.14.3-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/
sudo mv linux-amd64/tiller /usr/local/bin/
rm -rf helm-v2.14.3-linux-amd64.tar.gz linux-amd64/

Snappy(snap?) を使うとパッケージとして管理できるようだがとりあえずバイナリダウンロードで済ませてしまう。

chectl のインストール

こちらもバイナリをダウンロード。

2019/8/15 時点のドキュメントで指定されているバージョンは、--domain オプションの指定が正しく動かないので、現時点で最新のバージョンである 20190802065601 をダウンロードしてくる。

RELEASE="20190802065601/chectl-linux"
URL=https://github.com/che-incubator/chectl/releases/download/${RELEASE}
sudo curl -L ${URL} -o /usr/local/bin/chectl
sudo chmod +x /usr/local/bin/chectl

Minikube の設定

VM の起動とポートフォワーディングの設定を行う。

VM を作成して Minikube 起動

最低でもメモリ 4 GB が必要なので、その設定を行う。

ポートフォワーディングでホストの 80 番ポートをフォワードする必要があるので sudo で実行する。

「sudo で実行しないでください」って怒られるし、何か回避策があると良いのだけれど...。

sudo minikube start --memory=4096 --cpus=2

ポートフォワーディング

Minikube が動いている VirtualBox に、ポートフォワーディングの設定を行う。

  • ホストの 80 -> Minikube の 80
sudo vboxmanage controlvm "minikube" natpf1 "che,tcp,,80,$(sudo minikube ip),80"

Eclipse Che のデプロイ

sudo chectl server:start --domain="${DEBIAN_IP}.nip.io"
  • ${DEBIAN_IP}: Debian の IP アドレスに置き換える。

動作確認

Windows から http://${DEBIAN_IP}.nip.io に接続。

OK.

参考資料

2019年8月14日水曜日

Debian 10 に minikube をインストールする

前提

Windows10 上に Debian VM を立てて検証しているため、仮想化関連機能に由来する制限がたくさんある。

  • ホスト OS: Windows 10 Pro
  • VirtualBox6 上の Debian にて動作確認
    • VM のプロセッサー設定「ネステッドVT-x/AMD-Vを有効化」にチェックがついていること
  • CPU: AMD の CPU
    • 試したマシンが AMD CPU だったので、この手順もそれ用のもの
    • nested virtualization のサポート有無が CPU に依存するため Intel CPU の人は VirtualBox 使えない
    • Intel CPU なら Hyper-V でいけるっぽい?(未確認)
  • ゲスト OS: Debian 10
  • 最小構成インストールに、以下のパッケージを導入・設定した状態
    • sshd
    • sudo

インストール条件がそろっているかの確認

以下のコマンドの実行結果が空でなければインストールできるはず。

grep -E --color 'vmx|svm' /proc/cpuinfo

必要なパッケージのインストール

各種ツールインストールで使用するパッケージ群を、 apt でインストールする。

sudo apt-get update
sudo apt-get install -y apt-transport-https curl gnupg2

VirtualBox のインストール

Linux_Downloads – Oracle VM VirtualBox に従ってインストール。

echo "deb https://download.virtualbox.org/virtualbox/debian buster contrib" \
 | sudo tee -a /etc/apt/sources.list.d/virtualbox.list
curl -fsSL https://www.virtualbox.org/download/oracle_vbox_2016.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y virtualbox-6.0

kubectl のインストール

Install and Set Up kubectl - Kubernetes に従ってインストール。

echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" \
 | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y kubectl

minikube のインストール

Linux | minikube に従ってインストールとセットアップを行う。

インストール

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_1.3.1.deb \
 && sudo dpkg -i minikube_1.3.1.deb
sudo rm minikube_1.3.1.deb

セットアップ

minikube start --vm-driver=virtualbox
minikube config set vm-driver virtualbox

動作確認

kubectl get pods で、それっぽい pod が起動していることを確認する。

kubectl get pods --all-namespaces

参考資料

更新履歴

日付 更新内容
2019/8/14 新規作成
2019/8/15 前提条件に CPU, ホスト OS の話題を追加

2019年8月12日月曜日

Visual Studio Code の LSP 拡張を作る

mikoto2000/lsp4snippet を Visual Studio Code で使いたい。

前提

  • OS: Windows 10 Pro
  • VSCode: 1.37.0
  • Node: v10.16.2
  • npm: 6.4.1

開発に必要なツールのインストール

npmyo, generator-code をインストール。

npm install -g yo generator-code

プロジェクトひな形の作成

yo code で対話的にプロジェクトの作成ができる。

PS C:\Users\mikoto> cd ~/project/
PS C:\Users\mikoto\project> yo code

     _-----_     ╭──────────────────────────╮
    |       |Welcome to the Visual  │
    |--(o)--|Studio Code Extension  │
   `---------´   │        generator!        │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of extension do you want to create? New Extension (TypeScript)
? What's the name of your extension? snippet
? What's the identifier of your extension? snippet
? What's the description of your extension? Language Support for Snippet.
? Initialize a git repository? Yes
? Which package manager to use? npm
   create snippet\.vscode\extensions.json
   create snippet\.vscode\launch.json
   create snippet\.vscode\settings.json
   create snippet\.vscode\tasks.json
   create snippet\src\test\runTest.ts
   create snippet\src\test\suite\extension.test.ts
   create snippet\src\test\suite\index.ts
   create snippet\.vscodeignore
   create snippet\.gitignore
   create snippet\README.md
   create snippet\CHANGELOG.md
   create snippet\vsc-extension-quickstart.md
   create snippet\tsconfig.json
   create snippet\src\extension.ts
   create snippet\package.json
   create snippet\tslint.json


I'm all done. Running npm install for you to install the required dependencies. If this fails, try running the command yourself.


npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN snippet@0.0.1 No repository field.
npm WARN snippet@0.0.1 No license field.

added 143 packages from 573 contributors and audited 325 packages in 3.974s
found 0 vulnerabilities


Your extension snippet has been created!

To start editing with Visual Studio Code, use the following commands:

     cd snippet
     code .

Open vsc-extension-quickstart.md inside the new extension for further instructions
on how to modify, test and publish your extension.

For more information, also visit http://code.visualstudio.com and follow us @code.


PS C:\Users\mikoto\project> # プロジェクト管理の都合でディレクトリの名前変更
PS C:\Users\mikoto\project> mv .\snippet .\vscode-snippet

LSP に必要なパッケージを追加

vscode-languageclient を追加する。

cd vscode-snippet
npm install --save vscode-languageclient

プロジェクトのメタデータを編集

package.json を編集。

{
  "name": "snippet",
  "displayName": "snippet",
  "description": "Language Support for Snippet.",
  "version": "0.0.1",
  "publisher": "mikoto2000",
  "engines": {
    "vscode": "^1.37.0"
  },
  "categories": [
    "Other"
  ],
  "activationEvents": [
    "*"
  ],
  "main": "./out/extension.js",
  "contributes": {},
  "scripts": {
    "vscode:prepublish": "npm run compile",
    "compile": "tsc -p ./",
    "watch": "tsc -watch -p ./",
    "pretest": "npm run compile",
    "test": "node ./out/test/runTest.js"
  },
  "devDependencies": {
    "@types/glob": "^7.1.1",
    "@types/mocha": "^5.2.6",
    "@types/node": "^10.12.21",
    "@types/vscode": "^1.37.0",
    "glob": "^7.1.4",
    "mocha": "^6.1.4",
    "typescript": "^3.3.1",
    "tslint": "^5.12.1",
    "vscode-test": "^1.0.2"
  },
  "dependencies": {
    "vscode-languageclient": "^5.2.1"
  }
}
  1. 発行者(publisher) を追加
  2. スニペットサーバーは常時起動させておきたいので、 activationEvents* に修正
  3. コマンドは必要ないので contributes/commands を削除

LSP サーバー起動コードの実装

import * as vscode from 'vscode';
import { Executable, LanguageClient, LanguageClientOptions, StreamInfo } from 'vscode-languageclient';

export function activate(context: vscode.ExtensionContext) {

  const serverOptions: Executable = {
      // TODO: requirements に「java にパスを通しておくこと」を追加したうえで java に修正
      command: 'C:/Java/openjdk-12.0.1/bin/java',
      args: ['--add-modules=ALL-SYSTEM',
          '--add-opens',
          'java.base/java.util=ALL-UNNAMED',
          '--add-opens', 'java.base/java.lang=ALL-UNNAMED',
          '-Declipse.application=org.eclipse.jdt.ls.core.id1',
          '-Dosgi.bundles.defaultStartLevel=4',
          '-Declipse.product=org.eclipse.jdt.ls.core.product',
          '-Dlog.level=ALL',
          '-noverify',
          '-Dfile.encoding=UTF-8',
          '-Xmx1G',
          // TODO: jar を同梱する
          '-jar',
          'C:/Users/mikoto/project/lsp4snippet/build/libs/lsp4snippet-1.0.0.jar',
          // TODO: config 化
          '--snippet', 'C:/Users/mikoto/project/dotvim/.vim/snippets/java.yaml',
          '--snippet', 'C:/Users/mikoto/project/dotvim/.vim/snippets/markdown.yaml']
  };

  const clientOptions: LanguageClientOptions = {
      documentSelector: [{ scheme: 'file', language: '*' }]
  };

  const disposable = new LanguageClient('lsp4snippet', 'lsp4snippet', serverOptions, clientOptions).start();
  context.subscriptions.push(disposable);
}

// this method is called when your extension is deactivated
export function deactivate() {}
  1. serverOptions で、 LSP サーバー起動に必要な情報を組み立て
  2. LanguageClientOptions.documentSelector で、この拡張が有効になる条件を指定。今回は常時有効にしたいので以下のように設定
    • scheme: file
    • language: *
  3. 「1.」「2.」を使って LanguageClient を作成し、 context.subscriptions に push

動作確認

起動。

code .
vscode-snippet プロジェクト

プロジェクトが開くので、 F5 押下。

ビルドが走り、 vscode-snippet 拡張機能が組み込まれた VSCode が新しく立ち上がるので、 適当なマークダウンファイルを開いて追加した補完候補が表示されることを確認する。

追加した補完が機能している

ドキュメント系は置いておくとして、あとは、jar 組込みとスニペット定義ファイル指定のコンフィグ化ができると、とりあえず使える感じにはなるかな?

以上。

参考資料

2019年8月7日水曜日

Eclipse Che に java12 のスタックを追加する

この「スタック一覧」に「Java12 Gradle」が欲しいわけです。

前提

スタック用のコンテナを作成

che7 の場合、「ランタイム用」と言うのが正確っぽいのだけど、「SELECT STACK」って書いてあるし、とりあえずスタックと呼んでおく。

eclipse/stack-base:debian をベースイメージとして、環境を組み立てていく。

Docker イメージは Docker Hub の eclipse/stack-base で公開されている。

スタック用の Docker コンテナを作成

バイナリをダウンロードして展開、パス追加を行う。

Dockerfile:

FROM eclipse/stack-base:debian

LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version "1.0.0"
LABEL description "OpenJDK: 12.0.2, Gradle: 5.5.1"

USER root

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 \
    && wget -q https://services.gradle.org/distributions/gradle-5.5.1-bin.zip \
    && unzip gradle-5.5.1-bin.zip -d /opt \
    && rm gradle-5.5.1-bin.zip

USER user

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

これを使ってビルド。

docker build -t mikoto2000/che-stack_java12-gradle5:latest .

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

Docker Hub に push。

docker push mikoto2000/che-stack_java12-gradle5:latest

自作スタックを登録した che-devfile-registry を作成

che-server は、「どんなスタックがあるか・つかえるか」を、 che-devfile-registry に問い合わせ、 その結果を前述の「SELECT STACK」の一覧に表示している。

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

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

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

clone して checkout。

cd ~/project
git clone https://github.com/eclipse/che-devfile-registry.git
cd che-devfile-registry
$CHE_DEVFILE_REGISTRY_SOURCE=$(pwd)

スタック情報を追加

スタック情報を記述した meta.yaml, devfile.yaml を作成・追加する。

ディレクトリ $CHE_DEVFILE_REGISTRY_SOURCE/devfiles/java12-gradle5/ に、 ファイル meta.yamldevfile.yaml を作成する。

java-gradle を参考に書き換え書き換えしていった。

meta.yaml:

---
displayName: Java12 Gradle5
description: Java Stack with OpenJDK 12 and Gradle 5.5.1
tags: ["Java", "OpenJDK", "Gradle", "Debian"]
icon: https://www.eclipse.org/che/images/logo-eclipseche.svg
globalMemoryLimit: 2674Mi

devfile.yaml

---
apiVersion: 1.0.0
metadata:
  name: java12-gradle5
projects:
  - name: console-java-simple
    source:
      type: git
      location: "https://github.com/che-samples/console-java-simple.git"
components:
  - type: chePlugin
    id: mikoto2000/java12/latest
  - type: dockerimage
    alias: gradle
    image: mikoto2000/che-stack_java12-gradle5:latest
    env:
      - name: GRADLE_USER_HOME
        value: /home/user/.gradle
      - name: JAVA_OPTS
        value: "-XX:MaxRAMPercentage=50 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10
          -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90
          -Dsun.zip.disableMemoryMapping=true -Xms20m -Djava.security.egd=file:/dev/./urandom"
      - name: JAVA_TOOL_OPTIONS
        value: "-XX:MaxRAMPercentage=50 -XX:+UseParallelGC -XX:MinHeapFreeRatio=10
          -XX:MaxHeapFreeRatio=20 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90
          -Dsun.zip.disableMemoryMapping=true -Xms20m -Djava.security.egd=file:/dev/./urandom"
      - name: HOME
        value: /home/user
    memoryLimit: 512Mi
    volumes:
      - name: gradle
        containerPath: /home/gradle/.gradle
    mountSources: true

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

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

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

docker push mikoto2000/che-devfile-registry:latest

che の設定とデプロイ

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

$CHE_SOURCE/deploy/kubernetes/helm/che/custom-charts/che-devfile-registry/values.yaml を修正

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

before:

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

after:

cheDevfileRegistry:
  image: mikoto2000/che-devfile-registry:latest
  imagePullPolicy: Always
  memoryLimit: 32Mi
  memoryRequests: 16Mi

これで、 che を再デプロイした時に、改造した che-devfile-registry が使われる。

che の再デプロイ

helm upgrade の使い方がわからないので、いったん削除してからデプロイしなおす。

cd $CHE_SOURCE/deploy/kubernetes/helm/che
helm delete --purge che
helm repo update
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 ./

これで、 http://che-che.${CHE_DOMAIN}.nip.io/ にアクセスすると、改造した che-devfile-registry を使用する che にアクセスできる。

スタックが追加されていることを確認

最初と同じようにワークスペースの作成画面に行くと、 SELECT STACK の一覧の中に Java12 Gradle5 が追加されていることがわかる。

参考資料

更新履歴

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

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 のコマンド間違いを修正

2019年8月2日金曜日

Windows で Eclipse Che を動かす

Windows の Docker Desktop(with Kubernetes)に Eclipse Che をデプロイした - mikoto2000 の日記 でとりあえず動くようにした。

今回は、手順を整理して後片付けの方法を追加。

前提

  • 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

現状確認

Docker Desktop の Kubernetes をリセットした直後の状態を確認。

PS C:\Users\mikoto\project> kubectl get pods --all-namespaces
NAMESPACE     NAME                                     READY   STATUS    RESTARTS   AGE
docker        compose-6c67d745f6-c2pvf                 1/1     Running   0          39m
docker        compose-api-57ff65b8c7-pnbwk             1/1     Running   0          39m
kube-system   coredns-fb8b8dccf-vt5p9                  1/1     Running   0          40m
kube-system   coredns-fb8b8dccf-wz7s7                  1/1     Running   0          40m
kube-system   etcd-docker-desktop                      1/1     Running   0          39m
kube-system   kube-apiserver-docker-desktop            1/1     Running   0          39m
kube-system   kube-controller-manager-docker-desktop   1/1     Running   0          40m
kube-system   kube-proxy-lbnfv                         1/1     Running   0          40m
kube-system   kube-scheduler-docker-desktop            1/1     Running   0          40m

うん、こんなもんでしょう。

che の環境構築

che のソースコード取得

clone して checkout。

cd ~/project
git clone https://github.com/eclipse/che.git
cd che
git checkout -b 7.0.0-rc-4.0 refs/tags/7.0.0-rc-4.0
$CHE_SOURCE=$(pwd)

helm のインストール

Chocolatey でインストール。PowerShell を管理者で開いて下記コマンドを実行。

choco install kubernetes-helm

tiller のデプロイ

kubectl apply して helm init

cd $CHE_SOURCE\deploy\kubernetes\helm\che
kubectl apply -f .\tiller-rbac.yaml
helm init --service-account tiller --wait

pod が増えているのを確認。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm\che> kubectl get pods --all-namespaces
NAMESPACE     NAME                                     READY   STATUS    RESTARTS   AGE
docker        compose-6c67d745f6-c2pvf                 1/1     Running   0          41m
docker        compose-api-57ff65b8c7-pnbwk             1/1     Running   0          41m
kube-system   coredns-fb8b8dccf-vt5p9                  1/1     Running   0          42m
kube-system   coredns-fb8b8dccf-wz7s7                  1/1     Running   0          42m
kube-system   etcd-docker-desktop                      1/1     Running   0          41m
kube-system   kube-apiserver-docker-desktop            1/1     Running   0          41m
kube-system   kube-controller-manager-docker-desktop   1/1     Running   0          42m
kube-system   kube-proxy-lbnfv                         1/1     Running   0          42m
kube-system   kube-scheduler-docker-desktop            1/1     Running   0          42m
kube-system   tiller-deploy-7f656b499f-7dblh           1/1     Running   0          13s

tiller っぽいのが増えてる。

ingress のデプロイ

ingress をデプロイ。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml

pod の確認。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm\che> kubectl get pods --all-namespaces
NAMESPACE       NAME                                        READY   STATUS    RESTARTS   AGE
docker          compose-6c67d745f6-c2pvf                    1/1     Running   0          42m
docker          compose-api-57ff65b8c7-pnbwk                1/1     Running   0          42m
ingress-nginx   nginx-ingress-controller-86449c74bb-8tfdn   1/1     Running   0          65s
kube-system     coredns-fb8b8dccf-vt5p9                     1/1     Running   0          43m
kube-system     coredns-fb8b8dccf-wz7s7                     1/1     Running   0          43m
kube-system     etcd-docker-desktop                         1/1     Running   0          42m
kube-system     kube-apiserver-docker-desktop               1/1     Running   0          42m
kube-system     kube-controller-manager-docker-desktop      1/1     Running   0          43m
kube-system     kube-proxy-lbnfv                            1/1     Running   0          43m
kube-system     kube-scheduler-docker-desktop               1/1     Running   0          43m
kube-system     tiller-deploy-7f656b499f-7dblh              1/1     Running   0          86s

NAMESPACEingress-nginx のものが二つ増えている。

ingress が提供するサービスの IP アドレスをメモ。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm\che> kubectl get services --namespace ingress-nginx
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   LoadBalancer   10.101.143.26   localhost     80:31131/TCP,443:31708/TCP   79s

TYPELoadBalancerCLUSTER-IP をメモする。この場合は 10.101.143.26。 以降は $CHE_DOMAIN にメモした IP を設定したこととして進める。

ループバックアドレスの設定

Powershell を管理者権限で開いて、 netsh コマンドでループバックアドレスを追加する。

netsh interface ipv4 add address Loopback 10.101.143.26

che のデプロイ

cd $CHE_SOURCE\deploy\kubernetes\helm\che
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 ./

pod の確認。

PS C:\Users\mikoto\project\che\deploy\kubernetes\helm\che> kubectl get pods --all-namespaces
NAMESPACE       NAME                                        READY   STATUS    RESTARTS   AGE
che             che-8845cb9c4-rgl4h                         1/1     Running   0          29s
che             devfile-registry-974dd957f-4l9bf            1/1     Running   0          29s
che             plugin-registry-75bfd884cf-6lbc5            1/1     Running   0          29s
docker          compose-6c67d745f6-c2pvf                    1/1     Running   0          48m
docker          compose-api-57ff65b8c7-pnbwk                1/1     Running   0          48m
ingress-nginx   nginx-ingress-controller-86449c74bb-8tfdn   1/1     Running   0          7m18s
kube-system     coredns-fb8b8dccf-vt5p9                     1/1     Running   0          49m
kube-system     coredns-fb8b8dccf-wz7s7                     1/1     Running   0          49m
kube-system     etcd-docker-desktop                         1/1     Running   0          48m
kube-system     kube-apiserver-docker-desktop               1/1     Running   0          48m
kube-system     kube-controller-manager-docker-desktop      1/1     Running   0          49m
kube-system     kube-proxy-lbnfv                            1/1     Running   0          49m
kube-system     kube-scheduler-docker-desktop               1/1     Running   0          49m
kube-system     tiller-deploy-7f656b499f-7dblh              1/1     Running   0          7m39s

NAMESPACEche のものが 3 つ増えている。

che にアクセス

http://che-che.${CHE_DOMAIN}.nip.io にアクセスすると、 che の画面が開く。

start http://che-che.${CHE_DOMAIN}.nip.io

後片付け

ループバックアドレスの削除

管理者権限で開いた Powershell で以下のコマンドを実行。

netsh interface ipv4 delete address Loopback $CHE_DOMAIN

che の削除

helm delete --purge で削除できる。

cd $CHE_SOURCE\deploy\kubernetes\helm\che
helm delete --purge che

ingress の削除

こちらも kubectl delete で削除。

kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml
kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

tiller の削除

これで Kubernetes 上の tiller も消えるっぽい。

helm reset --force

helm の削除

choco コマンドで削除。

choco uninstall kubernetes-helm

参考資料