船木俊介「ディープビジネスフロンティア」

船木俊介 (スーパーソフトウエア東京オフィス代表&キッズラインCTO)

前回からの続き

2.GitHubプライベートリポジトリの作成

Werckerと連携するGitHubのプライベートリポジトリを用意しておきます。WerckerはGitHubとBitbucketに対応しているので、プライベートリポジトリも無料で使えるBitbucketでもOK。リモートにpushします。

$ git remote add origin git@github.com:yourusername/rweckersample.git
$ git push -u origin master

3.Werckerを設定

CIサービスWerckerを使えるようにしておきます。Werckerの新規登録はこちらからできます。

rw4

ログインして、「Add Application」からCI対象のアプリを追加します。

STEP1 Choose a Git provider : GitHubを選択

wk1

STEP2 Select a repository : 先ほどGitHubにpushしたリポジトリ(今回はrwerckersample)を選択

wk2

STEP3 Configure access : Werckerがリポジトリからソースコードを取得するためのアクセス方法を設定します。デフォルトのデプロイキー追加方法でいいでしょう。

wk3

STEP4 Setup your wercker.yml : Werckerがソースコードをビルドしたりテストしたりなど、どう扱うべきかを書いたwercker.ymlをアプリケーションに追加してねということです。テキストボックスの内容をコピーして、アプリケーションのルートディレクトリにwercker.ymlファイルを作成してペーストしましょう。

wk4

STEP5 Awesome! you are all done! : 最初の設定は完了です。

wk5 wk6

Werckerのビルドを走らせる前に、先ほどのwercker.ymlを自分のアプリケーションに合わせた内容にしておきましょう。ここではmysqlを使うこととrspecを走らせる設定を追加しています。

wercker.yml

box: wercker/rvm

services:
    - wercker/mysql

# Build definition
# See the Rails section on the wercker devcenter:
# http://devcenter.wercker.com/articles/languages/ruby/settingup-rails4.html
# You will want to define your database as follows:
# services:
#   - wercker/postgresql
# See more about services on our devcenter:
# http://devcenter.wercker.com/articles/services/
build:
    steps:
        # Uncomment this to force RVM to use a specific Ruby version
        # - rvm-use:
        #       version: 2.1.5

        # A step that executes `bundle install` command
        - bundle-install

        # A step that prepares the database.yml using the database in services
        # - rails-database-yml
        - rails-database-yml:
            service: mysql

        # A custom script step, name value is used in the UI
        # and the code value contains the command that get executed
        - script:
            name: echo ruby information
            code: |
                echo "ruby version $(ruby --version) running"
                echo "from location $(which ruby)"
                echo -p "gem list: $(gem list)"

        # Add more steps here:
        # - script:
        #        name: rspec
        #        code: bundle exec rspec
        - script:
            name: Set up database
            code: RAILS_ENV=test bundle exec rake db:schema:load
        - script:
            name: Run rspec
            code: bundle exec rspec

ローカルへのコミットに続いてGitHubのリモートにpushします。そうすると、Werckerでは自動的にGitHubへのpushを検知してビルドが実行されます。リモートへpushした後に、ブラウザでWerckerを確認してみてください。

$ git add .
$ git commit -m 'add wercker.yml'
$ git push -u origin master
wk7

ビルド成功。先ほどwercker.ymlで設定したrspecも自動的に実行されてパスしています。

wk8

ここまでで、ローカルで開発して、GitHubへpushすることでコードに問題がないことを自動的にチェックする仕組みができました。続いて、AWSでサーバを立ててデプロイしていきます。





カラーズではWebサービスの開発を行っていて、スーパーソフトウエアでは業務系や公共系のシステムから、Webサービス、スマートフォンアプリといったアジャイルなものまで幅広く行っています。
 

同じシステム業界といっても、業務系とWeb系では別の業界といっていいくらい重視するポイントや開発フローが違っていて、エンジニア個人の裁量も異なるので、業務系で長く経験を積んできたという人でもWebサービスの開発現場に慣れるまで戸惑うことも多くあります。これからは転向する人も多いと思うので、Webサービスの開発フローを簡単に紹介しておきたいと思います。

 flow

