web-dev-qa-db-fra.com

Comment définir le statut de validation de github avec Jenkinsfile PAS en utilisant un générateur de demande d'extraction

Jenkins 2 est configuré pour construire chaque Push vers github, et nous n'utilisons pas le générateur de demande de pull (bien que les commits qui font partie d'une requête de pull seront évidemment construits également). Le plug-in d'intégration GitHub indique qu'il ne fonctionne qu'avec le générateur de demande d'extraction, donc cela ne fonctionnera pas pour nous.

J'ai également essayé le plugin github-notify , mais cela ne semble pas fonctionner pour notre cas (peut-être parce que le dépôt est privé et/ou détenu dans le cadre d'un Organizaiton, plutôt que d'un utilisateur individuel) . J'ai essayé de le laisser déduire des paramètres ainsi que de spécifier manuellement les arguments credentialsId, account, repo et bien sûr status, sans succès.

Voici une version abrégée de mon fichier Jenkins en ce moment:

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"
        }
    }
}

Lorsque j'exécute la génération, j'obtiens ce qui suit:

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)

J'ai testé les informations d'identification à la fois via Jenkins (dans la zone Configurer le système) et manuellement dans un navigateur - le nom d'utilisateur et le mot de passe sont corrects et ont un accès en lecture/écriture au référentiel en question.

19
dcrosta

Tout d'abord, assurez-vous que ces informations d'identification sont globales, pas les informations d'identification de dossier.
Ce dernier n'est pas encore pris en charge et générerait un message d'erreur similaire: voir JENKINS-42955 (toujours en révision)

Deuxièmement, si ces informations d'identification fonctionnent dans un navigateur mais pas via un fichier de configuration DSL, un fichier jenkins peut être dû à des caractères spéciaux dans le nom ou le mot de passe: voyez si vous n'êtes pas obligé de pour cent encoder les caractères réservés .

5
VonC

Il ne m'est pas venu à l'esprit que la valeur du paramètre account ne doit pas correspondre à l'utilisateur dans les informations d'identification. Dans account, vous devez spécifier le propriétaire du référentiel. Et dans credentialsId vous pouvez utiliser n'importe quel utilisateur avec Accès push au référentiel:

credentialsId: L'ID des informations d'identification du github à utiliser, doit être de type UsernameAndPassword. Assurez-vous que les informations d'identification ont un accès en écriture, comme indiqué par le doc : les utilisateurs avec un accès Push peuvent créer des statuts de validation pour une référence donnée

account: le compte propriétaire du référentiel

1
x-yuri

Un meilleur exemple de la documentation:

def getRepoURL() {
  sh "git config --get remote.Origin.url > .git/remote-url"
  return readFile(".git/remote-url").trim()
}

def getCommitSha() {
  sh "git rev-parse HEAD > .git/current-commit"
  return readFile(".git/current-commit").trim()
}

def updateGithubCommitStatus(build) {
  // workaround https://issues.jenkins-ci.org/browse/JENKINS-38674
  repoUrl = getRepoURL()
  commitSha = getCommitSha()

  step([
    $class: 'GitHubCommitStatusSetter',
    reposSource: [$class: "ManuallyEnteredRepositorySource", url: repoUrl],
    commitShaSource: [$class: "ManuallyEnteredShaSource", sha: commitSha],
    errorHandlers: [[$class: 'ShallowAnyErrorHandler']],
    statusResultSource: [
      $class: 'ConditionalStatusResultSource',
      results: [
        [$class: 'BetterThanOrEqualBuildResult', result: 'SUCCESS', state: 'SUCCESS', message: build.description],
        [$class: 'BetterThanOrEqualBuildResult', result: 'FAILURE', state: 'FAILURE', message: build.description],
        [$class: 'AnyBuildResult', state: 'FAILURE', message: 'Loophole']
      ]
    ]
  ])
}
1
Clintm

Si vous ne voulez pas vous embêter avec les plugins spécialisés, voici une alternative en utilisant curl:

post {
  success {
    withCredentials([usernamePassword(credentialsId: 'your_credentials_id', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
      sh 'curl -X POST --user $USERNAME:$PASSWORD --data  "{\\"state\\": \\"success\\"}" --url $GITHUB_API_URL/statuses/$GIT_COMMIT'
    }
  }
  failure {
    withCredentials([usernamePassword(credentialsId: 'your_credentials_id', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
      sh 'curl -X POST --user $USERNAME:$PASSWORD --data  "{\\"state\\": \\"failure\\"}" --url $GITHUB_API_URL/statuses/$GIT_COMMIT'
    }
  }
}

Où le GITHUB_API_URL est généralement construit comme ceci, par exemple dans la directive environment:

environment {
   GITHUB_API_URL='https://api.github.com/repos/organization_name/repo_name'
}

credentialsId peut être créé et obtenu à partir de Jenkins -> Credentials

0
Jozef