From 926b923d82acbe9d5b686d6df290139610d3f45a Mon Sep 17 00:00:00 2001 From: Nicolas Beck Date: Wed, 30 Apr 2025 13:56:09 +0200 Subject: [PATCH] feat: add support for Docker Build Cloud summary and refactor summary state - Add summaryType state to distinguish between buildx and cloud summaries. - Generate a Docker Build Cloud summary with a direct link to build details on app.docker.com when using the cloud driver. - Refactor state-helper to use summaryType instead of isSummarySupported. - Improve summary selection logic and output for both buildx and cloud drivers. - Add informative logging for cloud build summary links. Signed-off-by: Nicolas Beck --- src/main.ts | 21 +++++++++++++++++---- src/state-helper.ts | 6 +++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main.ts b/src/main.ts index 538ec08..2b1d201 100644 --- a/src/main.ts +++ b/src/main.ts @@ -50,7 +50,7 @@ actionsToolkit.run( let dockerConfig: ConfigFile | undefined; let dockerConfigMalformed = false; try { - dockerConfig = await Docker.configFile(); + dockerConfig = Docker.configFile(); } catch (e) { dockerConfigMalformed = true; core.warning(`Unable to parse config file ${path.join(Docker.configDir, 'config.json')}: ${e}`); @@ -174,12 +174,13 @@ actionsToolkit.run( } else if (!(await toolkit.buildx.versionSatisfies('>=0.13.0'))) { core.info('Build summary requires Buildx >= 0.13.0'); } else if (builder && builder.driver === 'cloud') { - core.info('Build summary is not yet supported with Docker Build Cloud'); + core.info('Build summary supported for cloud driver!'); + stateHelper.setSummaryType('cloud'); } else if (!ref) { core.info('Build summary requires a build reference'); } else { core.info('Build summary supported!'); - stateHelper.setSummarySupported(); + stateHelper.setSummaryType('buildx'); } }); @@ -189,7 +190,7 @@ actionsToolkit.run( }, // post async () => { - if (stateHelper.isSummarySupported) { + if (stateHelper.summaryType === 'buildx') { await core.group(`Generating build summary`, async () => { try { const recordUploadEnabled = buildRecordUploadEnabled(); @@ -222,6 +223,18 @@ actionsToolkit.run( core.warning(e.message); } }); + } else if (stateHelper.summaryType === 'cloud' && stateHelper.buildRef) { + const [, platform, refId] = stateHelper.buildRef.split('/'); + if (platform && refId) { + const buildUrl = `https://app.docker.com/build/accounts/docker/builds/${platform}/${refId}`; + + core.info(`View build details: ${buildUrl}`); + + const sum = core.summary.addHeading('Docker Build Cloud summary', 2); + sum.addRaw('

').addRaw('Your build was executed using Docker Build Cloud. ').addRaw('You can view detailed build information, logs, and results here: ').addLink(buildUrl, buildUrl).addRaw('

'); + sum.addRaw('

').addRaw('For more information about Docker Build Cloud, see ').addLink('the documentation', 'https://docs.docker.com/build/cloud/').addRaw('.').addRaw('

'); + await sum.addSeparator().write(); + } } if (stateHelper.tmpDir.length > 0) { await core.group(`Removing temp folder ${stateHelper.tmpDir}`, async () => { diff --git a/src/state-helper.ts b/src/state-helper.ts index 200771c..d174c4c 100644 --- a/src/state-helper.ts +++ b/src/state-helper.ts @@ -6,7 +6,7 @@ import {Inputs} from './context'; export const tmpDir = process.env['STATE_tmpDir'] || ''; export const buildRef = process.env['STATE_buildRef'] || ''; -export const isSummarySupported = !!process.env['STATE_isSummarySupported']; +export const summaryType = process.env['STATE_summaryType'] || undefined; export const summaryInputs = process.env['STATE_summaryInputs'] ? JSON.parse(process.env['STATE_summaryInputs']) : undefined; export function setTmpDir(tmpDir: string) { @@ -17,8 +17,8 @@ export function setBuildRef(buildRef: string) { core.saveState('buildRef', buildRef); } -export function setSummarySupported() { - core.saveState('isSummarySupported', 'true'); +export function setSummaryType(summaryType: string) { + core.saveState('summaryType', summaryType); } export function setSummaryInputs(inputs: Inputs) {