diff --git a/src/buildx/history.ts b/src/buildx/history.ts index 3bae017b..292bd876 100644 --- a/src/buildx/history.ts +++ b/src/buildx/history.ts @@ -130,6 +130,7 @@ export class History { numCachedSteps: res.NumCachedSteps, numTotalSteps: res.NumTotalSteps, numCompletedSteps: res.NumCompletedSteps, + defaultPlatform: res.Platform?.[0], error: errorLogs }; }); @@ -283,10 +284,10 @@ export class History { return { dockerbuildFilename: dockerbuildPath, dockerbuildSize: dockerbuildStats.size, - summaries: summaries, builderName: builderName, nodeName: nodeName, - refs: refs + refs: refs, + summaries: summaries }; } diff --git a/src/github.ts b/src/github.ts index da2298d0..f19a881e 100644 --- a/src/github.ts +++ b/src/github.ts @@ -234,9 +234,23 @@ export class GitHub { }; const refsSize = Object.keys(opts.exportRes.refs).length; + const singleRef = refsSize === 1 ? Object.keys(opts.exportRes.refs)[0] : undefined; + const singleSummary = singleRef && opts.exportRes.summaries?.[singleRef]; + const dbcAccount = opts.driver === 'cloud' && opts.endpoint?.split('/')[0]; const sum = core.summary.addHeading('Docker Build summary', 2); + if (dbcAccount && singleRef && singleSummary) { + const buildURL = GitHub.formatDBCBuildURL(dbcAccount, singleRef, singleSummary.defaultPlatform); + // prettier-ignore + sum.addRaw(`

`) + .addRaw(`For a detailed look at the build, you can check the results at:`) + .addRaw('

') + .addRaw(`

`) + .addRaw(`:whale: ${addLink(`${buildURL}`, buildURL)}`) + .addRaw(`

`); + } + 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 @@ -246,17 +260,29 @@ export class GitHub { // https://github.com/docker/actions-toolkit/issues/367 const artifactRelativeURL = `./${GitHub.runId}/${opts.uploadRes.url.split('/').slice(-2).join('/')}`; + if (dbcAccount && refsSize === 1) { + // prettier-ignore + sum.addRaw(`

`) + .addRaw(`You can also 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. `) + .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('

') + } else { + // 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. `) + .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('

') + } + // 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. `) - .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('

') - .addRaw(`

`) .addRaw(`:arrow_down: ${addLink(`${Util.stringToUnicodeEntities(opts.uploadRes.filename)}`, artifactRelativeURL)} (${Util.formatFileSize(opts.uploadRes.size)} - includes ${refsSize} build record${refsSize > 1 ? 's' : ''})`) .addRaw(`

`); - } else { + } else if (opts.exportRes.summaries) { // prettier-ignore sum.addRaw(`

`) .addRaw(`The following table provides a brief summary of your build.`) @@ -273,12 +299,14 @@ export class GitHub { // Preview sum.addRaw('

'); const summaryTableData: Array> = [ + // prettier-ignore [ {header: true, data: 'ID'}, {header: true, data: 'Name'}, {header: true, data: 'Status'}, {header: true, data: 'Cached'}, - {header: true, data: 'Duration'} + {header: true, data: 'Duration'}, + ...(dbcAccount && refsSize > 1 ? [{header: true, data: 'Build result URL'}] : []) ] ]; let buildError: string | undefined; @@ -287,12 +315,13 @@ export class GitHub { const summary = opts.exportRes.summaries[ref]; // prettier-ignore summaryTableData.push([ - {data: `${ref.substring(0, 6).toUpperCase()}`}, - {data: `${Util.stringToUnicodeEntities(summary.name)}`}, - {data: `${summary.status === 'completed' ? ':white_check_mark:' : summary.status === 'canceled' ? ':no_entry_sign:' : ':x:'} ${summary.status}`}, - {data: `${summary.numCachedSteps > 0 ? Math.round((summary.numCachedSteps / summary.numTotalSteps) * 100) : 0}%`}, - {data: summary.duration} - ]); + {data: `${ref.substring(0, 6).toUpperCase()}`}, + {data: `${Util.stringToUnicodeEntities(summary.name)}`}, + {data: `${summary.status === 'completed' ? ':white_check_mark:' : summary.status === 'canceled' ? ':no_entry_sign:' : ':x:'} ${summary.status}`}, + {data: `${summary.numCachedSteps > 0 ? Math.round((summary.numCachedSteps / summary.numTotalSteps) * 100) : 0}%`}, + {data: summary.duration}, + ...(dbcAccount && refsSize > 1 ? [{data: addLink(':whale: Open', GitHub.formatDBCBuildURL(dbcAccount, ref, summary.defaultPlatform))}] : []) + ]); if (summary.error) { buildError = summary.error; } @@ -347,4 +376,8 @@ export class GitHub { core.info(`Writing summary`); await sum.addSeparator().write(); } + + private static formatDBCBuildURL(account: string, ref: string, platform?: string): string { + return `https://app.docker.com/build/accounts/${account}/builds/${(platform ?? 'linux/amd64').replace('/', '-')}/${ref}`; + } } diff --git a/src/types/buildx/history.ts b/src/types/buildx/history.ts index c81faf41..e9a8ed74 100644 --- a/src/types/buildx/history.ts +++ b/src/types/buildx/history.ts @@ -131,5 +131,6 @@ export interface Summary { numTotalSteps: number; numCompletedSteps: number; frontendAttrs?: Record; + defaultPlatform?: string; error?: string; } diff --git a/src/types/github.ts b/src/types/github.ts index 86138546..c8e3ce69 100644 --- a/src/types/github.ts +++ b/src/types/github.ts @@ -62,4 +62,7 @@ export interface BuildSummaryOpts { // eslint-disable-next-line @typescript-eslint/no-explicit-any inputs?: any; bakeDefinition?: BakeDefinition; + // builder options + driver?: string; + endpoint?: string; }