Bluemix CFアプリをスクラッチからのコードを書く時のメモ 


Bluemix の CloudFoundry ランタイム(コンテナ）で、スクラッチからアプリを開発する場合の流れについて、実際に試したメモです。


## 元々の背景
前々から思っている事なんだけど、BluemixのCFランタイム環境で、Node.js や Ruby のアプリをスクラッチから、すなわちゼロから、アプリを書くのは正直に言って辛い。 アプリの雛形をフレームワークのアプリケーション・ジェネレータを使って作りたいけど、実行環境でコマンドラインは使えるけど、sudo でモジュールを追加することはできない。 それに、開発言語のAPIやライブラリの動作を検証して、アプリのコードに組み込みたいが、いちいち bx cf push しないと動作が確認できないし、コマンドラインにデバック出力を出して確認もできない。 Bluemixは、コードをスクラッチから開発する場合は生産性が高いとは言えない。

もちろん、Bluemix には、次の様な DevOps/ Continuous Delivery のサービスが提供されていて、アプリケーションの運用と開発のサイクルを効率良く回せる環境が提供されているが、プログラム言語の動作を確認したり、フレームワークを適用する部分は、Bluemix では弱い部分と言える。
![スクリーンショット 2017-05-28 8.29.01.png](https://qiita-image-store.s3.amazonaws.com/0/42829/337d3622-521c-cf7f-e677-90f94c6735d4.png)

Eclipse IDE で、ローカルのPC 環境でコードを書き始めるというケースも少なくないし、その後、デプロイするパッケージを作って、サーバーへデプロイするのは、Java のでは、一般的ではないかと思う。しかし、クラウドで簡単に実行環境が構築でき、インターネットからモジュールを取得する高効率の環境があるのに、小規模なアプリを Java で開発するのもイケて無いかな（笑）。 それに、クラウド時代のCPUは、Intel CPU のみになってしまったし、CPU のメーカー非依存の Java　を選択という理由も無くなってきた。そこで、コンパイル無しでも動作して、インターネット上のリポジトリから簡単にモジュールを追加できる開発言語を対象に考えてみる。



## スクラッチからのコード開発の流れ
スクラッチからコードを書くには、パーソナルな仮想サーバーの開発環境でコードを書いて、express, rails, PHPの各種フレームワークなどで、開発のスタートラインを作って、それから、Bluemix のランタイムへbx cf push するのが、効率が良さそうだ。
この様なスクラッチからの開発の流れを図に表すと、以下の様な流れになる。

![スクリーンショット 2017-05-28 11.55.47.png](https://qiita-image-store.s3.amazonaws.com/0/42829/29e27eae-e07a-17c5-c324-16a08655da3c.png)

ここから、この流れについて、具体的な方法例を示しながら、考察を進める。

### 仮想サーバー 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](https://github.com/) や [Bluemix Git](https://git.ng.bluemix.net/) も利用できる。 Bluemix Gitは、Bluemix にアカウントがあれば、プライベートでも無料で利用できるので便利かもしれない。Bluemix Gitへ登録する方法は、[Bluemix git リポジトリの使い方のメモ](http://qiita.com/MahoTakara/items/bb0a645391c61b438599)にメモを残してある。

### 開発初期段階推進
フレームワークを利用すると言っても、幾分スタートラインが有利になるだけで、必要なモジュールが揃う処までは、ローカルで開発した方が効率が良い。 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形式のファイルである。

~~~file:manifest.yml
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](https://clis.ng.bluemix.net/ui/home.html) にある。

~~~
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 のダッシュ・ボードには、以下の様に表示される。
![スクリーンショット 2017-05-28 13.18.06.png](https://qiita-image-store.s3.amazonaws.com/0/42829/eae77a5c-cb59-650a-5d66-a6265402a96b.png)


### Bluemixでチーム開発 （第二段階)
ここまでの作業で、Bluemix の CFアプリとして、外部からアクセスできる様になった。 次に Bluemix の継続的デリバリーを有効化して、Git、エディタ、開発環境と本番環境を同期する機能を有効にしていく。次の画面 Cloud Foundry アプリ 概要画面の継続的デリバリーの有効化のボタンをクリックして、前へ進める。
![スクリーンショット 2017-05-28 23.06.55.png](https://qiita-image-store.s3.amazonaws.com/0/42829/ad9580dd-3f07-196f-512f-3ffceb04c059.png)

先に登録したGitリポジトリの名称とURLを指定して、ツールチェーンを作成する。
![スクリーンショット 2017-05-28 23.07.31.png](https://qiita-image-store.s3.amazonaws.com/0/42829/ee59a91d-891b-5acf-ded6-53f21ca760d7.png)

作成完了後の応答画面に、次の情報が表示される。
* Issues は 課題管理で、チームで共同作業を円滑にする。
* Git は プログラムのリポジトリー管理である。
* Eclipse Orion Web IDE は Git のリポジトリを表示して、編集やデプロイができる。
* Delivery Pipeline は アプリケーションのビルド、デプロイなどのリリースまでのプロセスを自動化する。

![スクリーンショット 2017-05-28 23.09.58.png](https://qiita-image-store.s3.amazonaws.com/0/42829/d617dc59-883e-f8a9-eb28-ad9adf98853e.png)

### Bluemix 本番運用と継続開発
Delivery Pipeline のタイルをクリックすると、次の様なステージが表示される。Node.jsのアプリで、各ステージでどんな動きをしているかログで確認してみた。

![スクリーンショット 2017-05-29 0.27.33.png](https://qiita-image-store.s3.amazonaws.com/0/42829/ec4bab75-e123-4ba7-78bc-bc789aa3695e.png)


* 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 など定番ツールが含まれている。

![スクリーンショット 2017-05-29 0.25.50.png](https://qiita-image-store.s3.amazonaws.com/0/42829/24985619-616b-ee4c-363a-e88357a7163b.png)



### ローカル環境のエディタ
統合開発環境として、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 は 利用者に方法を強制せず、自分の必要な環境や好みの方法と合わせて利用できる点が、良いと思います。