package org.wikimedia.integration import java.net.URLEncoder import groovy.json.JsonOutput /** * Gerrit review that can be used to comment on a gerrit patchset * * {@code * import org.wikimedia.integration.GerritReview * import org.wikimedia.integration.GerritComment * * stage('comment') { * comment = new GerritComment( * jobName: xx, * buildNumber: xx, * jobStatus: xx, * image: xx, * tags: xx * ) * GerritReview.post(this, comment) * } * } */ class GerritReview implements Serializable { /** * Jenkins pipeline workflow script context. */ final def workflowScript /** * Gerrit URL */ final def gerritURL = 'https://gerrit.wikimedia.org/r' /** * Name of the auth credentials in jenkins to use in gerrit */ final def gerritAuthCreds = 'gerrit.pipelinebot' /** * GerritComment with information for message body */ final GerritComment comment GerritReview(workflowScript, GerritComment comment) { this.workflowScript = workflowScript this.comment = comment } /** * URLEncoded ZUUL_PROJECT from the environment. * * This should be set for all patchsets. */ String getProject() { URLEncoder.encode(this.workflowScript.env.ZUUL_PROJECT, 'UTF-8') } /** * Return a full authorized url for a gerrit revision review. * * May return an empty string in the cases of an unexpected environment. */ String getRequestURL() { def change = this.workflowScript.env.ZUUL_CHANGE def revision = this.workflowScript.env.ZUUL_PATCHSET if (! revision || ! change) { return "" } def changeId = [this.getProject(), change].join('~') [ this.gerritURL, 'a/changes', changeId, 'revisions', revision, 'review', ].join('/') } /** * Format gerritcomment as a json message. */ String getBody() { JsonOutput.toJson([message: this.comment.formatMessage()]) } /** * Static method to POST GerritComment to a particular change. * * Uses the Gerrit RESTAPI to POST a comment on a patchset revision. * * @param workflowScript Jenkins workflow script context. * @param comment GerritComment */ static String post(workflowScript, GerritComment comment) { def gr = new GerritReview(workflowScript, comment) def url = gr.getRequestURL() if (! url) { gr.workflowScript.error "Could not determine Gerrit ChangeID from Environment. Aborting." } def response = gr.workflowScript.httpRequest( url: url, httpMode: 'POST', customHeaders: [[name: "content-type", value: 'application/json']], requestBody: gr.getBody(), consoleLogResponseBody: true, validResponseCodes: "200", authentication: gr.gerritAuthCreds ) response.content } }