PostgreSQLを使ったRoRをGitHubからJenkinsを通してHerokuまで

Published on:
Tags: RoR, centos, rspec

参考をそのまま試した備忘ログ のCentOS and PostgreSQLを使用版

JenkinsもVPS上にやってるので最終的にはHerokuへの自動デプロイまでやったことの流れ (ついでに勉強したことのノート)

環境

  • CentOS 6.5
  • ruby 2.0.0dev
  • rails 4.0.2
  • postgreSQL 9.3

以上の環境が既に整ってることが前提

1. アプリの作成

1.1 rails new

1
$ rails new my_circle --database=postgresql --skip-test-unit --skip-bundle

Note : --database=postgresql == -d postgresql

—database=postgresqlオプションを入れた時と入れない時の違いは結構あるので注意

rails new project -d postgresql を指定した時に変更される部位

Note : --skip-test-unit == -T

標準だとTest::Unitというテスティングフレームワークが使用される(RSpecを使用したい)

Note : --skip-bundle

bundle installを行わない

どうせあとでちょっといじってまたbundle installする

そのままだと ‘autodetect’: Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable) と出る

1
2
3
4
5
6
7
8
9
$ vim Gemfile

Before
#gem 'therubyracer', :platforms => :ruby

After
gem 'therubyracer', :platforms => :ruby

$ bundle install

1.1 postgresの方でuserとDBの作成

1
2
$ createuser my_circle -s
$ createdb my_circle_development -O my_circle

createuser の -s/-Sオプション

スーパーユーザとして追加される

createdb の -Oオプション

新しいDBの所有者となるDBUserを指定

1.2 userメンテ画面をscaffold機能を使用して作成

1
$ rails g scaffold user name:string age:integer

1.3 DBの作成 & テスト用DBの作成

1
2
$ rake db:migrate
$ rake db:test:clone

1.4 確認

1
$ rails s

localhost:3000/users

  • rails s -pXXXX でポート番号を指定可能

2. RSpecのセットアップ

1
2
3
4
5
6
$ vim Gemfile

# 以下を追記
group :development, :test do
  gem 'rspec-rails', '~> 2.0'
end
1
2
$ bundle install
$ rails generate rspec:install

rails generate rspec:install

RSpecをセットアップするためのコマンド

これで、プロジェクトディレクトリの下にspecディレクトリができたのが確認可能(他には.spec等)

2.1 RSpecの出力フォーマットをドキュメント形式に変更

1
2
3
4
5
6
7
$ vim .rspec

Before
--color

After
--color --format documentation

3. アプリケーションの修正とユニットテストの作成

3.1 Userモデルに対してバリデーションの追加

1
2
3
4
5
6
7
8
9
10
11
$ vim app/models/user.rb

# 必須入力 && 最大文字数が20
  validates :name,
    :presence => true,
    :length => {:maximum => 20}
# 必須入力 && 入力値が0 - 1000の間
  validates :age,
    :presence => true,
    :numericality => {:greater_than_or_equal_to => 0,
    :less_than_or_equal_to => 1000}

3.2 バリデーションをテストするコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ mkdir spec/models
$ vim spec/models/user_spec.rb

# -*- coding: utf-8 -*-
require 'spec_helper'

describe User do
  context '何も入力しなかった場合' do
    subject{User.new}
    it { should_not be_valid }
    it { should have(1).errors_on(:name) }
    it { should have(2).errors_on(:age) }
  end

  context '名前が文字数をオーバーしている場合' do
    subject{User.new(name: 'aaaaaaaaaabbbbbbbbbbc',age: 10)}
    it { should_not be_valid }
    it { should have(1).errors_on(:name) }
    it { should have(0).errors_on(:age) }
  end

  context '年齢が範囲を超えている場合' do
    subject{User.new(name: 'taro',age: 1001)}
    it {should_not be_valid}
    it{ should have(0).errors_on(:name) }
    it{ should have(1).errors_on(:age) }
  end

  context '正常なデータがセットされた場合' do
    subject{User.new(name: 'taro',age: 20)}
    it {should be_valid}
  end
end

ブラウザでも確認可能

  • 何も入力しないでuserを追加しようとすると怒られる

3.3 テストの実行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ bundle exec rspec
(以下のような結果がでるはず)

