在 Jenkins 中透過 Docker 自動執行 NUnit 測試並顯示測試報告

筆者的 Jenkins 是部屬在 Docker 上,不像其他大多數範例是放在 Windows 中。好在自 DotNet Core 之後到現在的 DotNet 就是跨平台,雖然在 Linux 中還是偶爾會遇到一點小挑戰,不過要能夠正常運作還真不是什麼問題。

簡單來說就是使用 dotnet sdk 的 Docker ,在內部執行測試,跑完後再將測試報告塞給外部的 Jenkins 匯入。

NUnit

先使用 NuGet 安裝 Swashbuckle.AspNetCore 套件,或是使用 .NET CLI 執行以下指令安裝
	
dotnet add package NunitXml.TestLogger
    

執行測試時就可以產出 nunit xml 的報表(不然只能 trx;LogFileName=TestResult.trx),方便 Jenkins 的 NUnit 套件讀取
    
dotnet test --logger "nunit;LogFileName=TestResult.xml" --results-directory /test_results
    

最簡單 Dockerfile 範例:
    
FROM mcr.microsoft.com/dotnet/sdk:6.0
WORKDIR /app

COPY *.csproj .
RUN dotnet restore

COPY . .

RUN dotnet test --logger "nunit;LogFileName=TestResult.xml" --results-directory /test_results || true

ENTRYPOINT ["tail", "-f", "/dev/null"]
    

Jenkins

在 Jenkins 中安裝 NUnit 套件,然後使用 pipeline,撰寫 Jenkinsfile

最簡單 Jenkinsfile 範例:
    
pipeline {
    agent any
   
    environment {
        DOCKER_IMAGE = "my_image"
        BUILD_NUMBER = "0.0.1"
        DOCKER_CONTAINER = "my_container"
    }
    
    stages {
        stage('Get commit details') {
            steps {
                script {
                    env.GIT_COMMIT_MSG = sh (script: 'git log -1 --pretty=%B ${GIT_COMMIT}', returnStdout: true).trim()
                    env.GIT_AUTHOR = sh (script: 'git log -1 --pretty=%cn ${GIT_COMMIT}', returnStdout: true).trim()
                }
                
            }
        }

        stage('Build and Test')
        {
            steps {
                sh 'docker build -t ${DOCKER_IMAGE}:${BUILD_NUMBER} .'
                sh 'docker run -d --name ${DOCKER_CONTAINER} ${DOCKER_IMAGE}:${BUILD_NUMBER}'
                
                sh 'mkdir -p test_results'
                sh 'docker cp ${DOCKER_CONTAINER}:/test_results/TestResult.xml ./test_results/TestResult.xml'
                
                sh 'docker stop ${DOCKER_CONTAINER}'
                sh 'docker rm -f ${DOCKER_CONTAINER} || true'
                sh 'docker rmi ${DOCKER_IMAGE}:${BUILD_NUMBER} || true'
            }
        }
    }
    
    post {
        always {
            nunit testResultsPattern: 'test_results/TestResult.xml'
        }
    }
    
}
    

如此如此,就可以在 Jenkins 中看到包含成功和失敗的測試結果了!

參考資料:
Microsoft - dotnet test
Jenkins plugins - NUnit

留言