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${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