From bf2bfaf7939b01cb35567068e65f3bf319fa6397 Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Wed, 19 Jun 2024 20:40:35 +0200 Subject: [PATCH] github(summary): add collapsible section for build inputs and bake def Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- __tests__/fixtures/hello-err.Dockerfile | 19 +++++ __tests__/github.test.itg.ts | 93 ++++++++++++++++++++----- src/github.ts | 30 +++++--- 3 files changed, 114 insertions(+), 28 deletions(-) create mode 100644 __tests__/fixtures/hello-err.Dockerfile diff --git a/__tests__/fixtures/hello-err.Dockerfile b/__tests__/fixtures/hello-err.Dockerfile new file mode 100644 index 00000000..5bc7b366 --- /dev/null +++ b/__tests__/fixtures/hello-err.Dockerfile @@ -0,0 +1,19 @@ +# syntax=docker/dockerfile:1 + +# Copyright 2024 actions-toolkit authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM busybox:latest +ARGGG NAME=foo +RUN echo "hello $NAME" diff --git a/__tests__/github.test.itg.ts b/__tests__/github.test.itg.ts index 2163a765..12ce5619 100644 --- a/__tests__/github.test.itg.ts +++ b/__tests__/github.test.itg.ts @@ -118,29 +118,20 @@ maybe('writeBuildSummary', () => { test.each([ [ 'single', - [ - 'bake', - '-f', path.join(fixturesDir, 'hello-bake.hcl'), - 'hello' - ], + path.join(fixturesDir, 'hello-bake.hcl'), + 'hello' ], [ 'group', - [ - 'bake', - '-f', path.join(fixturesDir, 'hello-bake.hcl'), - 'hello-all' - ], + path.join(fixturesDir, 'hello-bake.hcl'), + 'hello-all' ], [ 'matrix', - [ - 'bake', - '-f', path.join(fixturesDir, 'hello-bake.hcl'), - 'hello-matrix' - ], + path.join(fixturesDir, 'hello-bake.hcl'), + 'hello-matrix' ] - ])('write bake summary %p', async (_, bargs) => { + ])('write bake summary %p', async (_, file, target) => { const buildx = new Buildx(); const bake = new Bake({buildx: buildx}); @@ -150,7 +141,9 @@ maybe('writeBuildSummary', () => { // prettier-ignore const buildCmd = await buildx.getCommand([ '--builder', process.env.CTN_BUILDER_NAME ?? 'default', - ...bargs, + 'bake', + '-f', file, + target, '--metadata-file', bake.getMetadataFilePath() ]); await Exec.exec(buildCmd.command, buildCmd.args, { @@ -159,6 +152,16 @@ maybe('writeBuildSummary', () => { })() ).resolves.not.toThrow(); + const definition = await bake.getDefinition( + { + files: [file], + targets: [target], + }, + { + cwd: fixturesDir + } + ); + const metadata = bake.resolveMetadata(); expect(metadata).toBeDefined(); const buildRefs = bake.resolveRefs(metadata); @@ -186,6 +189,62 @@ maybe('writeBuildSummary', () => { uploadRes: uploadRes, inputs: { files: path.join(fixturesDir, 'hello-bake.hcl') + }, + bakeDefinition: definition + }); + }); + + it('fails with dockerfile syntax issue', 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-err.Dockerfile'), + fixturesDir, + '--metadata-file', build.getMetadataFilePath() + ]); + await Exec.exec(buildCmd.command, buildCmd.args); + })() + ).rejects.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(); + + const uploadRes = await GitHub.uploadArtifact({ + filename: exportRes?.dockerbuildFilename, + mimeType: 'application/gzip', + retentionDays: 1 + }); + expect(uploadRes).toBeDefined(); + expect(uploadRes?.url).toBeDefined(); + + await GitHub.writeBuildSummary({ + exportRes: exportRes, + uploadRes: uploadRes, + inputs: { + context: fixturesDir, + file: path.join(fixturesDir, 'hello-err.Dockerfile') } }); }); diff --git a/src/github.ts b/src/github.ts index 5fd1d5a8..3a8d37f8 100644 --- a/src/github.ts +++ b/src/github.ts @@ -229,7 +229,7 @@ export class GitHub { // prettier-ignore const sum = core.summary - .addHeading('Docker Build summary', 1) + .addHeading('Docker Build summary', 2) .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() @@ -246,8 +246,8 @@ export class GitHub { .addRaw(addLink('Let us know', 'https://docs.docker.com/feedback/gha-build-summary')) .addRaw('

'); - sum.addHeading('Preview', 2); - + // Preview + sum.addRaw(`
📋 Preview`); const summaryTableData: Array> = [ [ {header: true, data: 'ID'}, @@ -279,19 +279,27 @@ export class GitHub { sum.addHeading('Error', 4); sum.addCodeBlock(summaryError, 'text'); } + sum.addRaw(`
`); + // Build inputs if (opts.inputs) { - sum.addHeading('Build inputs', 2).addCodeBlock( - jsyaml.dump(opts.inputs, { - indent: 2, - lineWidth: -1 - }), - 'yaml' - ); + // prettier-ignore + sum.addRaw(`
🛠️ Build inputs`) + .addCodeBlock( + jsyaml.dump(opts.inputs, { + indent: 2, + lineWidth: -1 + }), 'yaml' + ) + .addRaw(`
`); } + // Bake definition if (opts.bakeDefinition) { - sum.addHeading('Bake definition', 2).addCodeBlock(JSON.stringify(opts.bakeDefinition, null, 2), 'json'); + // prettier-ignore + sum.addRaw(`
🗒️ Bake definition`) + .addCodeBlock(JSON.stringify(opts.bakeDefinition, null, 2), 'json') + .addRaw(`
`); } core.info(`Writing summary`);