User
  正常なデータがセットされた場合
    should be valid
  名前が文字数をオーバーしている場合
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
    should not be valid
    should have 1 errors on :name
    should have 0 errors on :age
  年齢が範囲を超えている場合
    should not be valid
    should have 0 errors on :name
    should have 1 errors on :age
  何も入力しなかった場合
    should not be valid
    should have 1 errors on :name
    should have 2 errors on :age

Finished in 0.1475 seconds
10 examples, 0 failures

Randomized with seed 15644

4. インテグレーションテストの作成

4.1 GemfileにRSpecをGherkin(ガーキン)記法で書けるようなgemを記述(turnip)

1
2
3
4
5
6
7
8
$ vim Gefile

...
group :development, :test do
  gem 'rspec-rails', '~> 2.0'
  gem 'capybara'
  gem 'turnip'
end

capybara

仮想的なwebブラウザでテストを行うために必要

turnip

gherkin記法でRSpecを書くことが可能なフレームワーク

1
2
3
4
5
6
7
8
$ bundle install
$ vim .rspec

Before
--color --format documentation

After
-r turnip/rspec --color --format documentation

4.2 Turnipを実行できるようにする

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ vim spec/spec_helper.rb

...
require 'rspec/autorun'#(この行の下辺りに)

#記述
Dir.glob("spec/**/*steps.rb") { |f| load f, true}

require 'capybara/dsl'
require 'capybara/rspec'
require 'turnip'
require 'turnip/capybara'

...

4.3 featureファイルとstepファイルの記述

users.feature

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ mkdir spec/feature
$ vim spec/feature/users.feature

# encoding: utf-8
# language: ja
機能: ユーザー管理
  ユーザー管理を行いたい。なぜならサークル活動に参加するメンバーを管理する必要があるからだ。

  シナリオ: 一覧画面から新規登録画面に移動する
    前提 ユーザー管理の一覧画面を開く
    もし "New User" リンクをクリックする
    ならば ユーザー管理の新規登録画面が表示される

  シナリオ: 登録画面で登録すると詳細画面に移動する
    前提 ユーザー管理の新規登録画面を開く
    もし "Name" に "アリス" と入力する
    かつ "Age" に "16" と入力する
    かつ "Create User" ボタンをクリックする
    ならば ユーザー管理の詳細画面が表示される

users_steps.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
$ mkdir spec/steps/
$ vim spec/steps/users_steps.rb

# encoding: utf-8

step 'ユーザー管理の一覧画面を開く' do
  visit '/users'
end

step '画面を目視' do
  save_and_open_page
end

step ':name リンクをクリックする' do |name|
  first(:link, name).click
end

step ':name ボタンをクリックする' do |name|
  first(:button, name).click
end

step 'ユーザー管理の新規登録画面が表示される' do
  current_path = URI.parse(current_url).path
  current_path.should == '/users/new'
end

step 'ユーザー管理の詳細画面が表示される' do
  current_path = URI.parse(current_url).path
  current_path.should == '/users/1'
end

step 'ユーザー管理の新規登録画面を開く' do
  visit '/users/new'
end

step ':field に :value と入力する' do |field, value|
  fill_in(field, :with => value)
end

4.4 テストの実行

1
2
$ bundle exec rspec
成功するはず

注意

$ rake db:test:cloneをしないと失敗する可能性がある

複数回連続では出来ない。多分DBに要素が残りっぱなし

5. Jenkinsでnew Jobを作成

ここらへんは、前回の記事と一緒

参考をそのまま試した備忘ログ

ネットワーク設定あたりの注意点

localではつながるが、vps上では色々やらないといけなかった nginxで動かすので yum install nginx等やって

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ vim /etc/nginx/nginx.com

##-- (ry

http {
  ##-- (ry

      listen 80;
    server_name <ホスト名>; 
    location {
      proxy_pass http://localhost:80; 
    }  
  }
}

ssh hoge@<ホスト名>

1
$ sudo service nginx restart

6. いざ実行しようとしたら、PostgreSQLの認証で怒られた

こんな感じ怒られる

1
FATAL: Peer authentication failed for user "postgres"

6.1 解決方法

  • pg_hba.confをいじる

