LoginSignup
3
7

More than 5 years have passed since last update.

Jenkins2のPipelineでUnityのユニットテスト結果をgithubに通知する

Last updated at Posted at 2016-11-22

Jenkins2で標準機能になったPipelineを使って、
Unityの自動テストを複数ブランチで動かして、
結果をgithubに通知するところまでやってみました。
簡単に紹介します。

Jenkinsの環境

UnityがインストールされたmacOS

Jenkinsプラグイン

  • NUnit Plugin
  • GitHub Plugin

GitHub APIの認証設定

システム設定画面から、
1. GitHub → GitHub Server → API URLをhttps://api.github.com
2. 高度な設定 → Additional actions → Convert login and password to token
3. From login and password → githubのアカウント情報入力
4. Create token credentials

これで認証情報が作成されるので、Credentialsで選択。
Test connectionを押して認証できれば設定完了

Jenkinsのジョブの作成

  • Multibranch PipelineかPipelineでジョブを作成
  • リポジトリの情報を入力

ユニットテスト用のシェルスクリプト作成

Unityのユニットテストをbatchmodeで動かすスクリプトです。
Unityのプロジェクトの場所をhogeとしてます。
作成したスクリプトをルートに設置します。

unit_test_run.sh
#!/bin/sh
set -e

UNITY_PATH="/Applications/Unity/Unity.app/Contents/MacOS/Unity"
RESULT_PATH=$(cd $(dirname $0) && pwd)
PROJECT_PATH="${RESULT_PATH}/hoge"


${UNITY_PATH} -quit -batchmode \
              -runEditorTests \
              -projectPath ${PROJECT_PATH} \
              -editorTestsResultFile $RESULT_PATH

テスト結果のコードは
0 - テスト成功
2 - テスト失敗
3 - 失敗
となります

Jenkinsfileの作成

先ほど作成したスクリプトを走らせて、結果を通知します。
ルートにJenkinsfileを作成してgithubにPushします。

Jenkinsfile
#!groovy

node {
    stage("SETUP") {
        env.WORKSPACE=pwd() + "@script";
    }

    stage("UNIT TEST") {
        dir (env.WORKSPACE) {
            result = sh(script: "**/unit_test_run.sh", returnStatus: true)
            step[$class: 'NUnitPublisher', 
                 testResultsPattern: '**/EditorTestResults.xml',                          
                 debug: false, 
                 keepJUnitReports: true,                   
                 skipJUnitArchiver: false, 
                 failIfNoResults: true])
        }
    }

    stage("NOTIFY") {
        def state = "ERROR"
        switch (result) {
            case 0:
                state = "SUCCESS"
                break
            case 2:
                state = "FAILURE"
                break
            default:
                break
        }

        step([$class: 'GitHubCommitStatusSetter',
              statusResultSource: [$class: 'ConditionalStatusResultSource',
                                   results: [[$class: 'AnyBuildResult', message: '', state: state]]]])
    }
}

returnStatus : trueにすると結果を変数で受け取れるので、
結果のコードからテスト結果をgithubに通知します。

Multibranch Pipelineでジョブを作成すると、
Jenkinsfileが存在するブランチ毎にジョブが作成され、
コミット単位で変更を検知してJenkinsfileの内容を走らせてくれます。
※ブランチが削除されるとジョブも削除されます。

Jenkinsはあまり詳しくないので、
間違いやここをこうしたほうがいい等あればご指摘お願いします。

参考記事

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7