Skip to content

Commit

Permalink
github(summary): add collapsible section for build inputs and bake def
Browse files Browse the repository at this point in the history
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
  • Loading branch information
crazy-max committed Jun 20, 2024
1 parent b5ae9cc commit bf2bfaf
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 28 deletions.
19 changes: 19 additions & 0 deletions __tests__/fixtures/hello-err.Dockerfile
Original file line number Diff line number Diff line change
@@ -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"
93 changes: 76 additions & 17 deletions __tests__/github.test.itg.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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});

Expand All @@ -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, {
Expand All @@ -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);
Expand Down Expand Up @@ -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')
}
});
});
Expand Down
30 changes: 19 additions & 11 deletions src/github.ts
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ export class GitHub {

// prettier-ignore
const sum = core.summary
.addHeading('Docker Build summary', 1)
.addHeading('Docker Build summary', 2)
.addRaw(`<p>`)
.addRaw(`For a detailed look at the build, download the following build record archive and import it into Docker Desktop's Builds view. `)
.addBreak()
Expand All @@ -246,8 +246,8 @@ export class GitHub {
.addRaw(addLink('Let us know', 'https://docs.docker.com/feedback/gha-build-summary'))
.addRaw('</p>');

sum.addHeading('Preview', 2);

// Preview
sum.addRaw(`<details open><summary>📋 <strong>Preview</strong></summary>`);
const summaryTableData: Array<Array<SummaryTableCell>> = [
[
{header: true, data: 'ID'},
Expand Down Expand Up @@ -279,19 +279,27 @@ export class GitHub {
sum.addHeading('Error', 4);
sum.addCodeBlock(summaryError, 'text');
}
sum.addRaw(`</details>`);

// Build inputs
if (opts.inputs) {
sum.addHeading('Build inputs', 2).addCodeBlock(
jsyaml.dump(opts.inputs, {
indent: 2,
lineWidth: -1
}),
'yaml'
);
// prettier-ignore
sum.addRaw(`<details><summary>🛠️ <strong>Build inputs</strong></summary>`)
.addCodeBlock(
jsyaml.dump(opts.inputs, {
indent: 2,
lineWidth: -1
}), 'yaml'
)
.addRaw(`</details>`);
}

// Bake definition
if (opts.bakeDefinition) {
sum.addHeading('Bake definition', 2).addCodeBlock(JSON.stringify(opts.bakeDefinition, null, 2), 'json');
// prettier-ignore
sum.addRaw(`<details><summary>🗒️ <strong>Bake definition</strong></summary>`)
.addCodeBlock(JSON.stringify(opts.bakeDefinition, null, 2), 'json')
.addRaw(`</details>`);
}

core.info(`Writing summary`);
Expand Down

0 comments on commit bf2bfaf

Please sign in to comment.