PostgreSQL 9.3 でやってるので自分の環境では

1
2
3
4
5
6
7
8
9
$sudo vim /var/lib/pgsql/9.3/data/pg_hba.conf

## 変更前
# "local" is for Unix domain socket connections only
local   all             all                                     peer

## 変更後
# "local" is for Unix domain socket connections only
local   all             all                                     trust
1
$ sudo service postgresql-9.3 restart
  • md5では失敗したorz

7. Jenkinsでのjob中にてrspecでsyntaxエラー

3つのテストに分ける段階での、integration_testの方で

1
2
3
4
bundle install --path vendor/bundle
bundle exec rake db:migrate
bundle exec rake db:test:clone
bundle exec rspec spec/*/*.feature

ここで以下の様なエラー

1
2
3
4
$ bundle exec rspec spec/*/*.feature          
syntax error, unexpected ':', expecting end-of-input (SyntaxError)
機能: ユーザー管理
        ^

7.1 GitHub上に.rpsecファイルがないのが問題

ローカルなリポジトリにて

1
2
3
4
5
6
$ vim .gitignore
.rspecを消す

$ git stage .gitignore
$ git commit -m "Fix .gitignore"
$ git push

.rpsecの中身

1
-r turnip/rspec --color --format documentation

8 Herokuへpushしようとすると激おこ

原因:Jenkinsが頭よくて、masterを汚さないよう一時branchでやってる

8.1 解決方法

1
2
3
4
git checkout -b temp
git push heroku temp:master
git checkout master
git branch -D temp

という風にやる

やっと全部できた

参考

HTTP ノート その1

Published on:
Tags: http, studynote

Fiddlerで色々

リクエスト・メッセージ

1行目 : リクエストライン

1
GET /hoge/fuga.php HTTP/1.1

GET

  • メソッド

/hoge/fuga.php

  • リクエストURL

HTTP/1.1

  • プロトコルバージョン

2行目~ : ヘッダ

リクエストラインの次の行からはヘッダ(1行毎にヘッダと呼ぶ?) * Accept * Referer * Accept-Language * HOST * …

色々

レスポンス・メッセージ

ステータスライン

1
HTTP/1.1 200 OK

HTTP/1.1

  • プロトコルバージョン

200

  • ステータスコード
ステータスコード 概要
1xx 処理が継続中
2xx 正常終了
3xx リダイレクト
4xx クライアントエラー
5xx サーバーエラー

OK

  • テキストフレーズ

ヘッダ(レスポンスヘッダ)

Content-Length

  • ボディのバイト数

Content-Type

  • MIMEタイプというリソースの種類の指定
MIMEタイプ 意味
text/plain テキスト
text/html HTML文書
application/xml XML文書
text/css CSS
image/gif GIF
image/jepg JPEG
image/gif PNG
application/pdf PDF

charset=UTF-8はHTTPレスポンスに対する文字エンコーディング

POSTメソッド

  • GETメソッドと異なりメッセージボディをもつ

メッセージボディ

  • POSTメソッドのリクエストのボディに送信される値がある
  • 送信される値に関するヘッダがContent-Length, Content-Type
  • Content-Length = ボディのバイト数

ネットワークのお勉強の際のノート

Published on:
Tags: network

ノート

プロキシ

  • DNSキャッシュサーバーのように通信を代理で行ってくれるサーバー
  • 通信を代理で行う

プロキシのイメージ

プロキシのメリット

  • 実際に通信するのはプロキシなので、PC側が安全

リバースプロキシ

  • プロキシはPC側がやるもの、リバースプロキシはWebサーバー側がやるもの

リバースプロキシのメリット

  • 実際に通信するのはリーバスプロキシサーバーを通すようにするので、Webサーバ側の安全性があがる

参考

ネットワーク入門サイト

Install Jenkins on CentOS6.4

Published on:

環境

  • CentOS 6.4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ sudo yum groupinstall "Development Tools"
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ sudo yum install -y nginx
$ sudo service nginx start
$ sudo chkconfig nginx on
$ sudo yum install -y wget
$ sudo yum install -y java-1.7.0-openjdk java-1.7.0-openjdk-devel
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ sudo vim /etc/sysconfig/jenkins 

