Как использовать результаты VSTest и другие плагины .NET в Jenkins Pipeline (старый рабочий процесс)?

avatar
Cosmin
3 апреля 2017 в 11:32
1625
2
1

Из-за некоторых изменений в компании мы вынуждены перейти на Jenkins в качестве инструмента непрерывной интеграции. И хотя в конце концов это не кажется плохой идеей, у нас много головной боли из-за отсутствия поддержки приложений, отличных от Java, особенно плагина Pipeline (старый рабочий процесс) и, конечно же, отсутствия у нас знаний о Jenkins. (которого на данный момент вроде нет).

node('master') 
{
    try 
    {
        stage('Checkout, restore, build') 
        {
            //Checkout the code from the repository
            git branch: '<branch_name>', credentialsId: '<credentials_ID>', url: '<repo_URL>'    

            //git clean
            bat returnStatus: true, script: 'git clean -fdx'

            //Perform dotnet restore and nuget restore
            bat returnStatus: true, script: '''for /f "tokens=*" %%a in (\'dir project.json /b /s\') do dotnet restore "%%a"
            "C:\\Users\\Administrator\\.jenkins\\workspace\\nuget.exe" restore "C:\\Users\\Administrator\\.jenkins\\workspace\\CI\\<solution_name>.sln"'''

            //Build the solution
            bat returnStatus: true, script: '"C:\\Program Files (x86)\\MSBuild\\14.0\\Bin\\msbuild.exe" /p:DebugType=full /p:platform=x64 /p:configuration=release /p:VisualStudioVersion=14.0 '
        }
    } catch(err)
    {
        currentBuild.result = 'FAILURE'
    }

    jobDsl("${env.JOB_NAME}") {
        steps {
            bat returnStatus: true, script: '"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\IDE\\CommonExtensions\\Microsoft\\TestWindow\\vstest.console.exe" "C:\\Users\\Administrator\\.jenkins\\workspace\\CI\\<path_to_tests_dll>"  /TestCaseFilter:"TestCategory=UnitTest|TestCategory=ContinuousTest" /EnableCodeCoverage /Platform:x64 /logger:trx'
        }
        publishers {
            archiveXUnit {
                msTest {
                    pattern('"C:\\Users\\Administrator\\.jenkins\\workspace\\CI\\TestResults"')
                }
            }
        }
    }
}

Но я получаю ошибки для jobDsl:

java.lang.IllegalArgumentException: Ожидались именованные аргументы, но [CI, org.jenkinsci.plugins.workflow.cps.CpsClosure2@1a706730] по адресу org.jenkinsci.plugins.workflow.cps.DSL.parseArgs(DSL.java:442) по адресу org.jenkinsci.plugins.workflow.cps.DSL.invokeDescribable(DSL.java:251) на org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:129) в org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:108) в groovy.lang.GroovyObject$invokeMethod.call(неизвестный источник) в org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) в org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) на org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:151) в org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:21) в org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:115) в org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:103) на org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:149) в org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:146) в com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:16) в WorkflowScript.run(WorkflowScript:1) в cps.transform(собственный метод) в com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57) в com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109) в com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:82) в sun.reflect.GeneratedMethodAccessor295.invoke(неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke(неизвестный источник) в java.lang.reflect.Method.invoke (неизвестный источник) в com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72) в com.cloudbees.groovy.cps.impl.ClosureBlock.eval(ClosureBlock.java:46) в com.cloudbees.groovy.cps.Next.step(Next.java:74) в com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:154) в org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18) в org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:33) в org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:30) в org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108) в org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:30) в org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:165) в org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:328) в org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:80) в org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:240) в org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:228) в org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64) в java.util.concurrent.FutureTask.run (неизвестный источник) в hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) в jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) в java.util.concurrent.Executors$RunnableAdapter.call(Неизвестно Источник) в java.util.concurrent.FutureTask.run(неизвестный источник) в java.util.concurrent.ThreadPoolExecutor.runWorker (неизвестный источник) в java.util.concurrent.ThreadPoolExecutor$Worker.run(неизвестный источник) в java.lang.Thread.run(Неизвестный источник)

Это действительно заставляет меня думать, что это не очень хороший подход, поэтому может ли кто-нибудь пролить немного света и направить меня на правильный путь?

Источник

Ответы (2)

avatar
daspilker
3 апреля 2017 в 15:00
1

Вы не можете смешивать Pipeline DSL и Job DSL. Это совершенно разные вещи.

Плагин XUnit имеет встроенную поддержку Pipeline DSL, начиная с версии 1.100, подробности см. в JENKINS-27240. Таким образом, вам не нужно пытаться внедрить сценарий Job DSL в сценарий Pipeline.

avatar
Aviram Fireberger
3 марта 2019 в 08:11
0

Мне удалось сделать это с помощью класса "MSTestPublisher",

Итак, последний конвейер:

node {
stage 'Checkout'
    checkout scm

stage 'Build'
    bat "\"C:/Program Files/dotnet/dotnet.exe\" restore \"${workspace}/MyProg.sln\""
    bat "\"C:/Program Files/dotnet/dotnet.exe\" build \"${workspace}/MyProg.sln\""

stage 'UnitTests'
    bat returnStatus: true, script: "\"C:/Program Files/dotnet/dotnet.exe\" test \"${workspace}/MyProg.sln\" --logger \"trx;LogFileName=unit_tests.xml\" --no-build"
    step([$class: 'MSTestPublisher', testResultsFile:"**/unit_tests.xml", failOnError: true, keepLongStdio: true])
}

Я загрузил несколько примеров, которые я сделал, на свой GitHub, чтобы каждый мог использовать и внести свой вклад, не стесняйтесь взглянуть:

https://github.com/avrum/JenkinsFileFor.NETCore

Этот файл jenkinsfile добавит этот шаблон конвейера в вашу сборку:

Example Jenkins Pipeline|Solid