diff --git a/src/buildah.ts b/src/buildah.ts index d6c2ee1..3068049 100644 --- a/src/buildah.ts +++ b/src/buildah.ts @@ -15,12 +15,13 @@ export interface BuildahConfigSettings { port?: string; workingdir?: string; arch?: string; + platform?: string; } interface Buildah { buildUsingDocker( image: string, context: string, containerFiles: string[], buildArgs: string[], - useOCI: boolean, arch: string, layers: string, extraArgs: string[] + useOCI: boolean, arch: string, platform: string, layers: string, extraArgs: string[] ): Promise; from(baseImage: string): Promise; config(container: string, setting: BuildahConfigSettings): Promise; @@ -63,13 +64,17 @@ export class BuildahCli implements Buildah { async buildUsingDocker( image: string, context: string, containerFiles: string[], buildArgs: string[], - useOCI: boolean, arch: string, layers: string, extraArgs: string[] + useOCI: boolean, arch: string, platform: string, layers: string, extraArgs: string[] ): Promise { const args: string[] = [ "bud" ]; if (arch) { args.push("--arch"); args.push(arch); } + if (platform) { + args.push("--platform"); + args.push(platform); + } containerFiles.forEach((file) => { args.push("-f"); args.push(file); @@ -135,6 +140,10 @@ export class BuildahCli implements Buildah { args.push("--arch"); args.push(settings.arch); } + if (settings.platform) { + args.push("--platform"); + args.push(settings.platform); + } if (settings.workingdir) { args.push("--workingdir"); args.push(settings.workingdir); diff --git a/src/generated/inputs-outputs.ts b/src/generated/inputs-outputs.ts index 957b0d4..ea5f542 100644 --- a/src/generated/inputs-outputs.ts +++ b/src/generated/inputs-outputs.ts @@ -12,6 +12,12 @@ export enum Inputs { * Default: None. */ ARCHS = "archs", + /** + * Label the image with this PLATFORM, instead of defaulting to the host platform. + * Required: false + * Default: None. + */ + PLATFORM = "platform", /** * The base image to use to create a new container image * Required: false diff --git a/src/index.ts b/src/index.ts index 5c9783c..3ab97f6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,7 +9,7 @@ import * as path from "path"; import { Inputs, Outputs } from "./generated/inputs-outputs"; import { BuildahCli, BuildahConfigSettings } from "./buildah"; import { - getArch, getContainerfiles, getInputList, splitByNewline, + getArch, getPlatform, getContainerfiles, getInputList, splitByNewline, } from "./utils"; export async function run(): Promise { @@ -43,12 +43,13 @@ export async function run(): Promise { const useOCI = core.getInput(Inputs.OCI) === "true"; const arch = getArch(); + const platform = getPlatform(); if (containerFiles.length !== 0) { - await doBuildUsingContainerFiles(cli, newImage, workspace, containerFiles, useOCI, arch); + await doBuildUsingContainerFiles(cli, newImage, workspace, containerFiles, useOCI, arch, platform); } else { - await doBuildFromScratch(cli, newImage, useOCI, arch); + await doBuildFromScratch(cli, newImage, useOCI, arch, platform); } if (tagsList.length > 1) { @@ -60,7 +61,8 @@ export async function run(): Promise { } async function doBuildUsingContainerFiles( - cli: BuildahCli, newImage: string, workspace: string, containerFiles: string[], useOCI: boolean, arch: string + cli: BuildahCli, newImage: string, workspace: string, containerFiles: string[], useOCI: boolean, arch: string, + platform: string ): Promise { if (containerFiles.length === 1) { core.info(`Performing build from Containerfile`); @@ -83,12 +85,12 @@ async function doBuildUsingContainerFiles( buildahBudExtraArgs = lines.flatMap((line) => line.split(" ")).map((arg) => arg.trim()); } await cli.buildUsingDocker( - newImage, context, containerFileAbsPaths, buildArgs, useOCI, arch, layers, buildahBudExtraArgs + newImage, context, containerFileAbsPaths, buildArgs, useOCI, arch, platform, layers, buildahBudExtraArgs ); } async function doBuildFromScratch( - cli: BuildahCli, newImage: string, useOCI: boolean, arch: string + cli: BuildahCli, newImage: string, useOCI: boolean, arch: string, platform: string ): Promise { core.info(`Performing build from scratch`); @@ -108,6 +110,7 @@ async function doBuildFromScratch( workingdir: workingDir, envs, arch, + platform, }; await cli.config(containerId, newImageConfig); await cli.copy(containerId, content); diff --git a/src/utils.ts b/src/utils.ts index 37a708c..d4fe3c2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -81,6 +81,10 @@ export function getArch(): string { return arch || archs; } +export function getPlatform(): string { + return core.getInput(Inputs.PLATFORM); +} + export function getContainerfiles(): string[] { // 'containerfile' should be used over 'dockerfile', // see https://github.com/redhat-actions/buildah-build/issues/57