Skip to content

Commit e266e3e

Browse files
committed
buildx(build): resolveProvenance from metadata
Signed-off-by: CrazyMax <[email protected]>
1 parent 1b7201d commit e266e3e

4 files changed

Lines changed: 74 additions & 8 deletions

File tree

__tests__/buildx/build.test.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,11 @@ import * as rimraf from 'rimraf';
2222
import {Context} from '../../src/context';
2323
import {Build} from '../../src/buildx/build';
2424

25-
import {BuildMetadata} from '../../src/types/buildx/build';
26-
2725
const fixturesDir = path.join(__dirname, '..', 'fixtures');
2826
// prettier-ignore
2927
const tmpDir = path.join(process.env.TEMP || '/tmp', 'buildx-inputs-jest');
3028
const tmpName = path.join(tmpDir, '.tmpname-jest');
31-
const metadata: BuildMetadata = {
32-
'buildx.build.ref': 'default/default/n6ibcp9b2pw108rrz7ywdznvo',
33-
'containerimage.config.digest': 'sha256:059b68a595b22564a1cbc167f369349fdc2ecc1f7bc092c2235cbf601a795fd',
34-
'containerimage.digest': 'sha256:b09b9482c72371486bb2c1d2c2a2633ed1d0b8389e12c8d52b9e052725c0c83c'
35-
};
29+
const metadata = JSON.parse(fs.readFileSync(path.join(fixturesDir, 'metadata.json'), 'utf-8'));
3630

3731
jest.spyOn(Context, 'tmpDir').mockImplementation((): string => {
3832
if (!fs.existsSync(tmpDir)) {
@@ -78,6 +72,18 @@ describe('resolveRef', () => {
7872
});
7973
});
8074

75+
describe('resolveProvenance', () => {
76+
it('matches', async () => {
77+
const build = new Build();
78+
fs.writeFileSync(build.getMetadataFilePath(), JSON.stringify(metadata));
79+
const provenance = build.resolveProvenance();
80+
expect(provenance).toBeDefined();
81+
expect(provenance?.buildType).toEqual('https://mobyproject.org/buildkit@v1');
82+
expect(provenance?.materials).toBeDefined();
83+
expect(provenance?.materials?.length).toEqual(2);
84+
});
85+
});
86+
8187
describe('resolveDigest', () => {
8288
it('matches', async () => {
8389
const build = new Build();

__tests__/fixtures/metadata.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"buildx.build.provenance": {
3+
"buildType": "https://mobyproject.org/buildkit@v1",
4+
"materials": [
5+
{
6+
"uri": "pkg:docker/docker/dockerfile-upstream@master",
7+
"digest": {
8+
"sha256": "70433342168dafa34d11bd7236c3c3fcf448b90539733281711050808f32e835"
9+
}
10+
},
11+
{
12+
"uri": "pkg:docker/busybox@latest?platform=linux%2Famd64",
13+
"digest": {
14+
"sha256": "9ae97d36d26566ff84e8893c64a6dc4fe8ca6d1144bf5b87b2b85a32def253c7"
15+
}
16+
}
17+
],
18+
"invocation": {
19+
"configSource": {
20+
"entryPoint": "Dockerfile"
21+
},
22+
"parameters": {
23+
"frontend": "gateway.v0",
24+
"args": {
25+
"cmdline": "docker/dockerfile-upstream:master",
26+
"source": "docker/dockerfile-upstream:master"
27+
},
28+
"locals": [
29+
{
30+
"name": "context"
31+
},
32+
{
33+
"name": "dockerfile"
34+
}
35+
]
36+
},
37+
"environment": {
38+
"platform": "linux/amd64"
39+
}
40+
}
41+
},
42+
"buildx.build.ref": "default/default/n6ibcp9b2pw108rrz7ywdznvo",
43+
"containerimage.config.digest": "sha256:059b68a595b22564a1cbc167f369349fdc2ecc1f7bc092c2235cbf601a795fd",
44+
"containerimage.digest": "sha256:b09b9482c72371486bb2c1d2c2a2633ed1d0b8389e12c8d52b9e052725c0c83c"
45+
}

src/buildx/build.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {GitHub} from '../github';
2525
import {Util} from '../util';
2626

2727
import {BuildMetadata} from '../types/buildx/build';
28+
import {ProvenancePredicate} from '../types/intoto/slsa_provenance/v0.2/provenance';
2829

2930
export interface BuildOpts {
3031
buildx?: Buildx;
@@ -82,6 +83,19 @@ export class Build {
8283
return undefined;
8384
}
8485

86+
public resolveProvenance(metadata?: BuildMetadata): ProvenancePredicate | undefined {
87+
if (!metadata) {
88+
metadata = this.resolveMetadata();
89+
if (!metadata) {
90+
return undefined;
91+
}
92+
}
93+
if ('buildx.build.provenance' in metadata) {
94+
return metadata['buildx.build.provenance'] as ProvenancePredicate;
95+
}
96+
return undefined;
97+
}
98+
8599
public resolveDigest(metadata?: BuildMetadata): string | undefined {
86100
if (!metadata) {
87101
metadata = this.resolveMetadata();

src/types/buildx/build.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@
1515
*/
1616

1717
export type BuildMetadata = {
18-
[key: string]: string;
18+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
19+
[key: string]: any;
1920
};

0 commit comments

Comments
 (0)