diff --git a/__tests__/github.test.itg.ts b/__tests__/github.test.itg.ts index 20858dec..5c3642ea 100644 --- a/__tests__/github.test.itg.ts +++ b/__tests__/github.test.itg.ts @@ -248,6 +248,52 @@ maybe('writeBuildSummary', () => { } }); }); + + it('without build record', async () => { + const startedTime = new Date(); + const buildx = new Buildx(); + const build = new Build({buildx: buildx}); + + fs.mkdirSync(tmpDir, {recursive: true}); + await expect( + (async () => { + // prettier-ignore + const buildCmd = await buildx.getCommand([ + '--builder', process.env.CTN_BUILDER_NAME ?? 'default', + 'build', + '-f', path.join(fixturesDir, 'hello.Dockerfile'), + fixturesDir, + '--metadata-file', build.getMetadataFilePath() + ]); + await Exec.exec(buildCmd.command, buildCmd.args); + })() + ).resolves.not.toThrow(); + + const refs = Buildx.refs({ + dir: Buildx.refsDir, + builderName: process.env.CTN_BUILDER_NAME ?? 'default', + since: startedTime + }); + expect(refs).toBeDefined(); + expect(Object.keys(refs).length).toBeGreaterThan(0); + + const history = new History({buildx: buildx}); + const exportRes = await history.export({ + refs: [Object.keys(refs)[0] ?? ''] + }); + expect(exportRes).toBeDefined(); + expect(exportRes?.dockerbuildFilename).toBeDefined(); + expect(exportRes?.dockerbuildSize).toBeDefined(); + expect(exportRes?.summaries).toBeDefined(); + + await GitHub.writeBuildSummary({ + exportRes: exportRes, + inputs: { + context: fixturesDir, + file: path.join(fixturesDir, 'hello.Dockerfile') + } + }); + }); }); maybe('annotateBuildWarnings', () => { diff --git a/src/github.ts b/src/github.ts index 446856d6..68ad070e 100644 --- a/src/github.ts +++ b/src/github.ts @@ -226,18 +226,19 @@ export class GitHub { const refsSize = Object.keys(opts.exportRes.refs).length; - // we just need the last two parts of the URL as they are always relative - // to the workflow run URL otherwise URL could be broken if GitHub - // repository name is part of a secret value used in the workflow. e.g.: - // artifact: https://github.com/docker/actions-toolkit/actions/runs/9552208295/artifacts/1609622746 - // workflow: https://github.com/docker/actions-toolkit/actions/runs/9552208295 - // https://github.com/docker/actions-toolkit/issues/367 - const artifactRelativeURL = `./${GitHub.runId}/${opts.uploadRes.url.split('/').slice(-2).join('/')}`; - - // prettier-ignore - const sum = core.summary - .addHeading('Docker Build summary', 2) - .addRaw(`
`) + const sum = core.summary.addHeading('Docker Build summary', 2); + + if (opts.uploadRes) { + // we just need the last two parts of the URL as they are always relative + // to the workflow run URL otherwise URL could be broken if GitHub + // repository name is part of a secret value used in the workflow. e.g.: + // artifact: https://github.com/docker/actions-toolkit/actions/runs/9552208295/artifacts/1609622746 + // workflow: https://github.com/docker/actions-toolkit/actions/runs/9552208295 + // https://github.com/docker/actions-toolkit/issues/367 + const artifactRelativeURL = `./${GitHub.runId}/${opts.uploadRes.url.split('/').slice(-2).join('/')}`; + + // prettier-ignore + sum.addRaw(`
`) .addRaw(`For a detailed look at the build, download the following build record archive and import it into Docker Desktop's Builds view. `) .addBreak() .addRaw(`Build records include details such as timing, dependencies, results, logs, traces, and other information about a build. `) @@ -245,11 +246,17 @@ export class GitHub { .addRaw('
') .addRaw(``) .addRaw(`:arrow_down: ${addLink(`${Util.stringToUnicodeEntities(opts.uploadRes.filename)}`, artifactRelativeURL)} (${Util.formatFileSize(opts.uploadRes.size)} - includes ${refsSize} build record${refsSize > 1 ? 's' : ''})`) - .addRaw(`
`) - .addRaw(``) - .addRaw(`Find this useful? `) - .addRaw(addLink('Let us know', 'https://docs.docker.com/feedback/gha-build-summary')) - .addRaw('
'); + .addRaw(``); + } else { + // prettier-ignore + sum.addRaw(``) + .addRaw(`The table below provides a quick summary of your build. For more detailed information about your build, including timing, dependencies, results, logs, traces, and other information, consider enabling the upload of the build record.`) + .addRaw(addLink('Learn more', 'https://www.docker.com/blog/new-beta-feature-deep-dive-into-github-actions-docker-builds-with-docker-desktop/?utm_source=github&utm_medium=actions')) + .addRaw(`
`); + } + + // Feedback survey + sum.addRaw(``).addRaw(`Find this useful? `).addRaw(addLink('Let us know', 'https://docs.docker.com/feedback/gha-build-summary')).addRaw('
'); // Preview sum.addRaw(''); diff --git a/src/types/github.ts b/src/types/github.ts index 7232f590..e1449178 100644 --- a/src/types/github.ts +++ b/src/types/github.ts @@ -53,7 +53,7 @@ export interface UploadArtifactResponse { export interface BuildSummaryOpts { exportRes: ExportRecordResponse; - uploadRes: UploadArtifactResponse; + uploadRes?: UploadArtifactResponse; // eslint-disable-next-line @typescript-eslint/no-explicit-any inputs?: any; bakeDefinition?: BakeDefinition;