mirror of
https://github.com/gradle/actions.git
synced 2026-07-26 14:14:32 +02:00
- Injects a `<!-- gradle-job-summary: ${jobCorrelator} -->` marker on
each job summary
- Lists 100 last comments: unfortunately there is no API to specifically
filter for comments, and checking the last 100 comments (the limit) is
usually enough and does not require iterating over pages
- Mutate comments having this expected marker
I tried to add some tests, but I'm not familiar enough to setup a
complete test suite with proper mocking of GitHub/Octokit with jest.
I could potentially extract the `prComment` creation to check for the
marker presence, let me know.
Note: it seems like there is currently an issue on mutating comments as
`OUTDATED` through graphql. Although it does not work as expected
(flagging as OUTDATED) the comments are still minimized, which is what
we want.
- https://github.com/orgs/community/discussions/19865
Implements #176
---------
Co-authored-by: Daz DeBoer <daz@gradle.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
211 lines
8.8 KiB
TypeScript
211 lines
8.8 KiB
TypeScript
import dedent from 'dedent'
|
|
import * as github from '@actions/github'
|
|
import {afterEach, describe, expect, it} from '@jest/globals'
|
|
|
|
import {BuildResult} from '../../src/build-results'
|
|
import {jobMarker, renderSummaryTable} from '../../src/job-summary'
|
|
|
|
const MATRIX_INPUT_ENV = 'INPUT_WORKFLOW-JOB-CONTEXT'
|
|
|
|
function fakeContext(workflow: string, job: string): typeof github.context {
|
|
return {workflow, job} as unknown as typeof github.context
|
|
}
|
|
|
|
const successfulHelpBuild: BuildResult = {
|
|
rootProjectName: 'root',
|
|
rootProjectDir: '/',
|
|
requestedTasks: 'help',
|
|
gradleVersion: '8.0',
|
|
gradleHomeDir: '/opt/gradle',
|
|
buildFailed: false,
|
|
configCacheHit: false,
|
|
buildScanUri: 'https://scans.gradle.com/s/abc123',
|
|
buildScanFailed: false
|
|
}
|
|
|
|
const failedHelpBuild: BuildResult = {
|
|
...successfulHelpBuild,
|
|
buildFailed: true
|
|
}
|
|
|
|
const longArgsBuild: BuildResult = {
|
|
...successfulHelpBuild,
|
|
requestedTasks: 'check publishMyLongNamePluginPublicationToMavenCentral publishMyLongNamePluginPublicationToPluginPortal',
|
|
}
|
|
|
|
const scanPublishDisabledBuild: BuildResult = {
|
|
...successfulHelpBuild,
|
|
buildScanUri: '',
|
|
buildScanFailed: false,
|
|
}
|
|
|
|
const scanPublishFailedBuild: BuildResult = {
|
|
...successfulHelpBuild,
|
|
buildScanUri: '',
|
|
buildScanFailed: true,
|
|
}
|
|
|
|
describe('renderSummaryTable', () => {
|
|
describe('renders', () => {
|
|
it('successful build', () => {
|
|
const table = renderSummaryTable([successfulHelpBuild])
|
|
expect(table.trim()).toBe(dedent`
|
|
<table>
|
|
<tr>
|
|
<th>Gradle Root Project</th>
|
|
<th>Requested Tasks</th>
|
|
<th>Gradle Version</th>
|
|
<th>Build Outcome</th>
|
|
<th>Build Scan®</th>
|
|
</tr>
|
|
<tr>
|
|
<td>root</td>
|
|
<td>help</td>
|
|
<td align='center'>8.0</td>
|
|
<td align='center'>:white_check_mark:</td>
|
|
<td><a href="https://scans.gradle.com/s/abc123" rel="nofollow" target="_blank"><img src="https://img.shields.io/badge/Build%20Scan%C2%AE-06A0CE?logo=Gradle" alt="Build Scan published" /></a></td>
|
|
</tr>
|
|
</table>
|
|
`);
|
|
})
|
|
it('failed build', () => {
|
|
const table = renderSummaryTable([failedHelpBuild])
|
|
expect(table.trim()).toBe(dedent`
|
|
<table>
|
|
<tr>
|
|
<th>Gradle Root Project</th>
|
|
<th>Requested Tasks</th>
|
|
<th>Gradle Version</th>
|
|
<th>Build Outcome</th>
|
|
<th>Build Scan®</th>
|
|
</tr>
|
|
<tr>
|
|
<td>root</td>
|
|
<td>help</td>
|
|
<td align='center'>8.0</td>
|
|
<td align='center'>:x:</td>
|
|
<td><a href="https://scans.gradle.com/s/abc123" rel="nofollow" target="_blank"><img src="https://img.shields.io/badge/Build%20Scan%C2%AE-06A0CE?logo=Gradle" alt="Build Scan published" /></a></td>
|
|
</tr>
|
|
</table>
|
|
`);
|
|
})
|
|
describe('when build scan', () => {
|
|
it('publishing disabled', () => {
|
|
const table = renderSummaryTable([scanPublishDisabledBuild])
|
|
expect(table.trim()).toBe(dedent`
|
|
<table>
|
|
<tr>
|
|
<th>Gradle Root Project</th>
|
|
<th>Requested Tasks</th>
|
|
<th>Gradle Version</th>
|
|
<th>Build Outcome</th>
|
|
<th>Build Scan®</th>
|
|
</tr>
|
|
<tr>
|
|
<td>root</td>
|
|
<td>help</td>
|
|
<td align='center'>8.0</td>
|
|
<td align='center'>:white_check_mark:</td>
|
|
<td><a href="https://scans.gradle.com" rel="nofollow" target="_blank"><img src="https://img.shields.io/badge/Not%20published-lightgrey" alt="Build Scan not published" /></a></td>
|
|
</tr>
|
|
</table>
|
|
`);
|
|
})
|
|
it('publishing failed', () => {
|
|
const table = renderSummaryTable([scanPublishFailedBuild])
|
|
expect(table.trim()).toBe(dedent`
|
|
<table>
|
|
<tr>
|
|
<th>Gradle Root Project</th>
|
|
<th>Requested Tasks</th>
|
|
<th>Gradle Version</th>
|
|
<th>Build Outcome</th>
|
|
<th>Build Scan®</th>
|
|
</tr>
|
|
<tr>
|
|
<td>root</td>
|
|
<td>help</td>
|
|
<td align='center'>8.0</td>
|
|
<td align='center'>:white_check_mark:</td>
|
|
<td><a href="https://docs.gradle.com/develocity/gradle-plugin/#troubleshooting" rel="nofollow" target="_blank"><img src="https://img.shields.io/badge/Publish%20failed-orange" alt="Build Scan publish failed" /></a></td>
|
|
</tr>
|
|
</table>
|
|
`);
|
|
})
|
|
})
|
|
it('multiple builds', () => {
|
|
const table = renderSummaryTable([successfulHelpBuild, failedHelpBuild])
|
|
expect(table.trim()).toBe(dedent`
|
|
<table>
|
|
<tr>
|
|
<th>Gradle Root Project</th>
|
|
<th>Requested Tasks</th>
|
|
<th>Gradle Version</th>
|
|
<th>Build Outcome</th>
|
|
<th>Build Scan®</th>
|
|
</tr>
|
|
<tr>
|
|
<td>root</td>
|
|
<td>help</td>
|
|
<td align='center'>8.0</td>
|
|
<td align='center'>:white_check_mark:</td>
|
|
<td><a href="https://scans.gradle.com/s/abc123" rel="nofollow" target="_blank"><img src="https://img.shields.io/badge/Build%20Scan%C2%AE-06A0CE?logo=Gradle" alt="Build Scan published" /></a></td>
|
|
</tr>
|
|
<tr>
|
|
<td>root</td>
|
|
<td>help</td>
|
|
<td align='center'>8.0</td>
|
|
<td align='center'>:x:</td>
|
|
<td><a href="https://scans.gradle.com/s/abc123" rel="nofollow" target="_blank"><img src="https://img.shields.io/badge/Build%20Scan%C2%AE-06A0CE?logo=Gradle" alt="Build Scan published" /></a></td>
|
|
</tr>
|
|
</table>
|
|
`);
|
|
})
|
|
it('truncating long requested tasks', () => {
|
|
const table = renderSummaryTable([longArgsBuild])
|
|
expect(table.trim()).toBe(dedent`
|
|
<table>
|
|
<tr>
|
|
<th>Gradle Root Project</th>
|
|
<th>Requested Tasks</th>
|
|
<th>Gradle Version</th>
|
|
<th>Build Outcome</th>
|
|
<th>Build Scan®</th>
|
|
</tr>
|
|
<tr>
|
|
<td>root</td>
|
|
<td><div title='check publishMyLongNamePluginPublicationToMavenCentral publishMyLongNamePluginPublicationToPluginPortal'>check publishMyLongNamePluginPublicationToMavenCentral publ…</div></td>
|
|
<td align='center'>8.0</td>
|
|
<td align='center'>:white_check_mark:</td>
|
|
<td><a href="https://scans.gradle.com/s/abc123" rel="nofollow" target="_blank"><img src="https://img.shields.io/badge/Build%20Scan%C2%AE-06A0CE?logo=Gradle" alt="Build Scan published" /></a></td>
|
|
</tr>
|
|
</table>
|
|
`);
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('jobMarker', () => {
|
|
const original = process.env[MATRIX_INPUT_ENV]
|
|
|
|
afterEach(() => {
|
|
if (original === undefined) {
|
|
delete process.env[MATRIX_INPUT_ENV]
|
|
} else {
|
|
process.env[MATRIX_INPUT_ENV] = original
|
|
}
|
|
})
|
|
|
|
it('builds a hidden marker from the workflow and job', () => {
|
|
process.env[MATRIX_INPUT_ENV] = 'null'
|
|
const marker = jobMarker(fakeContext('CI', 'build'))
|
|
expect(marker).toBe('<!-- gradle-job-summary: ci-build -->')
|
|
})
|
|
|
|
it('includes the job matrix in the marker', () => {
|
|
process.env[MATRIX_INPUT_ENV] = JSON.stringify({os: 'ubuntu', java: '17'})
|
|
const marker = jobMarker(fakeContext('CI', 'build'))
|
|
expect(marker).toBe('<!-- gradle-job-summary: ci-build-ubuntu-17 -->')
|
|
})
|
|
})
|