add support for building images with docker files (#4) (#5)

* add support for building images with docker files (#4)

Signed-off-by: Luca Stocchi <lstocchi@redhat.com>

* fix issues when building image with dockerfile

Signed-off-by: Luca Stocchi <lstocchi@redhat.com>

* update readme

Signed-off-by: Luca Stocchi <lstocchi@redhat.com>

* Update README.md

Co-authored-by: Divyanshu Agrawal <diagrawa@redhat.com>

Co-authored-by: Divyanshu Agrawal <diagrawa@redhat.com>
This commit is contained in:
Luca Stocchi 2020-11-19 09:19:57 +01:00 committed by GitHub
parent 329be0a470
commit deaddbe502
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 137 additions and 43 deletions

View file

@ -3,6 +3,7 @@ import * as exec from "@actions/exec";
import { CommandResult } from "./types";
interface Buildah {
buildUsingDocker(image: string, context: string, dockerFiles: string[]): Promise<CommandResult>;
from(baseImage: string): Promise<CommandResult>;
copy(container: string, contentToCopy: string[]): Promise<CommandResult>;
config(container: string, setting: {}): Promise<CommandResult>;
@ -24,6 +25,18 @@ export class BuildahCli implements Buildah {
this.executable = executable;
}
async buildUsingDocker(image: string, context: string, dockerFiles: string[]): Promise<CommandResult> {
const args: string[] = ['bud'];
dockerFiles.forEach(file => {
args.push('-f');
args.push(file);
});
args.push('-t');
args.push(image);
args.push(context);
return await this.execute(args);
}
async from(baseImage: string): Promise<CommandResult> {
return await this.execute(['from', baseImage]);
}

View file

@ -7,23 +7,45 @@ import * as path from 'path';
import { Language } from 'language-recognizer/lib/types';
export async function run(): Promise<void> {
if (process.env.RUNNER_OS !== 'Linux') {
return Promise.reject(new Error('Only linux platform is supported at this time.'));
}
// get buildah cli
const buildahPath = await io.which('buildah', true);
const cli: BuildahCli = new BuildahCli(buildahPath);
const workspace = process.env['GITHUB_WORKSPACE'];
let dockerFiles = getInputList('dockerfiles');
const newImage = core.getInput('image');
if (dockerFiles.length !== 0) {
doBuildUsingDockerFiles(cli, newImage, workspace, dockerFiles);
} else {
doBuildFromScratch(cli, newImage, workspace);
}
}
async function doBuildUsingDockerFiles(cli: BuildahCli, newImage: string, workspace: string, dockerFiles: string[]): Promise<void> {
const context = path.join(workspace, core.getInput('context'));
dockerFiles = dockerFiles.map(file => path.join(workspace, file));
const build = await cli.buildUsingDocker(newImage, context, dockerFiles);
if (build.succeeded === false) {
return Promise.reject(new Error('Failed building an image from docker files.'));
}
}
async function doBuildFromScratch(cli: BuildahCli, newImage: string, workspace: string) {
let baseImage = core.getInput('base-image');
const content = getInputList('content');
const newImageName = core.getInput('new-image-name');
const content = getInputList('content');
const entrypoint = getInputList('entrypoint');
const port = core.getInput('port');
const workingDir = core.getInput('working-dir');
const envs = getInputList('envs');
if (process.env.RUNNER_OS !== 'Linux') {
return Promise.reject(new Error('Only linux platform is supported at this time.'));
}
// get buildah cli
const buildahPath = await io.which('buildah', true);
// if base-image is not specified by the user we need to pick one automatically
if (!baseImage) {
const workspace = process.env['GITHUB_WORKSPACE'];
if (!baseImage) {
if (workspace) {
// check language/framework used and pick base-image automatically
const languages = await recognizer.detectLanguages(workspace);
@ -35,9 +57,7 @@ export async function run(): Promise<void> {
return Promise.reject(new Error('No base image found to create a new container'));
}
}
// create the new image
const cli: BuildahCli = new BuildahCli(buildahPath);
const container = await cli.from(baseImage);
if (container.succeeded === false) {
return Promise.reject(new Error(container.reason));
@ -60,7 +80,7 @@ export async function run(): Promise<void> {
return Promise.reject(new Error(configResult.reason));
}
const commit = await cli.commit(containerId, newImageName, ['--squash']);
const commit = await cli.commit(containerId, newImage, ['--squash']);
if (commit.succeeded === false) {
return Promise.reject(new Error(commit.reason));
}