冥冥乃志

ソフトウェア開発会社でチームマネージャをしているエンジニアの雑記。アウトプットは少なめです。

follow us in feedly

【縛りプレイ中】Codenvy(Eclipse Che)でGradleのプロジェクトをまともに使えるようにしたい(その2)

ちょっと時間が空いてしまいましたが、ちょっと変なところで引っかかっていて進んでなかったです。

Gradle + マルチプロジェクトの構成でCodenvyでコードを書く

前回調べてわかった通り、Codenvy(Eclipse Che)はビルドの柔軟性はありますが、コードを書くときのインテリセンスに使うクラスパスの指定には柔軟性がありません。maven基準です。

mao-instantlife.hatenablog.com

そのため現実解として、mavenプラグインを使って pom.xml を出力、という形を取っています。ただし、mavenはシングルプロジェクトのため、サブプロジェクト構成の場合は各サブプロジェクト配下にそれぞれ pom.xml が生成されます。

サブプロジェクトを扱う

Codenvy(Eclipse Che)では、プロジェクトルートとして取り込んだディレクトリ配下にあるサブディレクトリをルートにしてプロジェクトとして読み込ませることができます。サブプロジェクトにしたいディレクトリで右クリックでメニューを出すと Convert to project があります。

f:id:mao_instantlife:20161119172114p:plain

サブプロジェクト化する前に、mavenプラグインから生成された pom.xml をサブプロジェクトのルートに相当するディレクトリにコピーしておきましょう。メニュー選択後にプロジェクトタイプを選びます。ここはmavenを選択します。 pom.xml がすでにあるので、自動でプロジェクト設定が読み込まれてコードのインテリセンスの依存関係もとってセットアップしてくれます。

f:id:mao_instantlife:20161119172126p:plain

これを各サブプロジェクトに対して行えばいいわけです。面倒ですね。

コマンド構成を考える

Commandsでビルドやテストなんかのスクリプトをかけるのですが、マクロはあるけど引数が使えないんですね。というわけで、マクロから抽象化できるようなところはまとめるとして、無理なところは個別にコマンドを作る必要があります。この構成でやらないといけないことはだいたい以下になるかな、と。

  • プロジェクトから pom.xml を作る
  • pom.xml をコピーする
  • プロジェクト全体をビルド、実行する

ビルドと実行はプロジェクト依存になるのではないかと思います。 pom.xml の生成とコピーを別にしているのは、それぞれ実行する時のディレクトリを変えれば、サブプロジェクト配下で実行すれば抽象化できると思っているのでとりあえず。

ただ、プロジェクトの立ち上げのタイミングではコピーで登録するコマンドは使えません。手作業でコピーするのが一番楽です。

ワークスペース構成を考える

こうなると、ワークスペースに複数のプロジェクトを配置できるとはいえ、マルチプロジェクトを使っている限りは複数プロジェクトを配置するのはやめたほうがよさそうです。というよりも、貧乏性を発揮してワークスペース共有するのは、プロダクションレベルの話ではやめたほうがいいでしょうね。

必要なプロダクション単位にワークスペースを構築し、共有することに価値があるのだと思いました。

この辺を考慮した自分用Stackを作ってみた

いちいちこういうコマンド構成を作ったりするのも面倒なので、最低限の構成を自分用にStackとしてつくってみることにしました。

ワークスペースの開発環境マシンにするDockerイメージを作る

Cedenvyが公式のJava-Gradleイメージを配布しているんですが、若干Gradleのバージョンが古いです。

github.com

というわけで、Gradleのバージョンを新しくして、ついでにDockerをインストール済みのイメージを作ります。

https://hub.docker.com/r/shinsukeabe/ubuntu-gradle-docker/

CodenvyにStackを登録

Codenvyメインメニューに「Stack」があります。ここを選択すると現在有効なStackの一覧が出てくるのですが、しれっと「Add Stack」ボタンがあります。ここでつくったStackがパブリックに有効なのかどうかはよくわかりませんが、DockerHubでつくったイメージを引っ張ってきて、かつコマンドの追加などもできるので、個人用のワークスペーステンプレートとして活用してもいいと思います。

f:id:mao_instantlife:20161119172148p:plain

