【Ruby版】CIツール導入ガイド 第6回 CIサーバーを使ってみよう

By 2019-01-17 DevOps

前回では 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ツール導入ガイド 目次


本ブログは、Git / Subversionのクラウド型ホスティングサービス「tracpath(トラックパス)」を提供している株式会社オープングルーヴが運営しています。

エンタープライズ向け Git / Subversion 導入や DevOps による開発の効率化を検討している法人様必見!

tracpath(トラックパス)」は、企業内の情報システム部門や、ソフトウェア開発・アプリケーション開発チームに対して、開発の効率化を支援し、品質向上を実現します。
さらに、システム運用の効率化・自動化支援サービスも提供しています。
”つくる情熱を支えるサービス”を提供し、まるで専属のインフラエンジニアのように、あなたのチームを支えていきます。

クラウド型バグ管理・バージョン管理ソフトの「tracpath(トラックパス)」を提供しているオープングルーヴが運営しています

You Might Also Like

1 Comment

Leave a Reply

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください