mirror of
				https://github.com/gradle/gradle-build-action.git
				synced 2025-11-04 09:58:56 +08:00 
			
		
		
		
	Write job summary in post action
- Save build results in file encoded as JSON - Read all build results in post action and render as table in job summary
This commit is contained in:
		
							
								
								
									
										59
									
								
								src/job-summary.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/job-summary.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
import * as core from '@actions/core'
 | 
			
		||||
import fs from 'fs'
 | 
			
		||||
import path from 'path'
 | 
			
		||||
 | 
			
		||||
interface BuildResult {
 | 
			
		||||
    get rootProject(): string
 | 
			
		||||
    get requestedTasks(): string
 | 
			
		||||
    get gradleVersion(): string
 | 
			
		||||
    get buildFailed(): boolean
 | 
			
		||||
    get buildScanUri(): string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function writeJobSummary(): void {
 | 
			
		||||
    const buildResults = loadBuildResults()
 | 
			
		||||
    if (buildResults.length === 0) {
 | 
			
		||||
        core.debug('No Gradle build results found. Summary table will not be generated.')
 | 
			
		||||
    } else {
 | 
			
		||||
        writeSummaryTable(buildResults)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function loadBuildResults(): BuildResult[] {
 | 
			
		||||
    const buildResultsDir = path.resolve(process.env['RUNNER_TEMP']!, '.build-results')
 | 
			
		||||
    if (!fs.existsSync(buildResultsDir)) {
 | 
			
		||||
        return []
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return fs.readdirSync(buildResultsDir).map(file => {
 | 
			
		||||
        // Every file in the .build-results dir should be a BuildResults JSON
 | 
			
		||||
        const filePath = path.join(buildResultsDir, file)
 | 
			
		||||
        const content = fs.readFileSync(filePath, 'utf8')
 | 
			
		||||
        return JSON.parse(content) as BuildResult
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function writeSummaryTable(results: BuildResult[]): void {
 | 
			
		||||
    core.summary.addRaw(`| Root Project | Tasks | Gradle Version | Outcome |\n| - | - | - | - |\n`)
 | 
			
		||||
    for (const result of results) {
 | 
			
		||||
        const tableRow = `| ${result.rootProject} \
 | 
			
		||||
                          | ${result.requestedTasks} \
 | 
			
		||||
                          | ${result.gradleVersion} \
 | 
			
		||||
                          | ${renderOutcome(result)} \
 | 
			
		||||
                          |\n`
 | 
			
		||||
        core.summary.addRaw(tableRow)
 | 
			
		||||
    }
 | 
			
		||||
    core.summary.write()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function renderOutcome(result: BuildResult): string {
 | 
			
		||||
    if (result.buildScanUri) {
 | 
			
		||||
        return `[](${result.buildScanUri})`
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ``
 | 
			
		||||
}
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
import * as core from '@actions/core'
 | 
			
		||||
import * as setupGradle from './setup-gradle'
 | 
			
		||||
import {writeJobSummary} from './job-summary'
 | 
			
		||||
 | 
			
		||||
// Catch and log any unhandled exceptions.  These exceptions can leak out of the uploadChunk method in
 | 
			
		||||
// @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to
 | 
			
		||||
@@ -12,6 +13,8 @@ process.on('uncaughtException', e => handleFailure(e))
 | 
			
		||||
export async function run(): Promise<void> {
 | 
			
		||||
    try {
 | 
			
		||||
        await setupGradle.complete()
 | 
			
		||||
 | 
			
		||||
        writeJobSummary()
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
        handleFailure(error)
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -33,17 +33,23 @@ def registerCallbacks(buildScanExtension, rootProjectName) {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        buildScanPublished { buildScan ->
 | 
			
		||||
            def gradleCommand = rootProjectName + " " + gradle.startParameter.taskNames.join(" ")
 | 
			
		||||
            def buildResultsDir = new File(System.getenv("RUNNER_TEMP"), ".build-results")
 | 
			
		||||
            buildResultsDir.mkdirs()
 | 
			
		||||
            
 | 
			
		||||
            def buildResultsFile = new File(buildResultsDir, System.getenv("GITHUB_ACTION") + System.currentTimeMillis() + ".json")
 | 
			
		||||
 | 
			
		||||
            def requestedTasks = gradle.startParameter.taskNames.join(" ")
 | 
			
		||||
            def gradleVersion = GradleVersion.current().version
 | 
			
		||||
            def buildScanUri = buildScan.buildScanUri.toASCIIString()
 | 
			
		||||
            def buildResults = [
 | 
			
		||||
                rootProject: rootProjectName, 
 | 
			
		||||
                requestedTasks: requestedTasks,
 | 
			
		||||
                gradleVersion: gradleVersion, 
 | 
			
		||||
                buildFailed: buildFailed, 
 | 
			
		||||
                buildScanUri: buildScanUri
 | 
			
		||||
            ]
 | 
			
		||||
            buildResultsFile << groovy.json.JsonOutput.toJson(buildResults)
 | 
			
		||||
 | 
			
		||||
            // Write job summary to magic file defined by GitHub Actions.
 | 
			
		||||
            def githubSummaryFile = new File(System.getenv("GITHUB_STEP_SUMMARY"))
 | 
			
		||||
            if (buildFailed) {
 | 
			
		||||
                githubSummaryFile << ":x: Gradle Build `${gradleCommand}` [](${buildScan.buildScanUri})"
 | 
			
		||||
            } else {
 | 
			
		||||
                githubSummaryFile << ":white_check_mark: Gradle Build `${gradleCommand}` [](${buildScan.buildScanUri})"
 | 
			
		||||
            }
 | 
			
		||||
         
 | 
			
		||||
            // Send 'set-output' command directly to GitHub Actions via STDOUT.
 | 
			
		||||
            println("::set-output name=build-scan-url::${buildScan.buildScanUri}")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user