というわけで、コマンド構成など作ってみました。

f:id:mao_instantlife:20161119172159p:plain

で、commitとgithubへのpushができないわけですが。。。

プロジェクトの構成は改善の余地はあるとしてベースはできてきました。ただですね、gitへのパスは通っているんですが、コミットとプッシュができない状態です。コミットはユーザ名とメールアドレスの問題のようなので割と早く解決しましたが、後者は正しいパスワードでも弾かれちゃったんでよくわかりません。

それも含めて今の所出ている課題は以下。

  • githubへのプッシュができない
  • .gitignoreの編集ができない(ファイル一覧に出ない、ターミナルにviが入っていない)

まだまだ先は長そうですなあ。なんでこういうのってムキになり始めるとコード書くよりも楽しくなるんですかねえ。書きかけの個人プロジェクト使ってやってますが、全くもって進捗がありませんよっと。

【縛りプレイ中】Codenvy(Eclipse Che)でGradleのプロジェクトをまともに使えるようにしたい(その1)

まだまだ諦めておりませんよ?むしろコード書くより楽しくなってきています。

Codenvy(Eclipse Che)でGradleプロジェクトを扱う場合の問題点

そもそもGradleは公式で対応していないから修羅の道な訳です。大きくは以下2点。

  • Stackも公式から出てない(dockerhubから引っ張ることは可能なので、ビルドはできる)
  • インテリセンスがmaven基準(jarファイル単位でしか追加できない)

つまり、ビルドと実行コマンドを作ることはできて、その中ではパスは通ってますし、クラスパスもちゃんとgradleから見えているんですが、インテリセンスで見ているクラスパスにGradleが使えない状況です。一つ一つjarファイルをクラスパスに追加する絵しか思い浮かばなくて軽く絶望しかけました。

コード書く目的ではなくて、Githubから軽くコードを引っ張ってきて実行環境込みで動かしてみるにはいいんですが、コードを書く目的となるとエディタでコンパイルが通らないからとにかく不便です。

Github Issuesから漁ってみる

github.com

とか

github.com

とかで同じことを考えている人たちがいたんですね、やっぱり。

で、読んでみると、今後対応するつもりはあるようですが、今のところはアシスタンス機能はmavenでサポート可能なプロジェクトでのみ動く、ということのようです。対処法として示されているのは、

  • 依存関係を書いた pom.xml を用意する
  • jarファイルを一つ一つクラスパスに追加する

のどちらか。

いや、後者SpringBootとか辛すぎるでしょう。。。後者のIssueだと16のサブモジュールと13のソースディレクトリを持つGradleプロジェクトとか言ってるんですよ、一つずつjarを追加しろとか何でしょうか、その刺身タンポポ *1

Gradleからpom.xml出力すればいけるのでは?

前者をどうにか楽にできないものかと思って少し調べて見ました。mavenプラグインというのがあるんですね。

第53章 Mavenプラグイン

mavenプラグインで設定なしだとデフォルトローカルリポジトリに保存される模様。スタックのローカルリポジトリ/home/user/.m2/repository になるようです。Gradleのサンプルプロジェクトを使って gradle install してみたところ、メインのソースディレクトリのビルド結果についてはリポジトリにインストールされていますし、build/pomspom.xml は作成されています。ただ、テストに依存するライブラリはローカルリポジトリにインストールされないんですね。やりたいことに近づきはしましたが、まだまだです。

まとめ

やってやれないことはない気がしてきました。プラグインで大まかに事足りそうなのでいいですね。

テストのライブラリをローカルリポジトリに持っていければ基本的にやりたいことは全てできそうなので、次はこの辺りを調べてみようと思います。

追記

とりあえず、 gradle install タスクでできた pom.xml をプロジェクトルートにコピーするビルドコマンドを書いて、プロジェクト自体はmavenで読み込ませたところ、外部ライブラリにも追加されました。シングルソースディレクトリのプロジェクトであればこれでおそらく問題ないかと。

f:id:mao_instantlife:20161112151429p:plain

*1:ダイアログでのjarの選択がマルチでできない

【縛りプレイ中】Eclipse CheをDockerで使えるかどうか検証してみて挫折した

