import * as fs from 'fs' import * as path from 'path' export interface BuildResult { get rootProjectName(): string get rootProjectDir(): string get requestedTasks(): string get gradleVersion(): string get gradleHomeDir(): string get buildFailed(): boolean get buildScanUri(): string get buildScanFailed(): boolean } export class BuildResults { results: BuildResult[] constructor(results: BuildResult[]) { this.results = results } anyFailed(): boolean { return this.results.some(result => result.buildFailed) } uniqueGradleHomes(): string[] { const allHomes = this.results.map(buildResult => buildResult.gradleHomeDir) return Array.from(new Set(allHomes)) } } export function loadBuildResults(): BuildResults { const results = getUnprocessedResults().map(filePath => { const content = fs.readFileSync(filePath, 'utf8') return JSON.parse(content) as BuildResult }) return new BuildResults(results) } export function markBuildResultsProcessed(): void { getUnprocessedResults().forEach(markProcessed) } function getUnprocessedResults(): string[] { const buildResultsDir = path.resolve(process.env['RUNNER_TEMP']!, '.build-results') if (!fs.existsSync(buildResultsDir)) { return [] } return fs .readdirSync(buildResultsDir) .map(file => { return path.resolve(buildResultsDir, file) }) .filter(filePath => { return path.extname(filePath) === '.json' && !isProcessed(filePath) }) } function isProcessed(resultFile: string): boolean { const markerFile = `${resultFile}.processed` return fs.existsSync(markerFile) } function markProcessed(resultFile: string): void { const markerFile = `${resultFile}.processed` fs.writeFileSync(markerFile, '') }