Skip to content

Commit

Permalink
Add build-metadata output
Browse files Browse the repository at this point in the history
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
  • Loading branch information
crazy-max committed Jul 29, 2021
1 parent ad1d2e9 commit cbe434d
Show file tree
Hide file tree
Showing 9 changed files with 136 additions and 28 deletions.
40 changes: 32 additions & 8 deletions .github/workflows/ci.yml
Expand Up @@ -72,7 +72,10 @@ jobs:
docker buildx imagetools inspect localhost:5000/name/app:1.0.0
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
run: echo "${{ steps.docker_build.outputs.digest }}"
-
name: Build result metadata
run: echo "${{ steps.docker_build.outputs.build-metadata }}" | jq
-
name: Check digest
run: |
Expand Down Expand Up @@ -135,7 +138,10 @@ jobs:
docker buildx imagetools inspect localhost:5000/name/app:1.0.0
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
run: echo "${{ steps.docker_build.outputs.digest }}"
-
name: Build result metadata
run: echo "${{ steps.docker_build.outputs.build-metadata }}" | jq
-
name: Check digest
run: |
Expand Down Expand Up @@ -193,7 +199,10 @@ jobs:
docker buildx imagetools inspect localhost:5000/name/app:1.0.0
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
run: echo "${{ steps.docker_build.outputs.digest }}"
-
name: Build result metadata
run: echo "${{ steps.docker_build.outputs.build-metadata }}" | jq
-
name: Check digest
run: |
Expand Down Expand Up @@ -394,7 +403,10 @@ jobs:
docker buildx imagetools inspect localhost:5000/name/app:1.0.0
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
run: echo "${{ steps.docker_build.outputs.digest }}"
-
name: Build result metadata
run: echo "${{ steps.docker_build.outputs.build-metadata }}" | jq
-
name: Check digest
run: |
Expand Down Expand Up @@ -449,7 +461,10 @@ jobs:
docker buildx imagetools inspect localhost:5000/name/app:latest
-
name: Image digest (1)
run: echo ${{ steps.docker_build.outputs.digest }}
run: echo "${{ steps.docker_build.outputs.digest }}"
-
name: Build result metadata (1)
run: echo "${{ steps.docker_build.outputs.build-metadata }}" | jq
-
name: Check digest (1)
run: |
Expand Down Expand Up @@ -482,7 +497,10 @@ jobs:
docker buildx imagetools inspect localhost:5000/name/app:latest
-
name: Image digest (2)
run: echo ${{ steps.docker_build2.outputs.digest }}
run: echo "${{ steps.docker_build2.outputs.digest }}"
-
name: Build result metadata (2)
run: echo "${{ steps.docker_build2.outputs.build-metadata }}" | jq
-
name: Check digest (2)
run: |
Expand Down Expand Up @@ -559,7 +577,10 @@ jobs:
docker buildx imagetools inspect localhost:5000/name/app:1.0.0
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
run: echo "${{ steps.docker_build.outputs.digest }}"
-
name: Build result metadata
run: echo "${{ steps.docker_build.outputs.build-metadata }}" | jq
-
name: Check digest
run: |
Expand Down Expand Up @@ -624,7 +645,10 @@ jobs:
docker buildx imagetools inspect localhost:5000/name/app:1.0.0
-
name: Image digest
run: echo ${{ steps.docker_build.outputs.digest }}
run: echo "${{ steps.docker_build.outputs.digest }}"
-
name: Build result metadata
run: echo "${{ steps.docker_build.outputs.build-metadata }}" | jq
-
name: Check digest
run: |
Expand Down
7 changes: 4 additions & 3 deletions README.md
Expand Up @@ -223,9 +223,10 @@ Following inputs can be used as `step.with` keys
Following outputs are available
| Name | Type | Description |
|---------------|---------|---------------------------------------|
| `digest` | String | Image content-addressable identifier also called a digest |
| Name | Type | Description |
|-------------------|---------|---------------------------------------|
| `digest` | String | Image content-addressable identifier also called a digest |
| `build-metadata` | JSON | Build result metadata |
## Troubleshooting
Expand Down
15 changes: 15 additions & 0 deletions __tests__/buildx.test.ts
Expand Up @@ -8,6 +8,10 @@ import * as context from '../src/context';

const tmpNameSync = path.join('/tmp/.docker-build-push-jest', '.tmpname-jest').split(path.sep).join(path.posix.sep);
const digest = 'sha256:bfb45ab72e46908183546477a08f8867fc40cebadd00af54b071b097aed127a9';
const buildMetadata = `{
"containerimage.config.digest": "sha256:059b68a595b22564a1cbc167af369349fdc2ecc1f7bc092c2235cbf601a795fd",
"containerimage.digest": "sha256:b09b9482c72371486bb2c1d2c2a2633ed1d0b8389e12c8d52b9e052725c0c83c"
}`;

