周回遅れでIT業界デビューしたエンジニアのブログ

就職氷河期にモロにぶち当たり、人生で混迷を極めた末にIT業界に安寧を見出そうとしているアラフォーのお勉強日記です。

Jenkins+Seleniumで自動テスト。さらにPipeline+Groovyを使ってジョブをまとめて処理しよう

f:id:sionff:20171222154007j:plain

Jenkinsで複数のビルドを連続して起動するさい、Pipelineで制御するために環境を構築してみました。

ちなみに私のレベルはというと……

Jenkinsをマスタ(本体)とスレーブ(仮想環境)でノード接続してスレーブに仕事させたり、そのスレーブ側でSelenium実行させて(例えばサイトのキャプチャを取る)結果を取得して本体に返して、その制御をPythonで書いたりできる程度です。

お品書き

  • Jenkinsとは
  • Seleniumとは
  • 今回やろうとしたこと
  • Jenkinsでノードを設定だ
  • Pipelineで使うGroovyって何?
  • Pipelineの詰まりどころ

Jenkinsとは

ミドルウェアで、自動実行したりしてくれる便利もの。繰り返しに強いです。
ShellScriptのcronみたいに定時実行ができるので、
「毎日決まった時間に自動で静的解析や単体テスト
「毎日決まった時間に自動でデプロイ」

などやってくれます。

geechs-magazine.com
入門者向けにちょっと探してみたら、これが分かりやすかったです。
仕事が楽になるよ!

Seleniumとは

Webアプリケーションのテストツールです。
コードを書けば、

  • Webアプリケーションのテスト
  • キャプチャを撮ったり
  • フォームの入力欄に所定の文字を入れてEnterしたり
  • スクレイピングしたり

といったことをSeleniumが自動でしてくれます。便利!

IDE版もあるのですが、コードから動かす方が一般的かも。
JavaPythonRubyC#JavaScript(Node)に対応しています。

Seleniumを動かすときは各ブラウザのWebdriverが必要になるので、一緒にダウンロードしておきましょう。

12/25追記:コードを書く際のよいリファレンスが見つかりましたわぁい

今回やろうとしたこと

  • マスタ(本体、Win)Jenkins
  • スレーブ(仮想環境、Win)Selenium

を用意。
ざっくりと流れを書いておくと、

  1. マスタのジョブからスレーブを動かして
  2. マスタ側でごにょごにょやったものを共有フォルダに置いて
  3. スレーブ側で↑を受け取ってから、Seleniumを使って特定のサイトのキャプチャを取って
  4. マスタが用意した共有フォルダにキャプチャを置いて
  5. マスタ側がそのキャプチャを受け取ってうんたらかんたら

という流れ。

Jenkinsでノードを設定だ

マスタとスレーブをノードでつなぐのが初心者にとっては鬼門だと思われます。
この辺の記事が分かりやすくてお勧めです。

大事なのは、スレーブ側のブラウザから、マスタ側のJenkinsを開いて「slave-agent.jnlp」をダウンロードした後に実行すること。(これが逆だと上手く行きません……)

Pipelineで使うGroovyって何?

今回は処理を小分けにしたので、ジョブが複数になりました。進捗を可視化したかったのもあるので、Pipelineの処理をGroovyという言語で書きました。

参考にしたのはこの辺り。
Groovyという言語を使ってスクリプトを組んで制御します。

Groovy自体はざっくり言うと「Javaベースのスクリプト言語」です。コンパイルが不要で簡潔に書けるのが大きな特徴。Javaに慣れていれば簡単な処理ならすぐコードが書けますよ。

node('master'){
	stage('1つめの処理だよ'){
		build job: 'hogefuga'
	}
}
node('slave'){
	stage('2つめの処理でごわす'){
		build job: 'fugamoge'
	}
}

...

node('master'){
	stage('X番目の処理ですわよ'){
		build job: 'peropero'
	}
}

Pipelineを書くときは、「Declarative Pipeline」と「Scripted Pipeline」と二通り書き方がある(ざっくり言うと書き出しや中身の構造が違う)のですが、Scripted Pipelineはあまりお勧めされていない&詰まりやすいのもあるらしく、慣れてきたらDeclarativeの書き方をメインにするといいと思います。

Groovyの詳しい文法などはこちらもどうぞ。

Pipelineの詰まりどころ

  1. マスタでジョブ実行
  2. スレーブでジョブ実行
  3. マスタでジョブ実行

の順なのですが、2のスレーブでジョブ実行させるときに、
いつまでも「Waiting for next available executor」で動きませんでした。

ノードの設定のところで「同時ビルド数」が1だったのが原因でした。
スレーブでジョブ実行するときは、パイプラインの分のジョブもスレーブ側で動かすために、「パイプライン分のジョブ + 本来動かしたいジョブ」の2つ分、同時にビルドする必要があるということでした。単純!

後は、ジョブ名が日本語だと失敗するみたいですので、ジョブ名は英語オンリーにしておくのが無難です……!

おわりに

慣れてくるまでは本当に面倒だし意味不明なのですが、上手く動作するとかなり感動します!
エンジニアの方でしたら自動テストや自動デプロイなどでJenkinsやSeleniumにお世話になると思うので、自分でも組めるようになっておくと色々助かると思われます。

DevOpsってこういうことか……!と分かった気になれますのでぜひ。