JENKINS_PORT="XXXXX"
JENKINS_ARGS="--prefix=/jenkins --httpPort=${JENKINS_PORT} --ajp13Port=${JENKINS_AJP_PORT}"

$ sudo vim /etc/nginx/conf.d/jenkins.conf

server {
    listen 80;
    server_name hoge.com;
    location /jenkins {
        proxy_pass http://localhost:XXXXX;
    }
}

$ sudo /etc/init.d/nginx restart

参考

Rails4とJenkinsとGitHubの設定

CentOS-6へ最新版のnginxを3分でインストールする方法

CentOS6.4 に システムワイドなrbenvでrubyをインストール

Published on:
Tags: CentOS6, rbenv

あとあとJenkinsのrbenv等でOS側がインストールしているRubyを使わせたいのでroot側でやっておく(Jenkinsのrbenvプラグインでは1.9.3までしかなかった 2014/01/25)

まとめ

  • yumで依存パッケージをインストール
  • rbenv撮ってきて、グループ設定
  • rbenvにruby-buildをpluginとして入れる
  • rubyをインストール
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ sudo yum install --enablerepo=epel -y make gcc zlib-devel openssl-devel readline-devel ncurses-devel gdbm-devel db4-devel libffi-devel tk-devel libyaml-devel
$ cd /usr/local/
$ sudo git clone git://github.com/sstephenson/rbenv.git rbenv
$ sudo groupadd rbenv
$ sudo chgrp -R rbenv rbenv
$ sudo chmod -R g+rwxXs rbenv
$ mkdir rbenv/plugins
$ cd rbenv/plugins
$ sudo git clone git://github.com/sstephenson/ruby-build.git
$ sudo chgrp -R rbenv ruby-build/
$ sudo chmod -R g+rwxs ruby-build/
$ sudo vim /etc/profile.d/rbenv.sh

export RBENV_ROOT="/usr/local/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

$ sudo source /etc/profile.d/rbenv.sh
$ rbenv install --list
$ rbenv install 〇〇
$ rbenv rehash
$ rbenv versions
$ rbenv global 〇〇
$ ruby -v

参考

CentOSでsystem wideなrbenv+ruby-build環境を構築する

rbenv と ruby-build で Ruby をインストールして管理 〜 CentOS6

CUDAの基礎,メモ

Published on:
Tags: CUDA, GPGPU

1. CUDAとは

  • 統合開発環境
  • GPUコンピューティング向け
  • NVIDIAのGeForceシリーズのGPUが搭載されている必要あり

2. キーワード

2.1 スレッド(Thread)

  • 実行単位
  • 基本、それぞれのスレッドが非同期で動く

    2.2 ブロック(Block)

  • スレッドをまとめたもの
  • 合計512スレッドまで
  • スレッドの組み合わせは3次元表現まで可能(512,16*16,8*8*8)

    2.3 グリッド(Grid)

  • ブロックをまとめたもの
  • 合計65,535ブロックまで
  • ブロックの組み合わせは2次元で表現

グリッド、ブロック、スレッドの関係

2.4 カーネル(Kernel)

  • GPU側に実行させるプログラムのこと
  • このプログラムを書くことをカーネルプログラミングと言う
  • カーネルプログラミングをする際、独自の変数と予約語がある

2.4.1 threadIdx.〇〇

  • thread index の略?
  • カーネルが動作しているスレッドのインデックス番号
  • 要は何番目のスレッドかわかる
  • スレッドは3次元表現までありえるので、threadIdx.x,y,zが存在

2.5 ワープ(Warp)

  • スレッドの方では、結局32スレッドずつ動く
  • 32スレッド = 1ワープ
  • よって、スレッドの処理の区切りは32ずつだと良い感じ
  • メモリ共有はワープ単位でのみ

3. ここまでのまとめ

  • ブロックあたりの最大スレッド数 = 512
  • グリッドあたりの最大ブロック数 = 65,535
  • ワープあたりのスレッド数 = 32

4. 同期処理(__synchthreads()関数)

  • 同ブロック内のスレッド全てがこの関数に到達するまで一時停止する
  • 異なるブロックでは同期はされない

5. ホスト(__host__)とデバイス(__device__)

  • CPU = ホスト
  • GPU = デバイス