僕がみているWebサービスの開発現場では、チームメンバーがコードを書き、GitHubでのプルリクエストベースで最終的にmasterブランチにマージされたコードはCIサーバでテストして、テストにパスしたものが自動でステージングやサービスサーバにデプロイされる仕組みにしています。
 

チームコミュニケーションでは、もう社内コミュニケーションにメールを使うことはほとんどなくなってチャットがメイン(いつの間にかメールは時代遅れ)、ファイル共有なんかもチャットで行い、コードレビューはGitHubのpull requestで、サーバはAWS、遠隔でのやりとりが必要な場合はSkypeで、といった感じ。
 

あとはエンジニア個人のマインドをどう作るかというところも大切なポイント。仕事の話や雑談も含めてコミュニケーションをより多く取れば行き違いが当然少なくなるし、結束力も高くなるのはどんな仕事でも同じだけど、基本的にエンジニアというのは高倉健なみにしゃべらないもの。10人の開発チームは10人の高倉健だと思って、コミュニケーションしやすいツールを整備。
 

Webサービスやスマートフォンアプリの開発では、ユーザへ提供する価値も移り変わりが速く、エンジニア個人の活躍の幅も格段に大きい。優秀な人は言語を問わず開発を行ったり、心血を注ぐ個人的なプロダクトがあったり。一方で、出来上がった仕組みの中で決められた業務を担うことが仕事だと思っている人は、ニーズの変化にスキルが追いつかずに埋もれて終わってしまうので、なにより、日頃から技術がどう人に役立つかの興味と成長意欲を持つことが大切。技術スキルは自分で試行錯誤しながらやってみないと伸びないので。
 

具体的な開発環境として、GitHub, Wercker, AWS, HipChatの連携構築をチュートリアル的に紹介していきます。CIサーバは、プライベートリポジトリでも無料のWerckerを試してみることもかねて、Werckerでgitのmasterをテストして、AWSにデプロイまでを自動で行い、結果がHipChatに通知されるイメージ。こういうサイクルが回る環境を作っておいて、日々の機能追加やバグフィックスなどの開発を行っていく流れを体感してもらえればと思います。

1.サンプルrailsアプリケーション

サンプルアプリケーション「rweckersample」を新規に作っていきます。参考までに環境は、ruby 2.1.5, Rails 4.1.4。

$ rails new rweckersample -T -d mysql --skip-bundle

Gemfileに、rspecを追加してbunlde install。rspecの初期化も。

group :development, :test do
    gem 'rspec-rails'
end
$ bundle install --path vendor/bundle
$ rails g rspec:install

      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

サンプルなので内容は何でもいいですが、ここでは簡単にscaffoldで書籍データ管理をするアプリケーションを作成。

$ rails g scaffold book title:string author:string outline:text

     invoke  active_record
      create    db/migrate/20141228202726_create_books.rb
      create    app/models/book.rb
      invoke    rspec
      create      spec/models/book_spec.rb
      invoke  resource_route
       route    resources :books
      invoke  scaffold_controller
      create    app/controllers/books_controller.rb
      invoke    erb
      create      app/views/books
      create      app/views/books/index.html.erb
      create      app/views/books/edit.html.erb
      create      app/views/books/show.html.erb
      create      app/views/books/new.html.erb
      create      app/views/books/_form.html.erb
      invoke    rspec
      create      spec/controllers/books_controller_spec.rb
      create      spec/views/books/edit.html.erb_spec.rb
      create      spec/views/books/index.html.erb_spec.rb
      create      spec/views/books/new.html.erb_spec.rb
      create      spec/views/books/show.html.erb_spec.rb
      create      spec/routing/books_routing_spec.rb
      invoke      rspec
      create        spec/requests/books_spec.rb
      invoke    helper
      create      app/helpers/books_helper.rb
      invoke      rspec
      create        spec/helpers/books_helper_spec.rb
      invoke    jbuilder
      create      app/views/books/index.json.jbuilder
      create      app/views/books/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/books.js.coffee
      invoke    scss
      create      app/assets/stylesheets/books.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

