みなさんこんにちは、レッドハットでソリューションアーキテクトをしている暮林といいます。
今回はCodeReady Workspacesの便利なカスタマイズ方法を紹介してみたいと思います。 CodeReady Workspacesって何?という方は下記のエントリを読んでみてください。
第一回は開発者自身がCodeReady Workspacesを自分用にカスタマイズする方法をステップ・バイ・ステップで紹介します。(標準化は第二回以降で扱おうと思います)
仮想しばり
本エントリのレギュレーションとして「請負開発をしていて、開発用PCには強い統制がかけられている」といった状況を想定してみます。具体的には下記の通り。
- OA向きのWindowsPC(良くて2Coreメモリ4GB)しか支給されていない(Windows10ともかぎらない)
- PCには認められたツールしかいれることができない
- 有償のツールは開発メンバーの人数分買わないといけないので、おいそれと稟議にかけられない
素のCodeReady Workspacesでできること
CodeReady Workspacesは、ほぼデフォルトのままデプロイした場合でも下記のようなことが簡単に実現できます。
- Eclipse cheベース(使い勝手はVisual Studio Codeに近い)のエディタでいろいろな言語の開発ができる
- Workspaceにアタッチされているコンテナ(Linux)のなかで、いろいろなコマンドを発行できる
- Eclipse cheはブラウザベースなので、PCにはモダンブラウザだけあればいい
- KeycloakでSSO(シングルサインオン)できる
素のCodeReady Workspacesではできないこと
そのままでは少し(人によっては大きく)足りない部分があります。
あらかじめ準備されたコンテナ上に使いたいコマンドが揃っていない
第一回ではこれを解決してみようと思います。
ゴール設定
CodeReady WorkspacesはVisual Code Studioとちがって、新しいターミナルを起動するときに画面右側の直方体をクリックしてから、ターミナルを起動したいコンテナを選んで [>_ New terminal]を選択します。下記画像では予め準備されたmavenが表示されていますが、ここに自分で作成したコンテナイメージの[toolbox]を表示させて、好きなコマンドを含んだコンテナが起動できるようにすることがゴールです。
追加するコマンドは以下の3つを想定します
- ansible
- jq
- siege
ansibleはいわずもがなですが、jqはcurlなどでREST APIを通して取得したJSONから特定の項目を抜き出すのに便利なツール、siegeはアプリケーションに負荷をかけてレポートまでざっとだしてくれるツールです。
必要条件
仮想縛りがあるのであまり条件は多くつけられませんが、最低これだけは必要です。
- OpenShift上で自由にイメージビルドをさせてもらえるProject(Namespace)をもらえている
- CodeReady Workspacesがデプロイされていて使える状態にあること
- CodeReady Workspacesを動かせるモダンブラウザがPCにインストールされていること
- (OpenShiftからアクセスできるSCM(ソース管理)があること) ※なくてもなんとかなる
Proxyを通す必要がある場合はDockerfileに一工夫必要です。
外部でイメージをビルドできる人はそもそも仮想縛りの条件から外れているかなと思います。
実践!
STEP1 Dockerfileの準備
まず動かしたいコンテナイメージを作る必要があるのでDockerfileを書きます。 例えばこんなかんじです。
ここにおいておくのでForkしてもらってもOKです。(試行錯誤した跡がが残っていて恥ずかしい)
https://github.com/Tatsuyak9i/my-toolbox.git
SCMにリポジトリを作って一番上の階層に「Dockerfile」という名前でCommitしてください。
FROM ubi8 USER root ENV \ APP_ROOT=/opt/app-root \ HOME=/opt/app-root/src \ PATH=/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ PLATFORM="el8" RUN dnf update -y && dnf clean all -y RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && dnf clean all -y RUN dnf install -y procps which hostname sshpass siege jq python3-pip && dnf clean all -y RUN mkdir -p ${APP_ROOT} && \ chown -R 1001:1001 ${APP_ROOT} && \ chgrp -R 0 ${APP_ROOT} && \ chmod -R g=u ${APP_ROOT} RUN useradd -u 1001 -r -g 0 -d ${HOME} -s /sbin/nologin \ -c "Default Application User" default && \ chown -R 1001:0 ${APP_ROOT} RUN pip3 install --upgrade pip RUN pip3 install ansible USER 1001
FROM ubi8
再配布可能なUBI8を使っています。UBIについてはこちらの「Universal Base Imageの提供」参照してください。他にもこのブログにはUBIを説明したエントリはいくつかあります。 rheb.hatenablog.com
RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && dnf clean all -y
まず先にepelを使えるようにします。本物のサーバーにこれをいれようとすると勇気がいりますが、toolboxとしてのコンテナイメージなら気軽にいれてしまえます。 epelの記事はこのへん。 rheb.hatenablog.com
RUN dnf install -y procps which hostname sshpass siege jq python3-pip && dnf clean all -y
RUN pip3 install ansible
dnfでいくつかの便利ツールとjq siege pip3を導入したあとに、pip3でansibleを導入しているだけです。
/opt以下のディレクトリはとりあえず作っているだけで現状は大した意味は有りません。毎回 clean しているのはイメージを小さくするためのテクニックです。
プロキシサーバーを通す必要がある場合は、ENVの中に http_proxy=http://hogeproxy:3128
的な項目を追加してあげれば多分うまくいきます。
STEP2 イメージビルドの準備
次にSTEP1で用意したイメージをビルドします。が、その前にUBI8をプロジェクトにImportしておく必要があります。
Red Hat Ecosystem Catalog でUBI8を検索して開くとご丁寧にimportの仕方が書いてあります。
これを自由にイメージビルドしていいプロジェクト内で実施します。 イメージのビルドはCLIを使ったほうが楽なので、CodeReady Workspaces内のTerminalから実施することとします。 例としてQuarkusのQuickStartを使います。(コマンドを追加するのもこのQuarkusのQuick Startを流用します) 左側のGet Startedの中からQuarkusを選択してしばらく待ってください。
エディタが開いたら右側の直方体をクリックして、mavenのしたにある[>_New terminal]を開いてください
下にTerminalが開いたはずです。このコンテナイメージにはOpenJDK11やmavenコマンドに加えて、OpenShiftを操作するためのocコマンドも入っているのでこれを利用します。 (余談ですがocコマンドのWindows版は64bit版しかないので、Win7 32bitなどをクローズドネットワークなどでつかっているような環境では利用できなくて非常に困ります)
OpenShiftにCLIからログインしますが、普段から実行して慣れている方はそのとおり実行してください。慣れていない方はOpenShiftにWebからログインして、右上のCopy Login Command をたどっていって、oc login ~ としている行をコピーアンドペーストしてください。
これでocコマンドを使う準備ができました。
STEP3 イメージビルド
では実際にビルドをしていきます。 mytoolboxというプロジェクトを利用しているとします。
oc project mytoolbox oc import-image ubi8 --from=registry.access.redhat.com/ubi8 --confirm oc new-build https://github.com/Tatsuyak9i/my-toolbox.git oc start-build my-toolbox oc logs -f builds/my-toolbox-1 oc get is/my-toolbox
一気にやってしまいましたが、それぞれ以下の意味を持っています。
- プロジェクトの移動
- UBI8のインポート
- ビルドコンフィグをSCMから自動作成(s2iのDockerBuild) ここのURLは自分で用意したSCMのリポジトリURLに変更してください
- ビルドを実行
- ビルドのログ確認(ビルド番号ごとに確認対象がかわります)
- できあがったイメージストリームを確認
表示されているログを眺めると普段のLinuxで実行しているコマンドの表示結果が流れているのがわかると思います。 リポジトリ上のURIはあとで使うのでひかえておいてください。
jboss@workspacehjbny26oj3qexphy projects]$ oc get is/my-toolbox NAME IMAGE REPOSITORY TAGS UPDATED my-toolbox image-registry.openshift-image-registry.svc:5000/mytoolbox/my-toolbox latest 19 hours ago
STEP4 Workspaceからtoolboxのイメージをpullできるようにする
OpenShiftでは内部レジストリがプロジェクト毎に保護されていて、別プロジェクトからそのまま利用することができないようになっています。 そこでmytoolbox projectでつくったイメージをCodeReady Workspacesからpullできるようにしてあげます。 個人ごとのWorkspaceはデフォルト設定の場合「ユーザー名-codeready」というプロジェクトの中に起動します。なのでこのプロジェクトに権限をあたえます。
oc policy add-role-to-group \ system:image-puller system:serviceaccounts:tkurebay-codeready\ --namespace=mytoolbox
ユーザー名のところはご利用のものにかえてください。
STEP5 QuickStartへの組み込み
devfileを改変していきます。一旦起動しているWorkspaceを止めてください。 左上の黄色い矢印をおして、起動しているWorkspacesを右クリックしてStopを押します。
Workspacesをクリックして最初につくったWorkspaceを選択してください。(素直にやっていれば1つしかありませんが、写真では記事の都合上2つあります)
Devfileをクリックしてください。
components:
の下にこの行を付け加えてください。
- mountSources: true command: - tail args: - '-f' - /dev/null memoryLimit: 512Mi type: dockerimage alias: toolbox image: 'image-registry.openshift-image-registry.svc:5000/mytoolbox/my-toolbox'
command:
のところが少々独特ですが、コンテナが起動したままになってほしいのでメインプロセスは深淵を覗いたままにしてもらいます。dockerやpodmanであれば -itとするところですね。
image:
はSTEP3で控えたものですが、そのままやっていれば同じになると思います。
alias:
はエディター上で表示される名前です。好きなように変えてOKです。
あとは画面下でSAVEをおして、右上のRUNをおしてください。RUNしたら左の一覧から起動したWorkspacesを選択してください。
STEP6 動作確認
起動したWorkspacesの右側の直方体をクリックしてみると、「toolbox」が表示されているはずです。
[>_ New terminal]をおして追加コマンドを実行してみてください。 追加したコマンドが実行できるか確認してみてください。
おめでとうございます!これでプライベートなカスタマイズに成功しました。
Next Action!
便利ツールボックスの追加に成功したら、これをみんなに使ってほしいですよね? 次回のエントリではツールボックスをみんなにつかってもらえるようにする方法を紹介してみたいと思います。乞うご期待!