5.1 __global__

  • デバイス側
  • 返り値は常にvoid型
  • 再帰は不可能
  • <<<>>>を使用した実行時の指定が可能
  • static変数はもてない
  • __global__で指定した関数へのポインタは利用可能
  • __host__と同時には無理
  • デバイス側での処理が終わる前に呼び出し側に処理が戻る
  • シェアードメモリを利用して、256byteまでのデータを渡すことが可能

5.2 __device__

  • 再帰は不可能
  • static変数はもてない
  • 可変長引数はもてない
  • __device__で指定した関数ポインタは利用できない

5.3 __host__

  • ホスト側でのみ呼び出せる
  • ホスト側の通常の関数
  • __global__と同時に使用不可
  • __device__と同時に使用可能
  • __device__と同時に使用し、ホスト側とデバイス側の両方から呼び出せる関数を作成可能
  • __host__, __device__, __global__のどれも選択肢ないとデフォルトは__host__を選択したことになる

6. 関数

6.1 krnlVecAdd<<<A, B, C, D>>>

  • A : dim3型, グリッドの中にあるブロックのサイズ
  • B : dim3型, ブロックの中にあるスレッドのサイズ
  • C : size_t型, ブロック当たり割り当てるシェアードメモリの容量を、バイト単位で指定(省略可)
  • D : ストリームの番号(省略可)
1
2
3
dim3 grid_dimension(8, 8);
dim3 block_dimension(16, 16, 16);
krnlVecAdd<<<grid_dimension, block_dimension>>>(A, B, C);
  • グリッドの中に8*8のブロックがある
  • ブロックの中に161616のスレッドがある

UbuntuにてRoRのインストールからJenkinsの利用まで

Published on:

参考のやつをそのまま試した備忘log

環境

  • Ubuntu 12.04 amd64
  • rbenv 0.4.0
  • Ruby 2.0.0
  • Ruby on Rails 4

必要な物をapt-get

1
$ sudo apt-get install build-essential git curl zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev sqlite3 libsqlite3-dev nodejs 

rbenv(0.4.0)

1
2
3
4
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ exec $SHELL

ruby-build

1
2
3
$ mkdir -p ~/.rbenv/plugins
$ cd ~/.rbenv/plugins
$ git clone git://github.com/sstephenson/ruby-build.git

Ruby(2.0.0)

1
2
3
$ rbenv install 2.0.0-p353
$ rbenv rehash
$ rbenv global 2.0.0-p353

.gemrc

1
2
$ echo "install: --no-rdoc --no-ri" >> ~/.gemrc
$ echo "update: --no-rdoc --no-ri" >> ~/.gemrc

Bundler

1
2
3
$ gem update
$ gem install bundler
$ rbenv rehash

Ruby on Rails(4.0.2)

1
2
$ gem install rails
$ rbenv rehash

アプリの作成

Testなしで作成

1
2
$ rails new circle -T
$ cd circle

userメンテ画面をscaffold

1
$ rails g scaffold user name:string age:integer

DBの作成 && テスト用DBの作成

1
2
$ rake db:migrate
$ rake db:test:clone

rails serveer起動

1
$ rails s

http://localhost:3000/ にて確認

Gemfileにrspec-railsを追記

1
2
3
4
$ vim Gemfile
group :development, :test do
  gem 'rspec-rails', '~> 2.0'
end

Gemの更新

1
$ bundle install

Rspecのセットアップ

1
$ rails generate rspec:install

.rspecの以下のように変更

1
2
3
4
#変更前
--color
#変更後
--color --format documentation

Userモデルに対して、以下のバリデーションの追加

1
2
3
4
5
6
7
8
$ vim app/models/user.rb
  validates :name,
    :presence => true,
    :length => {:maximum => 20}
  validates :age,
    :presence => true,
    :numericality => {:greater_than_or_equal_to => 0,
                      :less_than_or_equal_to => 1000}
  • name : 必須入力 && 最大文字数が20
  • age : 必須入力 && 範囲が0 – 1000

UserモデルのTestの記述

1
2
$ mkdir spec/models
$ vim spec/models/user_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# -*- coding: utf-8 -*-
require 'spec_helper'

