前回では Jenkins を利用して CIサーバーを構築した。今回は構築したサーバーで実際に CI を動作させてみよう。
リポジトリの作成
まずは動作させる前に、リポジトリにプログラムを登録しよう。第3回 さまざまなジョブ(1)::CIのジョブとして利用可能なRuby用のツールのインストール方法等で作成したプログラムと同じ内容のプラグラムを、リポジトリに登録する事にする。CIサーバーに設置したリポジトリに、以下のプログラムを push して欲しい。
class/Sample1.rb
class Sample1 def go(a, b, c, d, e, f, g, h) check_num = 1 out = 0 tmp1 = 10000 tmp2 = 10000 tmp3 = 10000 tmp4 = 10000 tmp5 = 10000 tmp6 = 10000 tmp7 = 10000 tmp8 = 10000 tmp9 = 10000 if a == check_num then out = out + 1 end if b == check_num then out = out + 1 end if c == check_num then out = out + 1 end if d == check_num then out = out + 1 end if e == check_num then out = out + 1 end if f == check_num then out = out + 1 end if g == check_num then out = out + 1 end if h == check_num then out = out + 1 end out += 1000 end end
class/Sample2.rb
class Sample2 def go(a, b, c, d, e, f, g, h) check_num = 2 out = 0 tmp1 = 10000 tmp2 = 10000 tmp3 = 10000 tmp4 = 10000 tmp5 = 10000 tmp6 = 10000 tmp7 = 10000 tmp8 = 10000 tmp9 = 10000 if a == check_num then out = out + 1 end if b == check_num then out = out + 1 end if c == check_num then out = out + 1 end if d == check_num then out = out + 1 end if e == check_num then out = out + 1 end if f == check_num then out = out + 1 end if g == check_num then out = out + 1 end if h == check_num then out = out + 1 end out += 1000 end end
test/sample1_test.rb
require 'test/unit' require_relative '../class/Sample1' # test for Sample1 class TestSample < Test::Unit::TestCase def test_go_1 assert_equal 1001, Sample1.new.go(1, 2, 3, 4, 5, 6, 7, 8) end def test_go_2 assert_equal 1007, Sample1.new.go(1, 1, 1, 1, 1, 1, 1, 2) end def test_go_3 assert_equal 1000, Sample1.new.go(2, 2, 2, 2, 2, 2, 2, 2) end end
Sample2クラスのテストは第3回では利用しなかった。これも登録しておこう。
test/sample2_test.rb
require 'test/unit' require_relative '../class/Sample2' # test for Sample1 class TestSample < Test::Unit::TestCase def test_go_1 assert_equal 1001, Sample2.new.go(1, 2, 3, 4, 5, 6, 7, 8) end def test_go_2 assert_equal 1007, Sample2.new.go(2, 2, 2, 2, 2, 2, 2, 1) end def test_go_3 assert_equal 1000, Sample2.new.go(1, 1, 1, 1, 1, 1, 1, 1) end end
プロジェクトの作成
次に動作確認のためのプロジェクトを作成しよう。
ログインしたら Jenkins のトップページに移動し、左メニューの「新規ジョブ作成」をクリックしよう。すると、以下のような画面に移動するので、プロジェクト名を "sample1" とし、「フリースタイル・プロジェクトのビルド」をクリックして選択して欲しい。
画面一番下の「OK」をクリックすると、以下の画面に移動する。ここでプロジェクトの詳細を設定する事になるのだが、まずは現在選択されている"General"タブの「説明」に適当な文章を入力して欲しい。
設定したら、次に「ソースコード管理」タブを開いて欲しい。"Git"を選択すると、リポジトリのURLを設定する画面になる。今回はCIサーバーとリポジトリサーバーが同一サーバーなので、「リポジトリURL」には、リポジトリのパス(/var/lib/sample.git)を入力すればオーケーだ。
次に「ビルド環境」タブを開く。renv build wrapper をチェックすると、Rubyのバージョンとインストールする gem のリストを設定する画面になる。gemのリストはデフォルトで入っている物をすべて消してしまって構わない。
次に「ビルド」タブを開き、「ビルド手順の追加」をクリックしよう。ドロップダウンリストが表示される。
ビルドに利用できる項目は色々あるのだが、今回はすべて「シェルの実行」で登録する事にしよう。以下のように4つの手順を追加して欲しい。
gem install rubocop rubocop
これは Rubocop を実行するタスクだ。最初に Rubocop をインストールし、実行している。実行する際のカレントディレクトリは、リポジトリのルートディレクトリになる。従って何もオプション無しで実行すれば、リポジトリ内の全ファイルを検査する事になる。
gem install flay flay |tee /dev/stderr |head -1|grep -q '^Total score (lower is better) = 0$'
これは Flay の実行だ。Rubocop と同じくインストール後に Flay を実行している。ただし、Flay は警告が見つかっても終了コードが0のままなので、tee や grep を利用し、警告が存在する場合には終了コードが1になるようにしている。
なお、今回は実行するタスクの中で Rubocop と Flay をインストールしているが、「ビルド環境」タブの renv build wrapper の設定画面で登録しても良い。その場合は "Preinstall gem list" に "rubocop flay" と記述すると良いだろう。
ruby test/sample1_test.rb
3番目はSample1 クラスのユニットテストだ。
ruby test/sample1_test.rb
最後はSample2 クラスのユニットテストを登録する。これで準備は完了だ。以下の画面はこれらを入力した様子だ。
内容を確認したら、画面下にある「保存」ボタンを押して欲しい。
ビルドの実行
次はいよいよビルドの実行だ。ダッシュボードからプロジェクトを選び、左メニューから「ビルドの実行」をクリックしよう。初回ビルドでは Ruby のインストールが行われるためしばらくかかるが、やがて以下のような画面になる。
左メニューの下に「ビルド履歴」という項目があるが、"#1" という行のインジケーターが赤くなっている。赤の場合はビルドが失敗してしまった事を表している。詳細を確認するために、"#1"をクリックし、左メニューの「コンソール出力」をクリックしよう。以下のような画面になる。
ここでは実際に実行された内容が表示されるが、スクロールさせて内容を確認すると、rubocop の実行で失敗している事が分かる。
プログラムの改修
すべての問題点を修正し、全ビルド項目を通過させるために、以下のようにプログラムを修正した。これらのプログラムをリポジトリに push して欲しい。
class/sample1.rb
# Sample1 class class Sample1 def initialize @check = 1 end def go(vals) out = 1000 vals.each do |val| out += 1 if val == @check end out end end
class/sample2.rb
require_relative 'sample1' # Sample class Sample2 class Sample2 < Sample1 def initialize super @check = 2 end end
test/sample1_test.rb
require 'test/unit' require_relative '../class/sample1' class TestSample1 < Test::Unit::TestCase def test_go_1 assert_equal 1001, Sample1.new.go([1, 2, 3, 4, 5, 6, 7, 8]) end def test_go_2 assert_equal 1007, Sample1.new.go([1, 1, 1, 1, 1, 1, 1, 2]) end def test_go_3 assert_equal 1000, Sample1.new.go([2, 2, 2, 2, 2, 2, 2, 2]) end end
test/sample2_test.rb
require 'test/unit' require_relative '../class/sample2' class TestSample2 < Test::Unit::TestCase def test_go_1 assert_equal 1001, Sample2.new.go([1, 2, 3, 4, 5, 6, 7, 8]) end def test_go_2 assert_equal 1007, Sample2.new.go([2, 2, 2, 2, 2, 2, 2, 1]) end def test_go_3 assert_equal 1000, Sample2.new.go([1, 1, 1, 1, 1, 1, 1, 1]) end end
主な変更点は以下の通りである。
- ファイル名を CamelCaseから snake_case に変更
- 引数を配列で渡すようにし、冗長な記述を削除
- Sample2クラスは Sample1クラスから継承するようにした
- 引数の仕様が変わってしまったので、それに伴いテストプログラムも修正
ビルドの再実行
新しいプログラムをリポジトリに登録したら、もう一度ビルドを実行してみよう。プロジェクトを選択し「ビルド実行」をクリックする。今度はインジケーターが青になるはずだ。
コンソール出力を表示してスクロールさせると、以下のように全手順がパスしている事が分かるだろう。
最後に
今回は実際にサンプルプログラムを使って、Jenkins にビルドを行わせてみた。プロジェクトの設定方法、ビルド成功時、失敗時の動作について分かって頂けたと思う。今回紹介したのはもっとも基本的な使い方であるが、Jenkins には他にもさまざまな機能やプラグインがある。たとえば一定期間ごとにビルドを行ったり、リポジトリの更新と同時にビルドを行う事等も可能だ。さらに Github等、外部のリポジトリサーバーと連携する機能もある。また、ビルドの結果を蓄積し、その内容を視覚化する機能にも優れている。Jenkins の基本動作を理解したら、それらの機能の導入にも挑戦して頂きたい。
【Ruby版】CIツール導入ガイド 目次
- 第1回 CI の概要::CI の概要と、どのようなツールが存在するのかについて紹介する
- 第2回 さまざまなタスク::CIの実行中に処理されるジョブについての概要
- 第3回 さまざまなジョブ(1)::CIのジョブとして利用可能なRuby用のツールのインストール方法等
- 第4回 さまざまなジョブ(2)::その他のツールの紹介
- 第5回 CIサーバーの構築:: GitLab を利用し、CIサーバーを構築する手順
- 第6回 CIサーバーを使ってみよう::第5回で構築した GitLab で、実際に CI を行った様子の紹介
本ブログは、Git / Subversionのクラウド型ホスティングサービス「tracpath(トラックパス)」を提供している株式会社オープングルーヴが運営しています。
エンタープライズ向け Git / Subversion 導入や DevOps による開発の効率化を検討している法人様必見!
「tracpath(トラックパス)」は、企業内の情報システム部門や、ソフトウェア開発・アプリケーション開発チームに対して、開発の効率化を支援し、品質向上を実現します。
さらに、システム運用の効率化・自動化支援サービスも提供しています。
”つくる情熱を支えるサービス”を提供し、まるで専属のインフラエンジニアのように、あなたのチームを支えていきます。
1 Comment
[…] 第6回 CIサーバーを使ってみよう:第5回で構築した Jenkins で、実際に CI を行った様子の紹介 […]