Bluemix の CloudFoundry ランタイム(コンテナ)で、スクラッチからアプリを開発する場合の流れについて、実際に試したメモです。
元々の背景
前々から思っている事なんだけど、BluemixのCFランタイム環境で、Node.js や Ruby のアプリをスクラッチから、すなわちゼロから、アプリを書くのは正直に言って辛い。 アプリの雛形をフレームワークのアプリケーション・ジェネレータを使って作りたいけど、実行環境でコマンドラインは使えるけど、sudo でモジュールを追加することはできない。 それに、開発言語のAPIやライブラリの動作を検証して、アプリのコードに組み込みたいが、いちいち bx cf push しないと動作が確認できないし、コマンドラインにデバック出力を出して確認もできない。 Bluemixは、コードをスクラッチから開発する場合は生産性が高いとは言えない。
もちろん、Bluemix には、次の様な DevOps/ Continuous Delivery のサービスが提供されていて、アプリケーションの運用と開発のサイクルを効率良く回せる環境が提供されているが、プログラム言語の動作を確認したり、フレームワークを適用する部分は、Bluemix では弱い部分と言える。
Eclipse IDE で、ローカルのPC 環境でコードを書き始めるというケースも少なくないし、その後、デプロイするパッケージを作って、サーバーへデプロイするのは、Java のでは、一般的ではないかと思う。しかし、クラウドで簡単に実行環境が構築でき、インターネットからモジュールを取得する高効率の環境があるのに、小規模なアプリを Java で開発するのもイケて無いかな(笑)。 それに、クラウド時代のCPUは、Intel CPU のみになってしまったし、CPU のメーカー非依存の Java を選択という理由も無くなってきた。そこで、コンパイル無しでも動作して、インターネット上のリポジトリから簡単にモジュールを追加できる開発言語を対象に考えてみる。
スクラッチからのコード開発の流れ
スクラッチからコードを書くには、パーソナルな仮想サーバーの開発環境でコードを書いて、express, rails, PHPの各種フレームワークなどで、開発のスタートラインを作って、それから、Bluemix のランタイムへbx cf push するのが、効率が良さそうだ。
この様なスクラッチからの開発の流れを図に表すと、以下の様な流れになる。
ここから、この流れについて、具体的な方法例を示しながら、考察を進める。
仮想サーバー or PCのローカル環境開発環境
いきなり、Bluemix で書き始めるのではなくて、最初はクラウドやVagrantの仮想サーバーを利用する。 理由は、node, ruby, php, python などでアプリを作る場合、生産性を高め、頻繁に必要とするコードは自分で書かずに、フレームワークを利用してアプリケーションの機能に集中したい。このために、コマンドラインで動作する フレームワークのアプケーション・ジェネレータを利用して、コードを生成するためである。
ランライム環境
クラウドの仮想サーバーを開発環境に使うには、コストが掛かるから、スクラッチでコードを書くには、Windows や MacOS の環境に、Vagrant を導入して開発環境を作るので十分な場合がある。
- Vagrant https://www.vagrantup.com/
- Virtual BOX https://www.virtualbox.org/
開発言語環境
Linux ディストリビューションで利用できる PHP, Python, Ruby, Node のバージョンには制約があるため、バージョン管理ツールを利用すると便利である。 Bluemix CFのランタイム環境では、Ubutu14.04 をベースとしているが、プログラム言語のバージョンは、Ubuntu14.04 にバンドルされたバージョンではなく、CFのランタイムでは、さらに新しいバージョンが適用される。
そこで、次に、例として挙げるこれらのツールを使えば、ディレクトリ単位でラインタイム環境のバージョンを変更する事ができるので、Bluemix CFアプリのバージョンに合わせていく事ができる。
バージョン管理ツールの例
- pyenv https://github.com/pyenv/pyenv
- rbenv https://github.com/rbenv/rbenv
- ndenv https://github.com/riywo/ndenv
- phpenv https://github.com/phpenv/phpenv
フレームワークを提供してアプリの雛形の自動生成
アプリの雛形を自動的に生成するステップであるが、一例として、Node.js の Express フレームワークを利用して、アプリケーションのベースとなるコードを生成する様子を記載する。 app.js がアプケーションのベースコードになり、個別の機能を追加できる。 また、HTMLページ生成のテンプレートエンジンを利用することで、動的なウェブページの開発を効率良く進める事ができる。
$ express myapp
create : myapp
create : myapp/package.json
create : myapp/app.js
create : myapp/public
create : myapp/public/javascripts
create : myapp/public/images
create : myapp/public/stylesheets
create : myapp/public/stylesheets/style.css
create : myapp/routes
create : myapp/routes/index.js
create : myapp/routes/users.js
create : myapp/views
create : myapp/views/index.jade
create : myapp/views/layout.jade
create : myapp/views/error.jade
create : myapp/bin
create : myapp/bin/www
install dependencies:
$ cd myapp && npm install
run the app:
$ DEBUG=myapp:* npm start
開発したコードをGitへ登録
Bluemix の Continuous Integration のサービスでは、GitHub や Bluemix Git も利用できる。 Bluemix Gitは、Bluemix にアカウントがあれば、プライベートでも無料で利用できるので便利かもしれない。Bluemix Gitへ登録する方法は、Bluemix git リポジトリの使い方のメモにメモを残してある。
開発初期段階推進
フレームワークを利用すると言っても、幾分スタートラインが有利になるだけで、必要なモジュールが揃う処までは、ローカルで開発した方が効率が良い。 Node.js で例に挙げると、セッションを管理するなどの機能を追加するためには、npm install コマンドを利用して、node.js のライブラリを追加しなければならない。 しかし。CFランタイムにログインはできても、コンテナでは、npm install を実行するなど、Software構成に関わる操作は許されていないので、Bluemix 以外の環境で基礎部分を検証して開発する必要がある。
以下は、Express フレームワークのセッション管理を追加するモジュールで、CFアプリにデプロイする前に、インストールしておく必要がある。
myapp$ npm install --save express-session
この例では、--save とすることで、package.json に必要なモジュールとバージョンが追記される。 この package.json が正しく作成されていれば、CFアプリをデプロイする際に、必要なモジュールを全て組み込んでくれるので、--save を忘れない様にする。
Bluemix マニフェストの作成
ベースとなるアプリケーションのコードや必要パッケージのファイルができたら、いよいよ、Bluemix へデプロイする準備を始める。 以下は、Express フレームワークのアプリケーションの例です。 このディレクトリに、manifest.yml を追加する。
imac:myapp maho$ ls -al
total 112
drwxr-xr-x 15 maho staff 510 5 28 10:51 .
drwxr-xr-x+ 114 maho staff 3876 5 28 09:16 ..
drwxr-xr-x 13 maho staff 442 5 28 09:15 .git
-rw-r--r-- 1 maho staff 35141 5 27 20:42 LICENSE
-rw-r--r-- 1 maho staff 2270 5 28 00:50 README.md
-rw-r--r-- 1 maho staff 2585 5 27 20:42 app.js
drwxr-xr-x 3 maho staff 102 5 27 20:42 bin
drwxr-xr-x 4 maho staff 136 5 27 20:42 docs
-rw-r--r-- 1 maho staff 893 5 27 20:42 login.js
-rwxr-xr-x 1 maho staff 143 5 28 10:51 manifest.yml <--- このファイルを追加作成
-rw-r--r-- 1 maho staff 450 5 27 20:42 package.json
drwxr-xr-x 3 maho staff 102 5 27 20:42 private
drwxr-xr-x 6 maho staff 204 5 27 20:42 public
drwxr-xr-x 4 maho staff 136 5 27 20:42 routes
drwxr-xr-x 6 maho staff 204 5 27 20:42 views
アプリケーションが動作するためのスペックを記述するためのYAML形式のファイルである。
applications:
- path: .
memory: 128M
instances: 1
domain: mybluemix.net
name: express_myapp
host: express_myapp
disk_quota: 1024M
このマニフェストの記述方法、オプションの意味は、以下のURLに解説がある。
- Supported options in the manifest file https://console.ng.bluemix.net/docs/manageapps/depapps.html#appmanifest
- Deploying with Application Manifests https://docs.cloudfoundry.org/devguide/deploy-apps/manifest.html
Bluemix CFランタイムへデプロイ
マニフェストが出来たら、いよいよ、Bluemixへデプロイする。 予め bluemix CLI コマンドをインストールして、Bluemix へログインしている必要がある。 ダウンロードとインストールは、Bluemix CLI Home Page にある。
imac:myapp maho$ bx cf push
'cf push' を起動しています...
マニフェスト・ファイル /Users/maho/myapp/manifest.yml を使用しています
takara9@gmail.com としてアプリ express_myapp を組織 takara9@gmail.com / スペース dev 内に作成しています...
OK
経路 express_myapp.mybluemix.net を作成しています...
OK
express_myapp.mybluemix.net を express_myapp にバインドしています...
OK
express_myapp をアップロードしています...
次のパスからアプリ・ファイルをアップロードしています: /Users/maho/myapp
131.9K、28 個のファイルをアップロードしています
Done uploading
OK
takara9@gmail.com として組織 takara9@gmail.com / スペース dev 内のアプリ express_myapp を開始しています...
Downloading dotnet-core_v1_0_13-20170330-1023...
Downloading nodejs_buildpack...
<中略>
Downloaded sdk-for-nodejs_v3_11-20170303-1144
Creating container
Successfully created container
Downloading app package...
Downloaded app package (69.9K)
Based on Cloud Foundry Node.js Buildpack v1.5.24
-----> Creating runtime environment
NPM_CONFIG_LOGLEVEL=error
NPM_CONFIG_PRODUCTION=true
NODE_MODULES_CACHE=true
-----> Installing binaries
engines.npm (package.json): unspecified (use default)
Resolving node version (latest stable) via 'node-version-resolver'
Installing IBM SDK for Node.js (6.10.2) from cache
Using default npm version: 3.10.10
-----> Restoring cache
Skipping cache restore (new runtime signature)
-----> Building dependencies
Installing node modules (package.json)
myapp2@0.0.0 /tmp/app
│ ├── bytes@2.4.0
│ ├── content-type@1.0.2
│ │ ├── inherits@2.0.3
│ │ ├── setprototypeof@1.0.2
<中略>
-----> Build succeeded!
├── body-parser@1.15.2
├── cookie-parser@1.4.3
├── debug@2.2.0
├── express@4.13.4
├── express-flash@0.0.2
├── express-handlebars@3.0.0
├── express-session@1.15.3
├── jade@1.11.0
├── morgan@1.7.0
└── stylus@0.54.5
Exit status 0
Staging complete
Uploading build artifacts cache...
Uploading droplet...
Uploaded build artifacts cache (2.6M)
Uploading complete
Destroying container
Successfully destroyed container
1 個の中の 1 個のインスタンスが実行中です
アプリが開始されました
OK
アプリ express_myapp はこのコマンド `./vendor/initial_startup.rb` を使用して開始されました
takara9@gmail.com として組織 takara9@gmail.com / スペース dev 内のアプリ express_myapp の正常性と状況を表示しています...
OK
これが完了すると、Bluemix のダッシュ・ボードには、以下の様に表示される。
Bluemixでチーム開発 (第二段階)
ここまでの作業で、Bluemix の CFアプリとして、外部からアクセスできる様になった。 次に Bluemix の継続的デリバリーを有効化して、Git、エディタ、開発環境と本番環境を同期する機能を有効にしていく。次の画面 Cloud Foundry アプリ 概要画面の継続的デリバリーの有効化のボタンをクリックして、前へ進める。
先に登録したGitリポジトリの名称とURLを指定して、ツールチェーンを作成する。
作成完了後の応答画面に、次の情報が表示される。
- Issues は 課題管理で、チームで共同作業を円滑にする。
- Git は プログラムのリポジトリー管理である。
- Eclipse Orion Web IDE は Git のリポジトリを表示して、編集やデプロイができる。
- Delivery Pipeline は アプリケーションのビルド、デプロイなどのリリースまでのプロセスを自動化する。
Bluemix 本番運用と継続開発
Delivery Pipeline のタイルをクリックすると、次の様なステージが表示される。Node.jsのアプリで、各ステージでどんな動きをしているかログで確認してみた。
- Build Stageでは、Gitリポジトリからクローンしている。本記事では、コンパイル不要なNode.js ですから、ビルドする必要が無いのでクローンだけで終わったが、Java ではコンパイルして、war などを作成するプロセスが、このステージに入っていると思われる。
- Deploy Stage 試験 では、Build Stage が完了すると bx cf push と同様の動作をする。つまり、Git から Clone 完了すると、アプリ実行に必要なモジュールをダウンロードして、クラウド・ファウンドリーのコンテナを作成して、実行を開始する。
- Deploy Stage 本番 は、マニュアル操作でのみ、本番アドレスのランタイムへ、bx cf push する。試験ステージで、動作確認できたら管理者の判断で、本番サービスにリリースができる。
デリバリ・パイプラインへ組み込めるツール
デリバリーパイプラインに追加できるツールの一覧を表示すると、以下の様になる。Jenkins, GitHub, Slack, JIRA など定番ツールが含まれている。
ローカル環境のエディタ
統合開発環境として、Eclipse Orion Web IDE が提供されているが、Atom や Emacs に慣れていると、とても使い難いですよね。 そこで、git で ローカル環境に、clone して、好きなエディタで修正とテスト、commit, push というプロセスでも、利用できるので便利ですね。
エディタは、使い慣れたソフトで良いと思うのですが、ちなみに、私の一番慣れた環境は、Emacs です。
- Atom https://atom.io/
- Emacs https://www.gnu.org/software/emacs/
- nano https://www.nano-editor.org/
- vim http://vim-jp.org/vimdoc-ja/
感想
Bluemix は 利用者に方法を強制せず、自分の必要な環境や好みの方法と合わせて利用できる点が、良いと思います。