CodeReady Workspacesをカスタマイズして便利に開発してみよう その1

みなさんこんにちは、レッドハットでソリューションアーキテクトをしている暮林といいます。

今回はCodeReady Workspacesの便利なカスタマイズ方法を紹介してみたいと思います。 CodeReady Workspacesって何?という方は下記のエントリを読んでみてください。

rheb.hatenablog.com

第一回は開発者自身がCodeReady Workspacesを自分用にカスタマイズする方法をステップ・バイ・ステップで紹介します。(標準化は第二回以降で扱おうと思います)

仮想しばり

本エントリのレギュレーションとして「請負開発をしていて、開発用PCには強い統制がかけられている」といった状況を想定してみます。具体的には下記の通り。

  • OA向きのWindowsPC(良くて2Coreメモリ4GB)しか支給されていない(Windows10ともかぎらない)
  • PCには認められたツールしかいれることができない
  • 有償のツールは開発メンバーの人数分買わないといけないので、おいそれと稟議にかけられない

素のCodeReady Workspacesでできること

CodeReady Workspacesは、ほぼデフォルトのままデプロイした場合でも下記のようなことが簡単に実現できます。

  1. Eclipse cheベース(使い勝手はVisual Studio Codeに近い)のエディタでいろいろな言語の開発ができるf:id:Tatsuyak9i:20210217150205p:plain
  2. Workspaceにアタッチされているコンテナ(Linux)のなかで、いろいろなコマンドを発行できるf:id:Tatsuyak9i:20210217150804p:plain
  3. Eclipse cheはブラウザベースなので、PCにはモダンブラウザだけあればいい
  4. KeycloakでSSO(シングルサインオン)できるf:id:Tatsuyak9i:20210217145748p:plain

素のCodeReady Workspacesではできないこと

そのままでは少し(人によっては大きく)足りない部分があります。

あらかじめ準備されたコンテナ上に使いたいコマンドが揃っていない

第一回ではこれを解決してみようと思います。

ゴール設定

CodeReady WorkspacesはVisual Code Studioとちがって、新しいターミナルを起動するときに画面右側の直方体をクリックしてから、ターミナルを起動したいコンテナを選んで [>_ New terminal]を選択します。下記画像では予め準備されたmavenが表示されていますが、ここに自分で作成したコンテナイメージの[toolbox]を表示させて、好きなコマンドを含んだコンテナが起動できるようにすることがゴールです。

f:id:Tatsuyak9i:20210217151951p:plain

追加するコマンドは以下の3つを想定します

  1. ansible
  2. jq
  3. siege

ansibleはいわずもがなですが、jqはcurlなどでREST APIを通して取得したJSONから特定の項目を抜き出すのに便利なツール、siegeはアプリケーションに負荷をかけてレポートまでざっとだしてくれるツールです。

必要条件

仮想縛りがあるのであまり条件は多くつけられませんが、最低これだけは必要です。

  1. OpenShift上で自由にイメージビルドをさせてもらえるProject(Namespace)をもらえている
  2. CodeReady Workspacesがデプロイされていて使える状態にあること
  3. CodeReady Workspacesを動かせるモダンブラウザがPCにインストールされていること
  4. (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の仕方が書いてあります。

f:id:Tatsuyak9i:20210217161153p:plain

これを自由にイメージビルドしていいプロジェクト内で実施します。 イメージのビルドはCLIを使ったほうが楽なので、CodeReady Workspaces内のTerminalから実施することとします。 例としてQuarkusのQuickStartを使います。(コマンドを追加するのもこのQuarkusのQuick Startを流用します) 左側のGet Startedの中からQuarkusを選択してしばらく待ってください。

f:id:Tatsuyak9i:20210217161904p:plain

エディタが開いたら右側の直方体をクリックして、mavenのしたにある[>_New terminal]を開いてください

f:id:Tatsuyak9i:20210217162330p:plain

下にTerminalが開いたはずです。このコンテナイメージにはOpenJDK11やmavenコマンドに加えて、OpenShiftを操作するためのocコマンドも入っているのでこれを利用します。 (余談ですがocコマンドのWindows版は64bit版しかないので、Win7 32bitなどをクローズドネットワークなどでつかっているような環境では利用できなくて非常に困ります)

f:id:Tatsuyak9i:20210217162442p:plain

OpenShiftにCLIからログインしますが、普段から実行して慣れている方はそのとおり実行してください。慣れていない方はOpenShiftにWebからログインして、右上のCopy Login Command をたどっていって、oc login ~ としている行をコピーアンドペーストしてください。

f:id:Tatsuyak9i:20210217162908p:plain

f:id:Tatsuyak9i:20210217163538p:plain

これで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

一気にやってしまいましたが、それぞれ以下の意味を持っています。

  1. プロジェクトの移動
  2. UBI8のインポート
  3. ビルドコンフィグをSCMから自動作成(s2iのDockerBuild) ここのURLは自分で用意したSCMのリポジトリURLに変更してください
  4. ビルドを実行
  5. ビルドのログ確認(ビルド番号ごとに確認対象がかわります)
  6. できあがったイメージストリームを確認

表示されているログを眺めると普段の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」というプロジェクトの中に起動します。なのでこのプロジェクトに権限をあたえます。

f:id:Tatsuyak9i:20210218111008p:plain

oc policy add-role-to-group \
    system:image-puller system:serviceaccounts:tkurebay-codeready\
    --namespace=mytoolbox

ユーザー名のところはご利用のものにかえてください。

STEP5 QuickStartへの組み込み

devfileを改変していきます。一旦起動しているWorkspaceを止めてください。 左上の黄色い矢印をおして、起動しているWorkspacesを右クリックしてStopを押します。

f:id:Tatsuyak9i:20210218113425p:plain

Workspacesをクリックして最初につくったWorkspaceを選択してください。(素直にやっていれば1つしかありませんが、写真では記事の都合上2つあります)

f:id:Tatsuyak9i:20210218113607p:plain

Devfileをクリックしてください。

f:id:Tatsuyak9i:20210218114424p:plain

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を選択してください。

f:id:Tatsuyak9i:20210218114658p:plain

STEP6 動作確認

起動したWorkspacesの右側の直方体をクリックしてみると、「toolbox」が表示されているはずです。 f:id:Tatsuyak9i:20210218115145p:plain

[>_ New terminal]をおして追加コマンドを実行してみてください。 追加したコマンドが実行できるか確認してみてください。

f:id:Tatsuyak9i:20210218115355p:plain

おめでとうございます!これでプライベートなカスタマイズに成功しました。

Next Action!

便利ツールボックスの追加に成功したら、これをみんなに使ってほしいですよね? 次回のエントリではツールボックスをみんなにつかってもらえるようにする方法を紹介してみたいと思います。乞うご期待!

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。