縛りプレイの一環です。

Eclipse Cheとは?

Eclipseが作っているクラウドIDEワークスペース管理を統合した環境です。コードエディターはOrionを使っている模様。

CodenvyがEclipse Cheを利用するサービスを提供しています。

Dockerイメージが公開されている

DockerHubを見るとイメージが公開されているんですね。

https://hub.docker.com/r/codenvy/che/

早速イメージを引っ張ってみます。

docker pull codenvy/che
abeshinsukenoMacBook-Pro:~ mao$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
codenvy/che         latest              9a261cf4b6b3        8 weeks ago         22.14 MB

いや、イメージ小さすぎないですかね?

使い方

eclipse-che.readme.io

docker for macは設定が必要らしいです。ハイパーバイザーでホストを立ち上げているので、そのIPアドレスを取得しておく必要がある模様。ちなみに、一回作っておくとIPアドレスは再起動しても変わりませんでした。推奨は .bash_profile に入れておけ、なんですが、ターミナル立ち上げるたびにパスワード訊かれるようになります。ちょっと行けてないです。

ランチャーCLI

公式に書かれているCLI使ったインストール方法はちょっと問題がありました。シェルに書かれているいくつかのイメージのタグ指定がnightlyになってて、そもそもユーザ周りがおかしくて動かないです。環境変数を指定すれば問題ないですが。。。

とりあえずは立ち上がる

docker run を使って起動しました。

適当にmavenワークスペースとプロジェクトを作ってみましたが、おそらくプロジェクトごとの開発・実行環境をdockerで内部に作っているような動きをしています。作成ご、ワークスペースがdockerで立ち上がってるのが確認できます(ホスト管理下のコンテナとして立ち上がるのは筋が悪い気がする)。

CONTAINER ID        IMAGE                                                                       COMMAND                  CREATED             STATUS              PORTS                                                                                                                                                                         NAMES
d5b1013c3a17        eclipse-che/workspacefkvue7fyxxjv8ubi_machine6xhzk3ramv4gz0oa_che_default   "/bin/sh -c 'sudo /us"   33 minutes ago      Up 33 minutes       0.0.0.0:32774->22/tcp, 0.0.0.0:32773->4401/tcp, 0.0.0.0:32772->4403/tcp, 0.0.0.0:32771->4411/tcp, 0.0.0.0:32770->8000/tcp, 0.0.0.0:32769->8080/tcp, 0.0.0.0:32768->9876/tcp   workspacefkvue7fyxxjv8ubi_machine6xhzk3ramv4gz0oa_che_default
c3f1967a84b6        codenvy/che-server:latest                                                   "/home/user/che/bin/c"   37 minutes ago      Up 37 minutes       8000/tcp, 0.0.0.0:8080->8080/tcp                                                                                                                                              che-server

ちなみに、デフォルトではgradleのワークスペースがありません。しかし、代替案はあるようです。ドキュメント自体はありました。

eclipse-che.readme.io

ちなみに、コードエディターのインテリセンスはctrl + fn + space。これがわからなくてちょっと焦った。。。

イメージを再起動すると。。。

ワークスペース消える。。。まあ、ボリュームをマウントしてなかったので、そうかもなあ、とは思ったんですが、ホストにも残っていないようです。

それ以前に、マシン再起動したりログオフしたりするとマウントエラーが出ます。 まずなんで最初に立ち上がったんだよ、というレベル。。。

これは、lib-copyとstorageが指定されていないからみたいなのですが、docker run時に-v指定してもマウントできませんでした。とりあえずKitematicで、とも思ったんですが、これをするとsockが使えなくて、ワークスペースが作れないという悪循環。

まとめ

というわけで、いざという時にローカルで立ち上げるようにしておいて、素直にCodenvy使います。今のご時世で、ネットに繋がらない状態でコードを書くというのが考えづらいのと、Codenvyから試して最終的にAWSとかに持っていった方がいいのでは?と思ったので。

【縛りプレイ中】ローカルにインストールしない開発環境構築

何を言ってるんだかわかりませんか?私もわかりません。

