blob: 3eaeff77ca58b7c14ac519f2a934a0e0dc4a75cc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.kohsuke.github.*
/**
* A script to report on the build status of synchronization for branches camel-main and quarkus-main.
*
* A GitHub issue ID is passed to this script from the GitHub workflow. The issue is inteded to be repeatedly closed / reopened
* whenever a build workflow run is successful / unsuccessful.
*
* If failures were encountered in the build, a comment is appended to a specified GitHub issue, with the body containing
* information about the commit SHA and a link to the build.
*
* If the build was successful, the open GitHub issue relating to the branch build will be closed.
*
* The script also outputs a GitHub action step variable named 'overall_build_status', this is used by the build to determine whether it
* should automatically merge the latest changes from the main branch, to the target branch.
*/
final String TOKEN = properties['token']
final String STATUS = properties['status'].toLowerCase(Locale.US)
final String BUILD_ID = properties['buildId']
final String REPO = properties['repo']
final String BRANCH = properties['branch']
final String BRANCH_NAME = "${BRANCH.split('-')[0].capitalize()} ${BRANCH.split('-')[1].capitalize()}"
final String BRANCH_COMMIT = properties['branch-commit'] ?: 'Unknown'
final String ACTIONS_URL = "https://github.com/${REPO}/actions/runs/${BUILD_ID.split("-")[0]}"
final String BRANCH_URL = "https://github.com/${REPO}/tree/${BRANCH}"
final String ISSUE_LABEL = "build/${BRANCH}"
final Integer ISSUE_ID = properties['issueId'] as Integer
class Utils {
static boolean workflowHasPreviousFailures(GHIssue issue, String buildId) {
String issueCommentMatch = "Build ID: ${buildId}"
int failureCount = issue.getComments().count { comment ->
comment.getBody().contains(issueCommentMatch)
}
return issue.getBody().contains(issueCommentMatch) || failureCount > 0
}
}
if (STATUS == "cancelled") {
println("Job status is cancelled - exiting")
return
}
println("Workflow status is ${STATUS}")
final GitHub github = new GitHubBuilder().withOAuthToken(TOKEN, "github-actions").build()
final GHRepository repository = github.getRepository(REPO)
final String camelQuarkusCommit = "git rev-parse HEAD".execute().text
GHIssue issue = repository.getIssue(ISSUE_ID)
if (issue == null) {
println("Unable to find the issue with id ${ISSUE_ID} in project ${REPO}")
System.exit(1)
} else {
println("Report issue found: ${issue.getTitle()} - ${issue.getHtmlUrl()}")
}
if (STATUS == "failure") {
if (Utils.workflowHasPreviousFailures(issue, BUILD_ID)) {
println("Workflow for Build ID ${BUILD_ID} has already reported failures - exiting")
} else {
if (issue.getState() == GHIssueState.CLOSED) {
issue.reopen()
}
issue.comment("""The [${BRANCH}](${BRANCH_URL}) branch build has failed:
* Build ID: ${BUILD_ID}
* Camel Quarkus Commit: ${camelQuarkusCommit}
* ${BRANCH_NAME} Commit: ${BRANCH_COMMIT}
* Link to build: ${ACTIONS_URL}""")
println("Commented on issue ${issue.getHtmlUrl()}")
}
}
if (STATUS == "verify") {
if (Utils.workflowHasPreviousFailures(issue, BUILD_ID)) {
println("Overall build status is: failure")
println "::set-output name=overall_build_status::failure"
return
} else {
if (issue.getState() == GHIssueState.OPEN) {
final GHIssueComment comment = issue.comment("""Build fixed with:
* Camel Quarkus Commit: ${camelQuarkusCommit}
* ${BRANCH_NAME} Commit: ${BRANCH_COMMIT}
* Link to build: ${ACTIONS_URL}""")
issue.close()
println("Comment added on issue ${issue.getHtmlUrl()} - ${comment.getHtmlUrl()}, the issue has also been closed")
}
}
println "::set-output name=overall_build_status::success"
}