オープンソースのPaaSソフトウェア CloudFoundry の技術情報やイベント告知などを掲載します

2015-08-12

FulcrumをCloud Foundryで動かす

みなさんこんにちは。 日本Cloud Foundryグループのスーパサブ@tnaotoです。 先日のPublickeyさんの記事がスマッシュヒットして、ある一部で有名人と化しております。ありがとうございます

「Cloud Foundry 百日行」前半最終日の第50日目の予定が@notaさんが原稿飛ばしたので、急遽繰り上がりでお送ります。

ということで、第49日目は、アジャイル開発支援ツール「Fulcrum」のご紹介です。

Fulcrumは、Pivotal TrackerのOSSクローンで、ストーリーベースのアジャイル開発を支援するツールです。

アジャイル開発の詳細説明は行いませんが、本ツールは、アジャイル開発の中でもスクラム手法に適し、 ストーリやバックログ、タスクの進捗管理等をデジタルな面で支えてくれる最適なツールとなります。

もちろん、有償のPivotal Trackerには敵いませんが、アジャイルを始めてみる場合に気軽に試せる環境としては有効かと思います。

基本情報

手順の概要は以下の通りです。

  1. ソースコードの取得
  2. 事前準備

    2.1 データベースサービスを用意する

    2.2. メールサービスを用意する

  3. コード修正

    3.1. コード修正

    3.2. database.ymlを用意する

    3.3. メール送信コードを追加する

    3.4. テスト用ユーザの追加する(オプション)

  4. Cloud Foundry 環境へのプッシュ

    4.1. manifestファイルを用意する

    4.2. アプリケーションのプッシュ   

  5. 動作確認

1.ソースコードの取得

git clone https://github.com/fulcrum-agile/fulcrum

開発が落ち着いているようであり、2015/8頭の段階で最新masterで問題なく動いています 動作確認済みのコミットハッシュは以下の通りです

5093e05eacbaa985cc3aa1c764cc1619ba5dd44a

2.事前準備

コードをpushする前に、いくつかファイルを修正します。

今回利用するサービスは以下の通りです。

  • MySQL(データベース)
  • sendgrid(メール送信サービス)

2.1 データベースサービスを用意する

データベースサービスを検索します。(CF環境へのログイン等は省略します)

Pivotal Web Serviceの場合、MySQLサービスは「cleardb」を利用します。

cf marketplace   

cleardb     spark, boost*, amp*, shock*    Highly available MySQL for your Apps.

なお、Bluemixの場合にも、MySQLサービスは「cleardb」が利用です。

データベースサービスを生成します。 利用プランは無償の「spark」、インスタンス名は「mysql」とします

cf create-service cleardb spark mysql

また、Bluemixにはサービスカタログには出てこない実験的扱いで、OSSのMySQLも存在します

こちらを利用する場合には、以下ようにサービスを作成します

cf create-service mysql 100 mysql

2.2 メール送信サービスを用意する

 2.1.のデータベースと同様にcf marketplaceを用いて検索します。

cf marketplace   

sendgrid    free, bronze*, silver*    Email Delivery. Simplified.

利用プランは無償の「free」、サービス名は「mail」とします。  

3.コード修正

3.1. コード修正

READMEのDeploying to other platformsに従い、コードを修正します config/fulcrum.example.rbをconfig/fulcrum.rbとしてコピーします。 ファイル内はコメントアウトされていますがコメントアウトを外し、以下のように設定します

Configuration.for('fulcrum') do
  app_host 'fulcrum.cfapps.io'
  mailer_sender 'noreply@example.com'
  disable_registration false
  column_order 'progress_to_left'
end

何も考えなければ、app_hostとmaier_senderだけ修正すれば充分に思います。

app_hostはデプロイする環境、および、アプリケーション名によって変更してください

3.2. database.ymlを用意する

Cloud Foundryのデータベースのautoconfigを利用するため、テンプレートをコピーして置いておくだけとします。

cp config/database.yml.mysql config/database.yml

3.3. メール送信コードを追加する

メール送信を行うにあたり、こちらのコードを参考に、以下のようにコードを追加します。

config/envirnoment.rb

# get Sendgrid credentials from ENV variable
credentials = host = username = password = ''
if !ENV['VCAP_SERVICES'].blank?
  JSON.parse(ENV['VCAP_SERVICES']).each do |k,v|
    if !k.scan("sendgrid").blank?
      credentials = v.first.select {|k1,v1| k1 == "credentials"}["credentials"]
      host = credentials["hostname"]
      username = credentials["username"]
      password = credentials["password"]
    end
  end
