ユカシカド エンジニアブログ

体の栄養状態を把握する検査サービス VitaNoteを開発するエンジニアのブログ

西脇.rb & 東灘.rb 合同もくもく会 4th に参加してきました。 #nshgrb

早いもので私は3回目のもくもく会参加です。今回もたくさんの収穫があり、自分自身少しずつ積み重ねができてきたような実感も出てきました。振り返ってみると、実感した最大の収穫は

「ついにこれで開発できる状況が整った!」

です。

概要

Wiki

4th 2013.06.08 - nishiwaki-higashinadarb / meetup

テーマについて

今回のテーマは、

GitLab + Jenkins on Ubuntu でプライベートなCI環境での開発 ( Rails + RSpec )

でした。 おそらく多くの現場で、何かしらの方法でコードを管理されていると思うのですが、

  • 性質上パブリックにできないプロジェクトでもコードを管理してCIしたい
  • その上で、RSpec習得の一連の流れから、RailsでのTDDを体験したい

という理由です。 GitLabならGitLab CIじゃないのか?という話なんですが、前準備の段階でその理由などもあわせて準備内容を

Jenkins と GitLab と rbenvでプライベートなRuby開発環境を構築する

書きました。

成果について

プライベートな環境を構築するのが目的であるため、GitLabで作業していましたがレポートのためにGitHubに公開しています。

https://github.com/aq2bq/rspec_tutorial

Build on Jenkins

Jenkins + Railsのセットアップに関しては

Jenkins CI setup for Rails application from scratch

この記事がとても役に立ちました。特にビルドスクリプトを参考にしながら以下の様なコードを実行することにしました。

#!/bin/bash
source ~/.profile
source ~/.db/rspec_tutorial
rbenv shell 2.0.0-p195
bundle install
bundle exec rake db:create RAILS_ENV=test
rake db:migrate RAILS_ENV=test
bundle exec rspec

この時 config/database.ymlに書いてあるDB接続情報をどうするか様々な方法がある中、悩んだ結果、シェルの環境変数にいれておいて、database.ymlの中でERBをつかって動的に設定する方法を選択しました。

common: &common
  adapter: mysql2
  encoding: utf8
  reconnect: false
  pool: 5
  username: <%= ENV['RAILS_DB_USER'] %>
  password: <%= ENV['RAILS_DB_PASSWORD'] %>
  socket: <%= ENV['RAILS_DB_SOCKET'] %>

development:
  <<: *common
  database: rspec_tutorial_development

test:
  <<: *common
  database: rspec_tutorial_test

production:
  <<: *common
  database: rspec_tutorial_production

周回遅れのTDD on Rails入門

これまでは単体のRubyスクリプトRSpecの自習していましたが、RailsでTDD入門するにあたり、Qiitaに投稿された以下の記事を参考にしました。

これからテストを書き始めたい人のための Rails+RSpec+Spork+FactoryGirl チュートリアル(その1)

http://qiita.com/items/bf1bc376d88186050f3f

これからテストを書き始めたい人のための Rails+RSpec+Spork+FactoryGirl チュートリアル(その2)

http://qiita.com/items/fbe0a4ac2269a743dc17

テスト周りの技術はかなりのペースで新しい機構が開発されていて、何からどうしたらいいのかわからないという中でとてもありがたいチュートリアルでした。 名前は知っているけど、その実はよくわからないというgemも一通り説明がありました。

  • FactoryGirl
  • Spork
  • DatabaseCleaner

など。 それと、これまで@jnchitoさんコードを見ていて気になっていた、

  • Guard

も使ってみて、その便利さも実感しました。 RSpecのコードはチュートリアルを参考にしながら、自分なりにexpectを使った書き方に変えながら書きました。

require 'spec_helper'

describe Article do

  describe ".all" do
    before do
      FactoryGirl.create(:article)
    end
    let(:article_all) {Article.all}
    specify{ expect(article_all).to have(1).items }
  end

  describe ".new" do

    let(:article){ Article.new attributes}

    context "given valid attributes" do
      let(:attributes){{ :title => 'Hello,world!', :content => 'Hello!' }}
      specify { expect(article).to be_valid }
    end

    context "given nil title" do
      let(:attributes){{:content => 'Hello!' }}
      specify { expect(article).to have(1).errors_on(:title) }
    end

  end

end

これから

長くなりましたが、もくもく会中にたくさんアドバイスを頂いて、まだまだ書ききれない収穫がありました。今回できたのもモデルのユニットテストをちょこっと書いただけなので、受け入れテストはどうする?とか、CIってどこまでがCI?とか、まだまだわかってないことがあります。 しかし、冒頭に書いた通り、ひとまず開発を開始できる状況ができました。 これまでずっと抱えていた心配事をかなり消化できたので、改善を心掛けながら、これからバリバリコードを書いていきたいと思います!