describe User do
  context '何も入力しなかった場合' do
    subject{User.new}
    it {should_not be_valid}
    it{ should have(1).errors_on(:name) }
    it{ should have(2).errors_on(:age) }
  end

  context '名前が文字数をオーバーしている場合' do
    subject{User.new(name: 'aaaaaaaaaabbbbbbbbbbc',age: 10)}
    it {should_not be_valid}
    it{ should have(1).errors_on(:name) }
    it{ should have(0).errors_on(:age) }
  end

  context '年齢が範囲を超えている場合' do
    subject{User.new(name: 'taro',age: 1001)}
    it {should_not be_valid}
    it{ should have(0).errors_on(:name) }
    it{ should have(1).errors_on(:age) }
  end

  context '正常なデータがセットされた場合' do
    subject{User.new(name: 'taro',age: 20)}
    it {should be_valid}
  end
end

rspecの実行

1
2
3
4
5
$ bundle exec rspec
...
Finished in 0.08931 seconds
10 examples, 0 failures // <-これがでればok
...

Gemfileにcapybaraとturnipの追加

1
2
3
4
5
6
$ vim Gemfile
group :development, :test do
  gem 'rspec-rails', '~> 2.0'
  gem 'capybara' # 追記
  gem 'turnip'   # 追記
end

Gemの更新

1
$ bundle install

.rspecファイルの修正

1
2
3
4
5
$ vim .rspec
# 変更前
--color --format documentation
# 変更後
-r turnip/rspec --color --format documentation

require の下辺りに追記

1
2
3
4
5
6
Dir.glob("spec/**/*steps.rb") { |f| load f, true}

require 'capybara/dsl'
require 'capybara/rspec'
require 'turnip'
require 'turnip/capybara'

featureファイルと、stepファイルを記述

1
2
3
$ mkdir spec/features
$ vim spec/features/users.feature
$ vim spec/steps/users_steps.rb

spec/features/users.feature の中身

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# encoding: utf-8
# language: ja
機能: ユーザー管理
  ユーザー管理を行いたい。なぜならサークル活動に参加するメンバーを管理する必要があるからだ。

  シナリオ: 一覧画面から新規登録画面に移動する
    前提 ユーザー管理の一覧画面を開く
    もし "New User" リンクをクリックする
    ならば ユーザー管理の新規登録画面が表示される

  シナリオ: 登録画面で登録すると詳細画面に移動する
    前提 ユーザー管理の新規登録画面を開く
    もし "Name" に "アリス" と入力する
    かつ "Age" に "16" と入力する
    かつ "Create User" ボタンをクリックする
    ならば ユーザー管理の詳細画面が表示される

spec/steps/users_steps.rbの中身

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# encoding: utf-8

step 'ユーザー管理の一覧画面を開く' do
  visit '/users'
end

step '画面を目視' do
  save_and_open_page
end

step ':name リンクをクリックする' do |name|
  first(:link, name).click
end

step ':name ボタンをクリックする' do |name|
  first(:button, name).click
end

step 'ユーザー管理の新規登録画面が表示される' do
  current_path = URI.parse(current_url).path
  current_path.should == '/users/new'
end

step 'ユーザー管理の詳細画面が表示される' do
  current_path = URI.parse(current_url).path
  current_path.should == '/users/1'
end

step 'ユーザー管理の新規登録画面を開く' do
  visit '/users/new'
end

step ':field に :value と入力する' do |field, value|
  fill_in(field, :with => value)
end

Turnipを実行

1
$ bundle exec rspec spec/features/users.feature

Gitで管理

1
2
3
4
5
6
$ git init
$ git config --global color.ui true
$ git config --global user.email "hoge@fuga.com"
$ git config --global user.name "kanpe777"
$ git stage .
$ git commit -m "Initial commit"

Jenkins側

rbenv Pluginのインストール

  • Manage Jenkins –> Plugin Manager
  • Availableタブを選択し、RVM Pluginにチェックを入れる
  • Install without restart

Git Pluginのインストール

  • Manage Jenkins –> Plugin Manager
  • Availableタブを選択し、Git Pluginにチェックを入れる
  • Download now and install after restart
  • sudo service jenkins restart