ルーティングの設定でrootを追加。

config/routes.rb

Rails.application.routes.draw do
  resources :books
  root 'books#index'
end

DBのマイグレーション。もちろんconfig/database.ymlでmysqlとの接続設定をしておく。productionは、この後サーバで動かす際の値を設定しています。

config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: (mysqlのユーザ名)
  password: (mysqlのパスワード)
  
production:
  <<: *default
  database: rweckersample_production
  username: (mysqlのユーザ名)
  password: (mysqlのパスワード)
  socket: /var/lib/mysql/mysql.sock
$ rake db:create
$ rake db:migrate

== 20141228202726 CreateBooks: migrating ======================================
-- create_table(:books)
   -> 0.2387s
== 20141228202726 CreateBooks: migrated (0.2388s) =============================

これで、WEBrickを起動してhttp://localhost:3000/にアクセスすれば簡単なアプリケーションが動きます。

$ rails s

=> Booting WEBrick
=> Rails 4.1.4 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2014-12-29 05:31:11] INFO  WEBrick 1.3.1
[2014-12-29 05:31:11] INFO  ruby 2.1.5 (2014-11-13) [x86_64-darwin13]
[2014-12-29 05:31:11] INFO  WEBrick::HTTPServer#start: pid=59561 port=3000

rw3
rw2

まだ何もコードを書いていないのでrspecテストは全てペンディング・成功になるはずですが、念のため失敗がないことを確認しておく。

$ rake spec
Finished in 0.24102 seconds (files took 1.44 seconds to load)
30 examples, 0 failures, 17 pending

などの結果が出るはずです。

ここまでをgitにコミットしておきましょう。その前に.gitignoreの設定をしておきます。.gitignoreの作成は、gitignore.ioというサービスを使うとコマンドラインから一発で作成できるので便利。アプリケーションのルートディレクトリで

$ gi osx,rails >> .gitignore

で.gitignoreを作成。実際はセキュリティなど色々と配慮しますが、サンプルなのでconfig/secrets.ymlもコミットする設定に変更します。

.gitignore

# TODO Comment out these rules if you are OK with secrets being uploaded to the repo
# config/initializers/secret_token.rb
# config/secrets.yml

ローカルにコミット実行

$ git init
$ git add .
$ git commit -m 'first commit'




24日のランチはクリスマスパーティー。華やか。この密集した状態でクラッカーを鳴らしてみたり、プレゼント交換したり。
10872134_737970422947212_1949446798_n_3

10884371_737975926279995_822776836_n_3
丸ごとのローストチキンを予約して、捌き方もYoutubeで調べてくれた真面目な福澤君。このチキンはジューシーで美味かった。
IMG_8057_3
戻ると、クリスマスは異教徒の催しです的ないつも通りの社内。イブだろうが、家が燃えようが、そんなことよりコード書けという渡部君の教えが行き届いてます。
IMG_8068_3
25日は出張してきた山澤君と、あるプロジェクトのミーティング。システムアーキテクトとか体制の話をぶっ通しで。今年の前半まで東京にいて、諸事情により離れたんだけど、あいかわらず優秀。
IMG_8071_3
せっかく来たんだからこの後の忘年会を一緒にと思ったけど、諸事情により夕方には戻らないといけないというので、3人で軽く忘年会。システムの実装とか、HomebrewとMacportsから見る時代の流れの話をしながら。(諸事情=早く帰らないと奥さんにボコボコにされる)
IMG_8078_3
夜は男らしい忘年会を恵比寿の「郷」で。ここのしゃぶしゃぶは美味しかった。エンジニアはというか、うちの社員はなぜか恐妻家ばかり。「初めから怖い女性と結婚する男は誰もいない」というのは名言だったし、「奥さんが怖い」という言葉は冗談ではなくてリアルな心の叫びらしい。
IMG_8093_3
翌日はカラーズの忘年会。六本木のル・プティ・マルシェで。顔の筋肉が痛くなるくらい笑った。まだスタートしたばかりだけど、良いメンバーが集まってくれて素晴らしい。
IMG_8111_2

↑このページのトップヘ