仕事でJenkinsとSeleniumを組み合わせて使う機会がありまして。
複数ジョブを制御するのにPipelineが良さそうだということで、自分でも触ってみました。
ちなみに私のレベルはというと……
Jenkinsをマスタ(本体)とスレーブ(仮想環境)でノード接続してスレーブに仕事させたり、そのスレーブ側でSelenium実行させて(例えばサイトのキャプチャを取る)結果を取得して本体に返して、その制御をPythonで書いたりできる程度です。
お品書き
- Jenkinsとは
- Seleniumとは
- 今回やろうとしたこと
- Jenkinsでノードを設定だ
- Pipelineで使うGroovyって何?
- Pipelineの詰まりどころ
Jenkinsとは
ミドルウェアで、自動実行したりしてくれる便利もの。繰り返しに強いです。
ShellScriptのcronみたいに定時実行ができるので、
「毎日決まった時間に自動で静的解析や単体テスト」
「毎日決まった時間に自動でデプロイ」
などやってくれます。
geechs-magazine.com
入門者向けにちょっと探してみたら、これが分かりやすかったです。
仕事が楽になるよ!
Seleniumとは
Webアプリケーションのテストツールです。
コードを書けば、
- Webアプリケーションのテスト
- キャプチャを撮ったり
- フォームの入力欄に所定の文字を入れてEnterしたり
- スクレイピングしたり
といったことをSeleniumが自動でしてくれます。便利!
- [ThinkIT] 第1回:Webブラウザを使ったテストツールSeleniumとは (1/3)
- Python: selenium でFirefoxを操作する - Qiita
- SeleniumとWebDriverの最新事情~標準化が進み、さらに強力なテストツールへ! その影でSelenium IDEは…… (1/3):CodeZine(コードジン)
IDE版もあるのですが、コードから動かす方が一般的かも。
Java、Python、Ruby、C#、JavaScript(Node)に対応しています。
Seleniumを動かすときは各ブラウザのWebdriverが必要になるので、一緒にダウンロードしておきましょう。
今回やろうとしたこと
- マスタ(本体、Win)Jenkins
- スレーブ(仮想環境、Win)Jenkins、Selenium
を用意。
ざっくりと流れを書いておくと、
- マスタのジョブからスレーブを動かして
- マスタ側でごにょごにょやったものを共有フォルダに置いて
- スレーブ側で↑を受け取ってから、Seleniumを使って特定のサイトのキャプチャを取って
- マスタが用意した共有フォルダにキャプチャを置いて
- マスタ側がそのキャプチャを受け取ってうんたらかんたら
という流れ。
Jenkinsでノードを設定だ
マスタとスレーブをノードでつなぐのが初心者にとっては鬼門だと思われます。
この辺の記事が分かりやすくてお勧めです。
大事なのは、スレーブ側からマスタ側のJenkinsを開いて「slave-agent.jnlp」をダウンロードした後に実行すること。(これが逆だと上手く行きません……)
Pipelineで使うGroovyって何?
今回は処理を小分けにしたので、ジョブが複数になりました。進捗を可視化したかったのもあるので、Pipelineの処理をGroovyという言語で書きました。
参考にしたのはこの辺り。
Groovyという言語を使ってスクリプトを組んで制御します。
- 使ってみよう!Jenkins 「Pipeline」 - Qiita
- jenkinsのpipeline入門(jenkinsfile) - SIerだけど技術やりたいブログ
- Jenkinsのpipelineのスクリプトの書き方まとめ - ぴよぴよ.py
Groovy自体はざっくり言うと「Javaベースのスクリプト言語」です。コンパイルが不要で簡潔に書けるのが大きな特徴。Javaに慣れていれば簡単な処理ならすぐコードが書けますよ。
node('master'){ stage('1つめの処理だよ'){ build job: 'hogefuga' } } stage('進行チェック'){ input "進めていいですか?" } node('slave'){ stage('2つめの処理でごわす'){ build job: 'fugamoge' } } stage('進行チェック'){ input "進めていいですか?" } node('master'){ stage('3つめの処理ですわよ'){ build job: 'peropero' } }
Pipelineを書くときは、「Declarative Pipeline」と「Scripted Pipeline」と二通り書き方がある(ざっくり言うと書き出しや中身の構造が違う)のですが、Scripted Pipelineはあまりお勧めされていない&詰まりやすいのもあるらしく、慣れてきたらDeclarativeの書き方をメインにするといいと思います。
Groovyの詳しい文法などはこちらもどうぞ。
Pipelineの詰まりどころ
- マスタでジョブ実行
- スレーブでジョブ実行
- マスタでジョブ実行
の順なのですが、2のスレーブでジョブ実行させるときに、
いつまでも「Waiting for next available executor」で動きませんでした。
ノードの設定のところで「同時ビルド数」が1だったのが原因でした。
スレーブでジョブ実行するときは、パイプラインの分のジョブもスレーブ側で動かすために、「パイプライン分のジョブ + 本来動かしたいジョブ」の2つ分、同時にビルドする必要があるということでした。単純!
後は、ジョブ名が日本語だと失敗するみたいですので、ジョブ名は英語オンリーにしておくのが無難です……!
おわりに
慣れてくるまでは本当に面倒だし意味不明なのですが、上手く動作するとかなり感動します!
エンジニアの方でしたら自動テストや自動デプロイなどでJenkinsやSeleniumにお世話になると思うので、自分でも組めるようになっておくと色々助かると思われます。
DevOpsってこういうことか……!と分かった気になれますのでぜひ。