永らくMacBook Pro 2011 Earlyモデルで頑張ってきたわけですが、そろそろ辛くなってきたので、MacBook Proを新調しました。バタフライキーボードに少々慣れが必要ですが、薄さも大きさもちょうどいいですね。ほぼMacBook Airレベルで使えます。

ところで、以前のモデルから5年ほど経っていますので、開発環境や動作環境など、テクノロジーのトレンドも少し変わってきています。いい機会なので、旧環境からの移行をせずにまったく新規にコンセプトを立てて環境構築をしてみることにしました。まだ始まったばかりですが、既に縛りプレイです。

コンセプト

「ローカルにアプリ/ツールをインストールしない」縛り。

まったくゼロとはいかないと思うので、まあ極力というやつです。

構想

開発向けにインストールするツール

  • git
  • docker

dockerとdocker-composeを使い倒して、開発用に使うアプリケーション構成もgithubに押し込んでしまおうという構想です。こうしておくと、Macではない環境に移行した時もこの二つのツールがあれば基本的に同じ環境を作って開発ができるはず。それに、dockerを中心に構築しておけば、AWSなどにコンパイルを投げる、などもできるようになるはず。

1PasswordやChromeなど、開発以外の用途でインストールするものはありますが、一応開発向けにはこの二つに縛りを入れます。

ルール

X11を使って動かすものはなるべく使わないようにします。なるべくWebアプリケーションとして動く環境を構築するルールで。上記二つのツールとブラウザがあれば開発環境が作れてしまう、というのが理想です。

それのルールでJavaをメインに使う場合に何を選択すべきか、というのがまだ調査中です。DockerHubを見てみると、Cloud9のJavaカスタマイズのイメージもありますが、公式として出していて使いやすそうなのはEclipse Cheになるかな、と。

他にもRStudioやJIRAなんかもイメージ作っている人がいるので、この辺りを活用しようかな、と。

耐えられるか?

まだ始まったばかりなので、よくわかりませんが、コンセプトとしてはそこまで間違った方向に行ってないと思うので、ちょっとの不便は目をつぶって、どこまでいけるか試してみようと思います。とりあえず、Eclipse Cheをdockerで動かすところから。

JIRAの評価が終わったのでデータベースを外部化

公式の対応プラットフォームは見よう、本当に。

JIRA アプリケーションを PostgreSQL に接続する - アトラシアン製品ドキュメント

このあたりを参考に、データベースの移行をしていました。

できればjiraもdockerで動かしたいけど、とりあえずデータベースのみdockerでやってみようと思って、以下の様にデータベース立ち上げてデータベースの移行をやってみました。

docker run --name jira-postgres -t -i -v /root/jira-data/:/var/lib/postgresql/data/ -p 5432:5432 -e POSTGRES_PASSWORD=**** postgres

で、 <jira-install-directory>/bin/config.sh で接続情報を変えてみたら、接続テストは通るけどJIRAが起動しない、何かNullPointerExceptionで落ちてる。表示されるエラー画面がそもそもJIRAのエラー画面ですらなくてTomcatのエラー画面っぽかったので、ちょっとどうしていいかわからず。とりあえずWebのウィザード使ってみようと思って /var/atlassian/application-data/jira/dbconfig.xml を削除、JIRAを再起動してアクセスしてみました。で、やっぱりうまくいかないんですね。インポートでエラーになります。

java.lang.RuntimeException: Could not get unique fields for table 'AO_21D670_WHITELIST_RULES

どうも、あるテーブルのユニークフィールドが取得できてない模様。Atlassianのサポートに連絡して、色々と情報を集めたりしながらやりとりをしていましたが、なかなか解決せずげんなりしていたところで、ふと気づきました。

サポートバージョンじゃなくね?

PostgreSQLのイメージはlatest使っちゃダメ、という話でした。

Supported platforms - Atlassian Documentation

latestで引っ張ってくるとPostgreSQL 9.6系です。以下の様に9.4系最新を指定してデータベースを立ち上げ直したらインポートできました。

docker run --name jira-postgres -t -i -v /root/jira-data/:/var/lib/postgresql/data/ -p 5432:5432 -e POSTGRES_PASSWORD=**** postgres:9.4

こういう時にカジュアルに環境を切り替えられるので、dockerは便利ですね。