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..cac5aaf6 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,19 @@ 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 following table provides a brief summary of your build.`) + .addBreak() + .addRaw(`For a detailed look at the build, including timing, dependencies, results, logs, traces, and other information, consider enabling the export of the build record so you can import it into Docker Desktop's Builds view. `) + .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;