(Google+)446446件のシェア(そこそこ話題の記事)この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。今回の課題こんにちは植木和樹です。7月にserverspecを使ったChefの自動テストのエントリを書きました。【AWS】JenkinsとserverspecでChefのテストを自動化するこのエントリは初めてJenkinsを触った時に書いたので、いろいろと流儀がわかっていませんでした。その後弊社にJenkinsマイスターの渡辺修司さんが入社したということで、Jenkinsの設定について見てもらいました。その時に次の6点を見直すよう指摘がありました。hookを入れるべしなるほど参考になります。それでは1つずつ見直していきたいと思います。serverspec実行」「EC2終了」をそれぞれ別のジョブとして設定し、先行ジョブ完了後に「ビルド後の処理」として後続ジョブをキックしています。この構成だとジョブが無闇に増えてしまい管理しづらくなってしまうそうです。pull」というのはそれ自体に意味のあるジョブの単位ではありません。ジョブは意味ある単位にまとめ、その中のひとくくりの処理は「ビルド手順」という単位で分けるのが良いようです。いうことで、これまで4つに分かれていたジョブを1つにまとめることにします。変更後の内容は次のシェルスクリプトの見直しとあわせて紹介します。ジョブで実行するシェルスクリプトもgitから取得すべしこれまではJenkinsの[ビルド]-[シェルの実行]のところにシェルスクリプトを直接記述していたわけですが、このままだとこのシェルスクリプト自体の変更が記録できません。修正するたびに毎回Jenkinsの画面をブラウザで開くのも面倒です。そこで、テキストエリアに書いていたシェルスクリプトをそのままファイルに保存し、chefやserverspecと同じgitリポジトリに保存します。Jenkinsではこのシェルスクリプトを実行するだけコマンドを記述します。jenkins-shell/0101_serverspec_run-instance.sh0102_serverspec_bootstrap.sh0103_serverspec_terminate-instance.shシェルスクリプトをJenkinsから実行するにあたって注意点が2つあります。これまでは実行したシェルスクリプトがそのまま「コンソール出力」に表示されていました。これをシェルスクリプトファイルを実行するだけにすると「シェルスクリプトの呼び出した処理」だけが出力されます。これだとシェルスクリプト内部でどこまで実行されたかが分からず、あとから結果を見なおした際に原因が分からず困ります。そこで-xオプションをつけてシェルの実行経過も出力されるようにしておきましょう。2つ目はJenkinsが設定する環境変数をシェルスクリプト内で扱う場合です。ワークスペースのディレクトリパスを保持する$WORKSPACEを使う場合、そのままではシェルスクリプト内で参照できません。WORKSPACEしておく必要があります。EC2の起動に失敗したら後続処理を停止させるべしJenkinsは呼び出したシェルスクリプトが失敗すると、後続のシェルスクリプトは実行せずジョブ自体は失敗にします。EC2が問題なく起動したかどうかの処理はシェルからみると正常にコマンドが終了しているため、起動に失敗した時には非ゼロを返すようにします。${STATUS}serverspecの実行結果はJUnit(XML)形式で出力すべしJenkinsはJUnitが出力するテスト結果が記述されたXMLを読み込み、整形して出力する機能を標準で持っています。ところがserverspec(RSpec)は標準でJUnit形式のXMLを出力することができません。そこで次のページで紹介されているrubyスクリプトを読み込んでJUnit形式で出力できるようにします。Jenkinsこのページにあるjunit.rbをRakefileと同じディレクトリに保存します。serverspecを実行しているシェルスクリプトを修正し、rakeにrspecのコマンドオプションを指定します。'builder'しているため、Jenkinsを動かすEC2にgemをインストールしてください。--no-rdocジョブを実行するとRakefileと同じディレクトリにresults.xmlというファイルが出力されます。次にジョブ終了後にこのXMLをJekinsで読み込む設定をしましょう。実行結果のXMLをJenkinsで読み込んで統計グラフを出力すべしJenkinsの設定は簡単です。[ビルド後の処理]で"JUnitテスト結果の集計"を選択し、[テスト結果XML]にresults.xmlと入力して保存します。ビルドを実行した後にジョブのページを開くと最近のテスト件数と成功数・失敗数がグラフで表示されるようになりました。hookを入れるべしgitリポジトリにpushされた時にJenkinsのビルドがキックされるようにフックを設定します。これまではJenkinsにgitリポジトリのURLとブランチ名を指定していましたが、gitフックを使うとgitリポジトリからJenkinsに対してgitリポジトリのURLと取得させるリビジョンを渡すことができます。Jenkins側ではリポジトリの設定が不要になります。次にgitリポジトリ側を設定します。Jenkins"フックを有効にします。設定画面でJenkinsのビルド実行URLと、Jenkinsに伝えるgitリポジトリのURLを設定します。URLssh://git@gitserver.example.com/path/ops-cookbooks.gitJenkinsの画面を開きながらgitリポジトリにpushすると、「ビルド履歴」のところが待機状態に変わります。してジョブが実行されれば設定完了です。まとめ今回はJenkinsの使い勝手をよくするために、いろいろと設定を見直してみました。これまで定期的にEC2インスタンスを立ち上げてテストを実行していた箇所をpushフックを使うようにしたため、無駄なインスタンス起動がなくなりAWSのインスタンス課金が減ってコスト削減にもなっています。Jenkinsをいろいろ触っていると本当によくできたツールだなと思います。設定画面は一見シンプルですが、他システムとの連携やレポート機能、セキュリティやバックアップといったメンテナンス機能など、プラグインも含めてやりたいことができる仕組みが一通りそろっていて便利です。今回の見直しでは手をつけませんでしたが、Jenkinsにはテストに失敗した時に通知したり、チケット管理システムと連携したりする機能もあるそうです。今後はその辺の見直しも行ってみたいですね。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。カフェ店長のオカノです。今日はオフィスに用があるので、通勤ラッシュを避けて出社しました。この子は新メンバーのさめくんです。在宅勤務が推奨されているのでオフィスが閑散としており、すこしさみしそうです。使いたいときの注意点を書きました。本が出ていたので読んでみたところよかったので紹介させていただきます。