github - stages - jenkins pipelines documentation
Cómo establecer el estado de confirmación de github con Jenkinsfile NO utilizando un generador de solicitud de extracción (3)
No se me ocurrió que el valor en el parámetro de la account
no debe coincidir con el usuario en las credenciales. En la account
debe especificar el propietario del repositorio. Y en credentialsId
puede usar cualquier usuario con acceso push al repositorio:
credentialsId
: el ID de las credenciales de github para usar, debe ser del tipoUsernameAndPassword
. Asegúrese de que las credenciales tengan acceso de escritura, como lo indica el documento : los usuarios con acceso de inserción pueden crear estados de confirmación para una referencia dada
account
: la cuenta que posee el repositorio
Tenemos Jenkins 2 configurado para compilar cada impulso a github, y no usamos el generador de Solicitud de extracción (aunque los compromisos que son parte de una solicitud de extracción, obviamente, también se construirán). El complemento de integración de GitHub dice que solo funciona con el generador de solicitudes de extracción, por lo que esto no funcionará para nosotros.
También probé el complemento github-notification , pero parece que no funciona para nuestro caso (posiblemente porque el repositorio es privado y / o de propiedad como parte de una organización, en lugar de un usuario individual). He intentado dejar que deduzca configuraciones, así como especificando manualmente los ID de credentialsId
, la account
, el repo
y, por supuesto status
argumentos de status
, todo sin suerte.
Aquí hay una versión abreviada de mi archivo Jenkins en este momento:
pipeline {
agent { label "centos7" }
stages {
stage("github => pending") {
steps {
githubNotify status: "PENDING", credentialsId: "my-credentials-id", account: "my-account", repo: "my-repo"
}
}
stage("build") {
...
}
}
post {
success {
githubNotify status: "SUCCESS", credentialsId: "my-credentials-id", account: "my-account", repo: "my-repo"
}
failure {
githubNotify status: "FAILURE", credentialsId: "my-credentials-id", account: "my-account", repo: "my-repo"
}
}
}
Cuando ejecuto la compilación, obtengo lo siguiente:
java.lang.IllegalArgumentException: The suplied credentials are invalid to login
at org.jenkinsci.plugins.pipeline.githubstatusnotification.GitHubStatusNotificationStep.getGitHubIfValid(GitHubStatusNotificationStep.java:234)
at org.jenkinsci.plugins.pipeline.githubstatusnotification.GitHubStatusNotificationStep.getRepoIfValid(GitHubStatusNotificationStep.java:239)
at org.jenkinsci.plugins.pipeline.githubstatusnotification.GitHubStatusNotificationStep.access$100(GitHubStatusNotificationStep.java:75)
at org.jenkinsci.plugins.pipeline.githubstatusnotification.GitHubStatusNotificationStep$Execution.run(GitHubStatusNotificationStep.java:344)
at org.jenkinsci.plugins.pipeline.githubstatusnotification.GitHubStatusNotificationStep$Execution.run(GitHubStatusNotificationStep.java:326)
at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1$1.call(AbstractSynchronousNonBlockingStepExecution.java:47)
at hudson.security.ACL.impersonate(ACL.java:221)
at org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution$1.run(AbstractSynchronousNonBlockingStepExecution.java:44)
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:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
He probado las credenciales tanto a través de Jenkins (en el área Configurar sistema) como manualmente en un navegador: el nombre de usuario y la contraseña son correctos y tienen acceso de lectura / escritura al repositorio en cuestión.
Por el propio ejemplo del plugin Jenkins GitHub :
void setBuildStatus(String message, String state) {
step([
$class: "GitHubCommitStatusSetter",
reposSource: [$class: "ManuallyEnteredRepositorySource", url: "https://github.com/my-org/my-repo"],
contextSource: [$class: "ManuallyEnteredCommitContextSource", context: "ci/jenkins/build-status"],
errorHandlers: [[$class: "ChangingBuildStatusErrorHandler", result: "UNSTABLE"]],
statusResultSource: [ $class: "ConditionalStatusResultSource", results: [[$class: "AnyBuildResult", message: message, state: state]] ]
]);
}
...
pipeline {
stages {
...
}
post {
success {
setBuildStatus("Build succeeded", "SUCCESS");
}
failure {
setBuildStatus("Build failed", "FAILURE");
}
}
}
No se requieren complementos superfluos. Siempre que tenga el complemento GitHub instalado y configurado correctamente, no debería tener que hacer lo anterior, debería suceder automáticamente. Tampoco estamos utilizando el constructor Solicitud de extracción, sino que estamos utilizando la canalización de Jenkins Multibranch. Simplemente estamos usando el fragmento de código anterior para una granularidad de estado adicional en nuestras relaciones públicas.
Primero, asegúrese de que esas credenciales sean globales, no de carpetas.
Este último aún no es compatible y generaría un mensaje de error similar: vea JENKINS-42955
(aún en revisión)
En segundo lugar, si esas credenciales funcionan en un navegador, pero no a través de un archivo de configuración DSL, se encuentra un archivo jenkins, que puede deberse a caracteres especiales en el nombre o la contraseña: verifique si no tiene que codificar en porcentaje los caracteres reservados .