end

# overwrite ActionMailer settings to send through SendGrid servers
ActionMailer::Base.smtp_settings = {
  :address        => host,
  :port           => '587',
  :authentication => :plain,
  :user_name      => username,
  :password       => password,
  :domain         => 'example.com',
  :enable_starttls_auto => true
}

環境変数からサービスの情報を取得し、それを代入しています。

なお、sendgridを利用せずに、上記のsmtpの設定をgmail等他のサービスで利用することも可能です。

3.4.テスト用ユーザの追加する(オプション)

こちらのセクションは、3.3.の設定が充分に行われていれば、コードを修正する必要はありません。

db/seed.rbの1行目を修正し、railsアプリケーションの動作モードに関わらずユーザを作成するようにします。

 if true #<= Rails.env.development?

そもそも条件式にする必要があるのかという感じですが、コード上の変更を減らす最小限の修正となります。

なお、Fulcrumにはユーザ管理の機能が貧弱で作成済みユーザを削除する機能が無いため、必要の無い方は不用意にユーザを作成しないことをおすすめします。

4.Cloud Foundry 環境へのプッシュ

4.1. manifestを用意する

今回、デプロイにあたっては、manifest.ymlを用意し、一括処理でデプロイします。 push時における処理は以下の通りとしました。

bundle exec rake db:migrate && bundle exec rails server --port=$POR

また、今回2つのサービスを利用しています。

manifestを使わずにデプロイする場合には、一度-no-startでpush後にbind-serviceを行い、再度pushすることで、アプリケーションにサービスの情報を渡しますが、manifestにサービス情報を記載すれば一度のpush処理で完結することができます。

最終的に記載した内容は以下の通りになります。

applications:
  - name: fulcrum
    command: bundle exec rake db:schema:load && bundle exec rake db:migrate && bundle exec rake db:seed && bundle exec rails server --port=$PORT
    services:
    - mysql
    - mail

4.2. アプリケーションのプッシュ

今回は、manifestが存在するため、以下のコマンドのみですべての設定が完結します。

cf push fulcrum

結果が成功することを祈りましょう

4.3 アプリケーションプッシュの失敗の場合

だいたいの場合、4.2.の結果が失敗するのではないかと思います。 成功した方は、このままスルーして頂いて構いません。

失敗する場合には、おそらくテーブル作成処理あたりで失敗しているのではないかと思います。

2015-08-11T14:37:41.32+0900 [App/0]      OUT -- create_table(:users)
2015-08-11T14:37:41.33+0900 [App/0]      ERR rake aborted!
2015-08-11T14:37:41.33+0900 [App/0]      ERR StandardError: An error has occurred, all later migrations canceled:
2015-08-11T14:37:41.33+0900 [App/0]      ERR undefined method `database_authenticatable' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x007fd0f9ac05b8>/home/vcap/app/db/migrate/20110210082458_devise_create_users.rb:4:in `block in up'

原因はrails回りのバグかと思われますが、これを回避するために事前にテーブル作成のみ行います。

失敗した環境の場合には、まず以下のコマンドを打ってテーブルを作成してください。

cf push fulcrum -c 'bundle exec rake fulcrum:setup db:setup' --no-start

特にエラーもなく終了したら、最後アプリケーションをプッシュしてください

cf push fulcrum

5.動作確認

ブラウザを開き、アプリの動作を確認しましょう。

3.4.でユーザを作っている場合には、test@example.com/testpassでログインできます。

また、作ってない場合や新たなにユーザを作成したい場合には、「sing up」を押し、新規ユーザを作成してみましょう。

設定がうまく行われている場合には、指定したメールアドレスにメールが飛び、 添付されるURLをクリックすることで、新規ユーザが作成できます。

ログインが完了すると何も無いダッシュボードが現れます。

試しに、プロジェクトを作成し、ストーリを作成します。

ストーリを開始すると、In Progressに移行し、完了すると、[deliver]が現れます。 ストーリの受け入れの可否を選択し、受け入れの場合は終了し、拒否の場合には再度ストーリが開始されます。 一般的なストーリベースの開発と一緒ですね

Redmine等を駆使されている方は、試してみるのはいかがでしょうか


まとめ

PaaSを使って、アプリ開発スピードを上げていく場合に、アジャイル(スクラム手法)は非常に有効な手段であると、筆者は考えています。

その際に、fulcrumのようなアジャイル開発に特化したツールを使えば、生産性向上に一役買うことになるでしょう。

今回使用したソフトウェア

今回使用した改造付きソースコードは以下に置いてあります。 何かの参考にお使いください