You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

119 lines
2.7 KiB

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