Jenkins PipelineでテストJobの実行 (Selenium)

## 概要
Seleniumのテストコードを複数作成した場合、どうやってJenkinsで定期実行するかを調べたのでメモしておく。

## ファイル構成
下記のようなファイルの構成で作成する。

```:ファイル一覧
├ groovy
│  ├ script
│  │ └ slack.groovy
│  └ Jenkinsfile
└ python
   ├ test001-hoge.py
   └ test002-fuga.py
```

## 実行環境
DoｃkerのJenkins(公式)コンテナにpython3を追加したものを利用することにします。

```Dockerfile:Dockerfile
FROM jenkins
USER root

# system update
RUN apt-get update

# locale
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

# timezone (Asia/Tokyo)
ENV TZ JST-9

# etc
ENV TERM xterm

# add tools to work.
RUN apt-get install -y vim less

# python3 install
RUN apt-get install -y python3 python3-pip
RUN apt-get -f install
RUN apt-get install -y libnss3-tools libnss3 libnss3-dbg libnss3-dev
RUN apt-get install -y libgconf2-4 libxss1
RUN apt-get install -y fonts-liberation libappindicator1 xdg-utils

# selenium install
RUN pip3 install selenium
```

## Slack通知メソッド作成
下記の投稿に作り方がありますのでそちらを参照ください。

* [Jenkins PipelineでSlackへ通知する](https://qiita.com/reflet/items/caa82853e7d1b1045613)

## Jenkinsfile作成

```groovy:Jenkinsfile
#!/usr/bin/env groovy

pipeline {
    agent any
    environment {
        TEST_ENV='testing'
    }
    options {
        timeout(time: 1, unit: 'HOURS')
    }
    stages {
        stage('Seleniumテスト') {
            parallel {
                stage('シナリオ-001') {
                    steps {
                        script {
                            retry(5) {
                                sh "python3 ${pwd()}/python/test001-hoge.py"
                            }
                        }
                    }
                }
                stage('シナリオ-002') {
                    steps {
                        script {
                            retry(5) {
                                sh "python3 ${pwd()}/python/test002-fuga.py"
                            }
                        }
                    }
                }
            }
        }
    }
    post {
        success {
            echo 'All Test OK'
        }
        failure {
            script{
                slack = load "${pwd()}/groovy/script/slack.groovy"
                slack.post('danger', 'FAIL')
            }
        }
    }
}
```

## 参考サイト(pipeline plugin)
* [Jenkins Pipeline](https://jenkins.io/doc/book/pipeline/)
* [Jenkins Pipeline Syntax](https://jenkins.io/doc/book/pipeline/syntax/)
* [Post-steps in Jenkins declarative pipeline](https://mtarnawa.org/2017/06/25/post-steps-in-jenkins-declarative-pipeline/)
* [Jenkinsの設定を最小限でJenkinsfile(Pipeline)を使う](https://qiita.com/comefigo/items/fc7aad310235caf89fcd)
* [使ってみよう！Jenkins 「Pipeline」](https://qiita.com/miyasakura_/items/9d9a8873c333cb9e9f43)
* [jenkinsのpipeline入門(jenkinsfile)](http://kimulla.hatenablog.com/entry/2017/01/31/002055#%E5%A4%B1%E6%95%97%E3%81%97%E3%81%A6%E3%82%82%E5%87%A6%E7%90%86%E3%82%92%E7%B6%99%E7%B6%9A%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88)
* [Declarative PipelineでJenkinsfileを書いてみた](https://qiita.com/Takumon/items/e266146c225d07b82c13)
* [Jenkins PipelineでYamlを設定ファイルとして使う方法](https://qiita.com/Takumon/items/01aa2855aa8b289286a4)

## 参考サイト(Multijob plugin)
* [Jenkins Multijob Plugin](https://wiki.jenkins.io/display/JENKINS/Multijob+Plugin)
* [Jenkinsで複数ジョブを実行するプラグイン「Multijob plugin」](https://qiita.com/daijinload/items/d54e492cfd67a45688ce)