jest.spyOn(context, 'tmpDir').mockImplementation((): string => {
const tmpDir = path.join('/tmp/.docker-build-push-jest').split(path.sep).join(path.posix.sep);
Expand All @@ -32,6 +36,17 @@ describe('getImageID', () => {
});
});

describe('getBuildMetadata', () => {
it('matches', async () => {
const metadataFile = await buildx.getMetadataFile();
console.log(`metadataFile: ${metadataFile}`);
await fs.writeFileSync(metadataFile, buildMetadata);
const metadata = await buildx.getBuildMetadata();
console.log(`metadata: ${metadata}`);
expect(metadata).toEqual(buildMetadata);
});
});

describe('isLocalOrTarExporter', () => {
// prettier-ignore
test.each([
Expand Down
25 changes: 24 additions & 1 deletion __tests__/context.test.ts
Expand Up @@ -425,7 +425,30 @@ ccc`],
'--output', 'type=local,dest=./release-out',
'.'
]
]
],
[
'0.6.0',
new Map<string, string>([
['context', '.'],
['tag', 'localhost:5000/name/app:latest'],
['file', './test/Dockerfile'],
['network', 'host'],
['load', 'false'],
['no-cache', 'false'],
['push', 'true'],
['pull', 'false']
]),
[
'buildx',
'build',
'--iidfile', '/tmp/.docker-build-push-jest/iidfile',
'--metadata-file', '/tmp/.docker-build-push-jest/metadata-file',
'--file', './test/Dockerfile',
'--network', 'host',
'--push',
'.'
]
],
])(
'given %p with %p as inputs, returns %p',
async (buildxVersion: string, inputs: Map<string, any>, expected: Array<string>) => {
Expand Down
2 changes: 2 additions & 0 deletions action.yml
Expand Up @@ -79,6 +79,8 @@ inputs:
outputs:
digest:
description: 'Image content-addressable identifier also called a digest'
build-metadata:
description: 'Build result metadata'

runs:
using: 'node12'
Expand Down
40 changes: 32 additions & 8 deletions dist/index.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions src/buildx.ts
Expand Up @@ -18,6 +18,18 @@ export async function getImageID(): Promise<string | undefined> {
return fs.readFileSync(iidFile, {encoding: 'utf-8'});
}

export async function getMetadataFile(): Promise<string> {
return path.join(context.tmpDir(), 'metadata-file').split(path.sep).join(path.posix.sep);
}

export async function getBuildMetadata(): Promise<string | undefined> {
const metadataFile = await getMetadataFile();
if (!fs.existsSync(metadataFile)) {
return undefined;
}
return fs.readFileSync(metadataFile, {encoding: 'utf-8'});
}

export async function getSecretString(kvp: string): Promise<string> {
return getSecret(kvp, false);
}
Expand Down
4 changes: 3 additions & 1 deletion src/context.ts
Expand Up @@ -2,7 +2,6 @@ import csvparse from 'csv-parse/lib/sync';
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import * as semver from 'semver';
import * as tmp from 'tmp';

import * as core from '@actions/core';
Expand Down Expand Up @@ -122,6 +121,9 @@ async function getBuildArgs(inputs: Inputs, defaultContext: string, buildxVersio
if (!buildx.isLocalOrTarExporter(inputs.outputs) && (inputs.platforms.length == 0 || buildx.satisfies(buildxVersion, '>=0.4.2'))) {
args.push('--iidfile', await buildx.getImageIDFile());
}
if (buildx.satisfies(buildxVersion, '>=0.6.0')) {
args.push('--metadata-file', await buildx.getMetadataFile());
}
await asyncForEach(inputs.cacheFrom, async cacheFrom => {
args.push('--cache-from', cacheFrom);
});
Expand Down
19 changes: 12 additions & 7 deletions src/main.ts
Expand Up @@ -33,13 +33,18 @@ async function run(): Promise<void> {
}
});

const imageID = await buildx.getImageID();
if (imageID) {
core.startGroup(`Extracting digest`);
core.info(`${imageID}`);
context.setOutput('digest', imageID);
core.endGroup();
}
await core.group(`Setting outputs`, async () => {
const imageID = await buildx.getImageID();
const buildMetadata = await buildx.getBuildMetadata();
if (imageID) {
core.info(`digest=${imageID}`);
context.setOutput('digest', imageID);
}
if (buildMetadata) {
core.info(`build-metadata=${buildMetadata}`);
context.setOutput('build-metadata', buildMetadata);
}
});
} catch (error) {
core.setFailed(error.message);
}
Expand Down

0 comments on commit cbe434d

Please sign in to comment.