ジョブの作成

  • top
  • New Job
  • Job name に「circle」, Build a free-style software projectにチェック
  • OKボタン
  • Souce Code Management の欄でGitを選択
  • Repository URLはcircleがある場所(pwd等で確認可能, 自分の場合は/home/vagrant/circle)
  • Build Environment欄でrbenv build wrapperにチェック
  • Implementationにruby 1.9.3-p429を記述
  • Build欄でAdd build step, Execute shell (メモリに注意)

Commandの中身

1
2
3
4
bundle install
bundle exec rake db:migrate
bundle exec rake db:test:clone
bundle exec rspec
  • Apply –> Save
  • Topにてcircleを選択して、Build Now等でbuild実行
  • 青いマークが成功、赤いマークが失敗

自動実行

  • circle ジョブを選択し、Configureでジョブの設定へ
  • Build Triggers欄にてPoll SCMにチェック
  • H/5 * * * *を記述(意味は5分毎にコミットを確認する)

Build Pipelie の可視化

  • Jobを2つ作成

    1つめ:circle_unit_test

  • Souce Code Management欄でGitを選択し、リポジトリの場所を指定(自分の場合は/home/vagrant/circle)
  • Build Triggers欄でPoll SCMを選択し、H/5 * * * *を記述
  • Build 欄でAdd build stepより、execute shellを選択し、Commandに以下を記述

Commandの中身

1
2
3
4
bundle install
bundle exec rake db:migrate
bundle exec rake db:test:clone
bundle exec rspec spec/*/*_spec.rb
  • Post-build Actions欄にてAdd post-build actionより、Trigger parameterized build on other projectsを選択
  • Projects to build 欄にcircle_integration_testと記述(事前にcircle_integration_testジョブを作成必要あり)

参考

[Ruby on Rails] Ubuntu に rbenv + Bundler で Rails 4 をインストールする

Jenkinsで小さなテストを実行してみよう(Mac OS X&Linux)

アプリケーションをデプロイしてみよう(Mac OS X&Linux)

JenkinsでJobの作成

Published on:
Tags: Jenkins

やったこと

http://localhost:8080/にて

  • New Job
  • Job name を HelloWorld
  • Build a free-style software projectにチェック
  • OKボタン
  • BuildAdd build stepにてExecute shellを選択
  • echo “Hello World” を記述
  • save

hoge

  • Build Now
  • Build Historyにて実行したjobをクリック
  • Console Output

以下を確認

1
2
3
4
5
6
Started by user anonymous
Building in workspace /var/lib/jenkins/jobs/HelloWorld/workspace
[workspace] $ /bin/sh -xe /tmp/hudson2324844114097437367.sh
+ echo Hello World
Hello World
Finished: SUCCESS

参考

Jenkinsを使ってみよう(Mac OS X&Linux)Jenkinsを使ってみよう(Mac OS X&Linux)

Vagrant上でUbuntu 12.04インストールからJenkinsを動かすまで

Published on:
Tags: Jenkins, Ubuntu

環境

  • Ubuntu 12.04 amd64
  • Vagrant 1.4.3
  • Virtual Box 4.3.6

Ubuntuのインストールからsshまで

1
2
3
4
5
$ mkdir ubuntu && cd ubuntu
$ vagrant box add ubuntu_12_amd64_jenkins http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box
$ vagrant init ubuntu_12_amd64_jenkins
$ vagrant up
$ vagrant ssh

Jenkins Debian packagesを見ながら…

Jenkinsのインストール

key

1
$ wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -

/etc/apt/source.listに指定された文字列を記述

1
2
3
$ sudo vim /etc/apt/sources.list.d/jenkins.list
以下を記述
deb http://pkg.jenkins-ci.org/debian binary/

Jenkinsのインストール

1
2
$ sudo apt-get update
$ sudo apt-get install jenkins

ポートフォワーディング 8080

1度ホスト側でVagrantfileに記述

1
2
$ vim Vagrantfile 
config.vm.network :forwarded_port, guest: 8080, host: 8080

以下が確認できたらok

1
2
3
4
5
6
7
$ vagrant reload
...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] -- 8080 => 8080 (adapter 1)
[default] Booting VM...
...

Untuntu側でjenkinsを起動

1
$ sudo service jenkins start

ホスト側で http://localhost:8080/ にアクセス

hoge