web-dev-qa-db-ja.com

プルリクエストビルダーを使用しないJenkinsfileでgithubのコミットステータスを設定する方法

Jenkins 2はgithubへのすべてのプッシュをビルドするように設定されており、プルリクエストビルダーは使用していません(プルリクエストの一部であるコミットもビルドされます)。 GitHub Integration Plugin は、プルリクエストビルダーでのみ機能するため、これは機能しません。

github-notify plugin も試しましたが、このケースでは機能しないようです(おそらく、リポジトリはプライベートであるか、個々のユーザーではなく組織の一部として所有されているためです) 。 credentialsIdaccountrepo、そしてもちろんstatus引数を手動で指定するだけでなく、設定を推測させてみましたが、すべて運がありません。

現時点でのJenkinsfileの短縮版は次のとおりです。

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

ビルドを実行すると、次の結果が得られます。

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)

Jenkins(Configure Systemエリア)とブラウザーで手動で認証情報をテストしました-ユーザー名とパスワードは正しく、問題のリポジトリへの読み取り/書き込みアクセス権があります。

19
dcrosta

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

余分なプラグインは必要ありません。 GitHubプラグインがインストールされ、正しく構成されている限り、上記を行う必要さえありません。自動的に行われます。 Pull Request Builderも使用していませんが、代わりにJenkins Multibranch Pipelineを使用しています。上記のスニペットを使用して、PRのステータスをさらに細かくしています。

12
James

まず、これらの資格情報がフォルダー資格情報ではなくグローバルなものであることを確認します。
後者はまだサポートされていないため、同様のエラーメッセージが生成されます: JENKINS-42955 (まだレビュー中)

第二に、これらの資格情報がブラウザで機能するがDSL設定ファイルを介してはjenkinsfileにない場合、名前またはパスワードの特殊文字が原因である可能性があります: パーセントエンコードする必要がないかどうかを確認してください予約文字

5
VonC

accountパラメーターの値が資格情報のユーザーと一致してはならないということは私にはありませんでした。 accountで、リポジトリ所有者を指定する必要があります。 credentialsIdでは、リポジトリへの Pushアクセス を持つ任意のユーザーを使用できます。

credentialsId:使用するgithubの資格情報のIDは、UsernameAndPasswordタイプでなければなりません。 doc のように、資格情報に書き込みアクセス権があることを確認してください:プッシュアクセス権を持つユーザーは、指定されたrefのコミットステータスを作成できます

account:リポジトリを所有するアカウント

1
x-yuri

ドキュメントからのより良い例:

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

特別なプラグインに煩わされたくない場合は、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'
    }
  }
}

GITHUB_API_URLは通常、次のように構築されます。たとえば、environmentディレクティブの場合:

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

credentialsIdは、Jenkins -> Credentialsから作成および取得できます

0
Jozef