Jenkins – ¿Cómo publico el informe de cobertura a github

Estoy tratando de usar github-pr-coverage-status-plugin , la documentation dice que necesito ejecutar lo siguiente en mi twig principal:

paso ([$ class: 'MasterCoverageAction'])

Pero cuando agrego esto a mi canalización obtengo el siguiente error:

java.lang.UnsupportedOperationException: Can't find GIT_URL or CHANGE_URL in envs: {BRANCH_NAME=master, BUILD_DISPLAY_NAME=#41, BUILD_ID=41, BUILD_NUMBER=41, BUILD_TAG=jenkins-testci-master-41, BUILD_URL=https://jnkns-ci.myserver.com/job/testci/job/master/41/, CLASSPATH=, HUDSON_HOME=/var/jenkins_home, HUDSON_SERVER_COOKIE=01f6aedeea333d1f, HUDSON_URL=https://jnkns-ci.myserver.com/, JENKINS_HOME=/var/jenkins_home, JENKINS_SERVER_COOKIE=01f6aedeea333d1f, JENKINS_URL=https://jnkns-ci.myserver.com/, JOB_BASE_NAME=master, JOB_DISPLAY_URL=https://jnkns-ci.myserver.com/job/testci/job/master/display/networkingirect, JOB_NAME=testci/master, JOB_URL=https://jnkns-ci.myserver.com/job/testci/job/master/, RUN_CHANGES_DISPLAY_URL=https://jnkns-ci.myserver.com/job/testci/job/master/41/display/networkingirect?page=changes, RUN_DISPLAY_URL=https://jnkns-ci.myserver.com/job/testci/job/master/41/display/networkingirect} at com.github.terma.jenkins.githubprcoveragestatus.PrIdAndUrlUtils.getGitUrl(PrIdAndUrlUtils.java:85) at com.github.terma.jenkins.githubprcoveragestatus.MasterCoverageAction.perform(MasterCoverageAction.java:71) at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:80) at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:67) at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution$1$1.call(SynchronousNonBlockingStepExecution.java:49) at hudson.security.ACL.impersonate(ACL.java:260) at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution$1.run(SynchronousNonBlockingStepExecution.java:46) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Finished: FAILURE 

He intentado varias forms de inyectar estas variables. En mi último bash, incluso miré el código fuente de esta class , así que cambié mi canalización para ser:

 pipeline { agent any options { skipDefaultCheckout() } environment { // calling cnetworkingentials() actually sets 3 environment variables // GIT_HUB with <username>:<password> // GIT_HUB_USER with <username> // GIT_HUB_PSW with <password> GIT_HUB = cnetworkingentials('tmhjenkins') DOCKER_REPO = 'mobilityhouse' DOCKER_HUB = cnetworkingentials('tmhitadmin') GIT_URL_PROPERTY = "https://$GIT_HUB@github.com/mobilityhouse/testci.git" } stages{ ... ... stage('Coverage & Tests') { steps { sh 'pip3 install -e .' sh 'make coverage-xml' script { currentBuild.result = 'SUCCESS' sh(script: 'export GIT_URL_PROPERTY="https://$GIT_HUB@github.com/mobilityhouse/testci.git"') env.GIT_URL_PROPERTY = "https://$GIT_HUB@github.com/mobilityhouse/testci.git" step([$class: 'MasterCoverageAction']) } } } ... 

}

Por desgracia, esto también falla. Entonces, ¿cómo se supone que debo usar correctamente este complemento desde dentro de la tubería? Cualquier ayuda sería apreciada.

Después de andar dando vueltas durante un time, decidí echar un vistazo más profundo a lo que hace este plugin de Jenkins (un informe de problema en github no cedía mucho …)

Resultó que los informes maestros de cobertura se almacenan correctamente, por ejemplo, con la variable de entorno configurada correctamente:

  step([$class: 'MasterCoverageAction', scmVars: [GIT_URL: "https://github.com/xxx/testci.git",] ]) 

Esto habría agregado una input en el file de logging XML en JENKINS_HOME , sin JENKINS_HOME cómo se queje el complemento:

 Can't find master coverage repository: https://github.com/xxx/testci/pull/8 in stonetworking: {https://github.com/myorga/testci/pull/5=0.6923, https://github.com/xxx/testci/pull/6=0.6923, https://****@github.com/myorga/testci.git=0.5385, https://github.com/xxx/testci/pull/7=0.5385} 

Esto encendió una luz roja, así que busqué en el código y encontré el problema. Que es que el PR es detectado por el complemento como: https://github.com/xxx/testci/pull/6 sin embargo, la acción de cobertura maestra solo debería haber guardado https://github.com/xxx/testci para que la key sea no se encuentra en el file de configuration (que se analiza en un map hash). Después de leer el código, fue bastante fácil corregir el código.

En githubprcoveragestatus/CompareCoverageAction.java reemplacé:

 final float masterCoverage = masterCoverageRepository.get(gitUrl); 

con las siguientes líneas para

 float masterCoverage; if (gitUrl.contains("pull/")) { final String myCorrectURL = "https://github.com/" + GitUtils.getUserRepo(gitUrl); // Using masterCoverageRepository.get(myCorrectURL); is failing because URL is // https://github.com/USER/REPO/pull/PR_ID buildLog.println(BUILD_LOG_PREFIX + "myCorrectURL:" + myCorrectURL); masterCoverage = masterCoverageRepository.get(myCorrectURL); } else { masterCoverage = masterCoverageRepository.get(gitUrl); } 

Esto resolvió mi problema, con el buen espíritu de código abierto, hice una request de extracción para corregir cómo se detecta una URL para la Solicitud de extracción, de modo que otros puedan beneficiarse de esta solución.