buildx: metadata and refs resolution for build and bake

Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
This commit is contained in:
CrazyMax
2024-04-24 17:33:01 +02:00
parent e03b1899b0
commit 97b80719d2
6 changed files with 168 additions and 41 deletions

View File

@@ -14,13 +14,17 @@
* limitations under the License.
*/
import {Buildx} from './buildx';
import {Exec} from '../exec';
import fs from 'fs';
import path from 'path';
import {Build} from './build';
import {Buildx} from './buildx';
import {Context} from '../context';
import {Exec} from '../exec';
import {Util} from '../util';
import {ExecOptions} from '@actions/exec';
import {BakeDefinition} from '../types/bake';
import {BakeDefinition, BakeMetadata} from '../types/bake';
export interface BakeOpts {
buildx?: Buildx;
@@ -47,6 +51,36 @@ export class Bake {
this.buildx = opts?.buildx || new Buildx();
}
public static getMetadataFilePath(): string {
return path.join(Context.tmpDir(), 'metadata-file');
}
public static resolveMetadata(): BakeMetadata | undefined {
const metadataFile = Bake.getMetadataFilePath();
if (!fs.existsSync(metadataFile)) {
return undefined;
}
const content = fs.readFileSync(metadataFile, {encoding: 'utf-8'}).trim();
if (content === 'null') {
return undefined;
}
return <BakeMetadata>JSON.parse(content);
}
public static resolveRefs(): Array<string> | undefined {
const metadata = Bake.resolveMetadata();
if (!metadata) {
return undefined;
}
const refs = new Array<string>();
for (const key in metadata) {
if ('buildx.build.ref' in metadata[key]) {
refs.push(metadata[key]['buildx.build.ref']);
}
}
return refs;
}
public async getDefinition(cmdOpts: BakeCmdOpts, execOptions?: ExecOptions): Promise<BakeDefinition> {
execOptions = execOptions || {ignoreReturnCode: true};
execOptions.ignoreReturnCode = true;

View File

@@ -23,25 +23,27 @@ import {Context} from '../context';
import {GitHub} from '../github';
import {Util} from '../util';
import {BuildMetadata} from '../types/build';
export class Build {
public static getBuildImageIDFilePath(): string {
public static getImageIDFilePath(): string {
return path.join(Context.tmpDir(), 'iidfile');
}
public static getBuildMetadataFilePath(): string {
public static getMetadataFilePath(): string {
return path.join(Context.tmpDir(), 'metadata-file');
}
public static resolveBuildImageID(): string | undefined {
const iidFile = Build.getBuildImageIDFilePath();
public static resolveImageID(): string | undefined {
const iidFile = Build.getImageIDFilePath();
if (!fs.existsSync(iidFile)) {
return undefined;
}
return fs.readFileSync(iidFile, {encoding: 'utf-8'}).trim();
}
public static resolveBuildMetadata(): string | undefined {
const metadataFile = Build.getBuildMetadataFilePath();
public static resolveMetadata(): BuildMetadata | undefined {
const metadataFile = Build.getMetadataFilePath();
if (!fs.existsSync(metadataFile)) {
return undefined;
}
@@ -49,37 +51,47 @@ export class Build {
if (content === 'null') {
return undefined;
}
return content;
return <BuildMetadata>JSON.parse(content);
}
public static resolveDigest(): string | undefined {
const metadata = Build.resolveBuildMetadata();
if (metadata === undefined) {
public static resolveRef(): string | undefined {
const metadata = Build.resolveMetadata();
if (!metadata) {
return undefined;
}
const metadataJSON = JSON.parse(metadata);
if (metadataJSON['containerimage.digest']) {
return metadataJSON['containerimage.digest'];
if ('buildx.build.ref' in metadata) {
return metadata['buildx.build.ref'];
}
return undefined;
}
public static resolveBuildSecretString(kvp: string): string {
const [key, file] = Build.resolveBuildSecret(kvp, false);
public static resolveDigest(): string | undefined {
const metadata = Build.resolveMetadata();
if (!metadata) {
return undefined;
}
if ('containerimage.digest' in metadata) {
return metadata['containerimage.digest'];
}
return undefined;
}
public static resolveSecretString(kvp: string): string {
const [key, file] = Build.resolveSecret(kvp, false);
return `id=${key},src=${file}`;
}
public static resolveBuildSecretFile(kvp: string): string {
const [key, file] = Build.resolveBuildSecret(kvp, true);
public static resolveSecretFile(kvp: string): string {
const [key, file] = Build.resolveSecret(kvp, true);
return `id=${key},src=${file}`;
}
public static resolveBuildSecretEnv(kvp: string): string {
public static resolveSecretEnv(kvp: string): string {
const [key, value] = Build.parseSecretKvp(kvp);
return `id=${key},env=${value}`;
}
public static resolveBuildSecret(kvp: string, file: boolean): [string, string] {
public static resolveSecret(kvp: string, file: boolean): [string, string] {
const [key, _value] = Build.parseSecretKvp(kvp);
let value = _value;
if (file) {