Compare commits
19 Commits
v0.1.0-bet
...
v0.1.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
abe37ab72b | ||
|
|
b3a30a9e32 | ||
|
|
31e915c017 | ||
|
|
05bbe49fe1 | ||
|
|
c80fedbbae | ||
|
|
2c60cad840 | ||
|
|
847887b312 | ||
|
|
d9984214c9 | ||
|
|
33b4390bc2 | ||
|
|
5e8f679709 | ||
|
|
f288f4f7ea | ||
|
|
cb9121174a | ||
|
|
464dfbe1ec | ||
|
|
5695c0049b | ||
|
|
44b1545abd | ||
|
|
4d9d62d542 | ||
|
|
aa3c8ef106 | ||
|
|
259abb56df | ||
|
|
76e5a25cff |
@@ -15,7 +15,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import {beforeEach, describe, expect, it, jest, test} from '@jest/globals';
|
import {beforeEach, describe, expect, it, jest, test} from '@jest/globals';
|
||||||
import * as semver from 'semver';
|
|
||||||
|
|
||||||
import {BuildKit} from '../../src/buildkit/buildkit';
|
import {BuildKit} from '../../src/buildkit/buildkit';
|
||||||
import {Builder} from '../../src/buildx/builder';
|
import {Builder} from '../../src/buildx/builder';
|
||||||
@@ -48,11 +47,15 @@ jest.spyOn(Builder.prototype, 'inspect').mockImplementation(async (): Promise<Bu
|
|||||||
|
|
||||||
describe('getVersion', () => {
|
describe('getVersion', () => {
|
||||||
it('valid', async () => {
|
it('valid', async () => {
|
||||||
|
const builder = new Builder({
|
||||||
|
context: new Context()
|
||||||
|
});
|
||||||
|
const builderInfo = await builder.inspect('builder2');
|
||||||
const buildkit = new BuildKit({
|
const buildkit = new BuildKit({
|
||||||
context: new Context()
|
context: new Context()
|
||||||
});
|
});
|
||||||
const version = await buildkit.getVersion('builder2');
|
const version = await buildkit.getVersion(builderInfo.nodes[0]);
|
||||||
expect(semver.valid(version)).not.toBeNull();
|
expect(version).toBe('v0.11.0');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -48,9 +48,9 @@ describe('configDir', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('isAvailable', () => {
|
describe('isAvailable', () => {
|
||||||
it('cli', () => {
|
it('cli', async () => {
|
||||||
const execSpy = jest.spyOn(exec, 'getExecOutput');
|
const execSpy = jest.spyOn(exec, 'getExecOutput');
|
||||||
Docker.isAvailable;
|
Docker.getInstance().available;
|
||||||
// eslint-disable-next-line jest/no-standalone-expect
|
// eslint-disable-next-line jest/no-standalone-expect
|
||||||
expect(execSpy).toHaveBeenCalledWith(`docker`, undefined, {
|
expect(execSpy).toHaveBeenCalledWith(`docker`, undefined, {
|
||||||
silent: true,
|
silent: true,
|
||||||
|
|||||||
@@ -69,16 +69,28 @@ describe('getInputList', () => {
|
|||||||
|
|
||||||
it('multiline and ignoring comma correctly', async () => {
|
it('multiline and ignoring comma correctly', async () => {
|
||||||
setInput('cache-from', 'user/app:cache\ntype=local,src=path/to/dir');
|
setInput('cache-from', 'user/app:cache\ntype=local,src=path/to/dir');
|
||||||
const res = Util.getInputList('cache-from', true);
|
const res = Util.getInputList('cache-from', {ignoreComma: true});
|
||||||
expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']);
|
expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('different new lines and ignoring comma correctly', async () => {
|
it('different new lines and ignoring comma correctly', async () => {
|
||||||
setInput('cache-from', 'user/app:cache\r\ntype=local,src=path/to/dir');
|
setInput('cache-from', 'user/app:cache\r\ntype=local,src=path/to/dir');
|
||||||
const res = Util.getInputList('cache-from', true);
|
const res = Util.getInputList('cache-from', {ignoreComma: true});
|
||||||
expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']);
|
expect(res).toEqual(['user/app:cache', 'type=local,src=path/to/dir']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('do not escape surrounding quotes', async () => {
|
||||||
|
setInput('driver-opts', `"env.no_proxy=localhost,127.0.0.1,.mydomain"`);
|
||||||
|
const res = Util.getInputList('driver-opts', {ignoreComma: true, quote: false});
|
||||||
|
expect(res).toEqual(['"env.no_proxy=localhost,127.0.0.1,.mydomain"']);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('escape surrounding quotes', async () => {
|
||||||
|
setInput('platforms', 'linux/amd64\n"linux/arm64,linux/arm/v7"');
|
||||||
|
const res = Util.getInputList('platforms');
|
||||||
|
expect(res).toEqual(['linux/amd64', 'linux/arm64', 'linux/arm/v7']);
|
||||||
|
});
|
||||||
|
|
||||||
it('multiline values', async () => {
|
it('multiline values', async () => {
|
||||||
setInput(
|
setInput(
|
||||||
'secrets',
|
'secrets',
|
||||||
@@ -88,7 +100,7 @@ bbbbbbb
|
|||||||
ccccccccc"
|
ccccccccc"
|
||||||
FOO=bar`
|
FOO=bar`
|
||||||
);
|
);
|
||||||
const res = Util.getInputList('secrets', true);
|
const res = Util.getInputList('secrets', {ignoreComma: true});
|
||||||
expect(res).toEqual([
|
expect(res).toEqual([
|
||||||
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
|
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
|
||||||
`MYSECRET=aaaaaaaa
|
`MYSECRET=aaaaaaaa
|
||||||
@@ -111,7 +123,7 @@ FOO=bar
|
|||||||
bbbb
|
bbbb
|
||||||
ccc"`
|
ccc"`
|
||||||
);
|
);
|
||||||
const res = Util.getInputList('secrets', true);
|
const res = Util.getInputList('secrets', {ignoreComma: true});
|
||||||
expect(res).toEqual([
|
expect(res).toEqual([
|
||||||
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
|
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
|
||||||
`MYSECRET=aaaaaaaa
|
`MYSECRET=aaaaaaaa
|
||||||
@@ -134,7 +146,7 @@ bbbbbbb
|
|||||||
ccccccccc
|
ccccccccc
|
||||||
FOO=bar`
|
FOO=bar`
|
||||||
);
|
);
|
||||||
const res = Util.getInputList('secrets', true);
|
const res = Util.getInputList('secrets', {ignoreComma: true});
|
||||||
expect(res).toEqual(['GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', 'MYSECRET=aaaaaaaa', 'bbbbbbb', 'ccccccccc', 'FOO=bar']);
|
expect(res).toEqual(['GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789', 'MYSECRET=aaaaaaaa', 'bbbbbbb', 'ccccccccc', 'FOO=bar']);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -145,7 +157,7 @@ FOO=bar`
|
|||||||
`"GPG_KEY=${pgp}"
|
`"GPG_KEY=${pgp}"
|
||||||
FOO=bar`
|
FOO=bar`
|
||||||
);
|
);
|
||||||
const res = Util.getInputList('secrets', true);
|
const res = Util.getInputList('secrets', {ignoreComma: true});
|
||||||
expect(res).toEqual([`GPG_KEY=${pgp}`, 'FOO=bar']);
|
expect(res).toEqual([`GPG_KEY=${pgp}`, 'FOO=bar']);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -158,7 +170,7 @@ bbbb""bbb
|
|||||||
ccccccccc"
|
ccccccccc"
|
||||||
FOO=bar`
|
FOO=bar`
|
||||||
);
|
);
|
||||||
const res = Util.getInputList('secrets', true);
|
const res = Util.getInputList('secrets', {ignoreComma: true});
|
||||||
expect(res).toEqual([
|
expect(res).toEqual([
|
||||||
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
|
'GIT_AUTH_TOKEN=abcdefgh,ijklmno=0123456789',
|
||||||
`MYSECRET=aaaaaaaa
|
`MYSECRET=aaaaaaaa
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import {Buildx} from '../buildx/buildx';
|
|||||||
import {Builder} from '../buildx/builder';
|
import {Builder} from '../buildx/builder';
|
||||||
import {Config} from './config';
|
import {Config} from './config';
|
||||||
|
|
||||||
import {BuilderInfo} from '../types/builder';
|
import {BuilderInfo, NodeInfo} from '../types/builder';
|
||||||
|
|
||||||
export interface BuildKitOpts {
|
export interface BuildKitOpts {
|
||||||
context: Context;
|
context: Context;
|
||||||
@@ -33,7 +33,6 @@ export interface BuildKitOpts {
|
|||||||
export class BuildKit {
|
export class BuildKit {
|
||||||
private readonly context: Context;
|
private readonly context: Context;
|
||||||
private readonly buildx: Buildx;
|
private readonly buildx: Buildx;
|
||||||
private containerNamePrefix = 'buildx_buildkit_';
|
|
||||||
|
|
||||||
public readonly config: Config;
|
public readonly config: Config;
|
||||||
|
|
||||||
@@ -47,14 +46,7 @@ export class BuildKit {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async getVersion(builderName: string): Promise<string | undefined> {
|
public async getVersion(node: NodeInfo): Promise<string | undefined> {
|
||||||
const builderInfo = await this.getBuilderInfo(builderName);
|
|
||||||
if (builderInfo.nodes.length == 0) {
|
|
||||||
// a builder always have on node, should not happen.
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
// TODO: get version for all nodes
|
|
||||||
const node = builderInfo.nodes[0];
|
|
||||||
if (!node.buildkitVersion && node.name) {
|
if (!node.buildkitVersion && node.name) {
|
||||||
try {
|
try {
|
||||||
return await this.getVersionWithinImage(node.name);
|
return await this.getVersionWithinImage(node.name);
|
||||||
@@ -67,7 +59,7 @@ export class BuildKit {
|
|||||||
|
|
||||||
private async getVersionWithinImage(nodeName: string): Promise<string> {
|
private async getVersionWithinImage(nodeName: string): Promise<string> {
|
||||||
return exec
|
return exec
|
||||||
.getExecOutput(`docker`, ['inspect', '--format', '{{.Config.Image}}', `${this.containerNamePrefix}${nodeName}`], {
|
.getExecOutput(`docker`, ['inspect', '--format', '{{.Config.Image}}', `${Buildx.containerNamePrefix}${nodeName}`], {
|
||||||
ignoreReturnCode: true,
|
ignoreReturnCode: true,
|
||||||
silent: true
|
silent: true
|
||||||
})
|
})
|
||||||
@@ -93,8 +85,13 @@ export class BuildKit {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async versionSatisfies(builderName: string, range: string): Promise<boolean> {
|
public async versionSatisfies(builderName: string, range: string, builderInfo?: BuilderInfo): Promise<boolean> {
|
||||||
const builderInfo = await this.getBuilderInfo(builderName);
|
if (!builderInfo) {
|
||||||
|
builderInfo = await new Builder({
|
||||||
|
context: this.context,
|
||||||
|
buildx: this.buildx
|
||||||
|
}).inspect(builderName);
|
||||||
|
}
|
||||||
for (const node of builderInfo.nodes) {
|
for (const node of builderInfo.nodes) {
|
||||||
let bkversion = node.buildkitVersion;
|
let bkversion = node.buildkitVersion;
|
||||||
if (!bkversion) {
|
if (!bkversion) {
|
||||||
@@ -114,12 +111,4 @@ export class BuildKit {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async getBuilderInfo(name: string): Promise<BuilderInfo> {
|
|
||||||
const builder = new Builder({
|
|
||||||
context: this.context,
|
|
||||||
buildx: this.buildx
|
|
||||||
});
|
|
||||||
return builder.inspect(name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
import fs from 'fs';
|
import fs from 'fs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
import * as core from '@actions/core';
|
||||||
import * as exec from '@actions/exec';
|
import * as exec from '@actions/exec';
|
||||||
import * as semver from 'semver';
|
import * as semver from 'semver';
|
||||||
|
|
||||||
@@ -36,11 +37,12 @@ export class Buildx {
|
|||||||
|
|
||||||
public readonly inputs: Inputs;
|
public readonly inputs: Inputs;
|
||||||
public readonly standalone: boolean;
|
public readonly standalone: boolean;
|
||||||
|
public static readonly containerNamePrefix = 'buildx_buildkit_';
|
||||||
|
|
||||||
constructor(opts: BuildxOpts) {
|
constructor(opts: BuildxOpts) {
|
||||||
this.context = opts.context;
|
this.context = opts.context;
|
||||||
|
this.standalone = opts?.standalone ?? !Docker.getInstance().available;
|
||||||
this.inputs = new Inputs(this.context);
|
this.inputs = new Inputs(this.context);
|
||||||
this.standalone = opts?.standalone ?? !Docker.isAvailable;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static get configDir(): string {
|
static get configDir(): string {
|
||||||
@@ -122,9 +124,12 @@ export class Buildx {
|
|||||||
public async versionSatisfies(range: string, version?: string): Promise<boolean> {
|
public async versionSatisfies(range: string, version?: string): Promise<boolean> {
|
||||||
const ver = version ?? (await this.version);
|
const ver = version ?? (await this.version);
|
||||||
if (!ver) {
|
if (!ver) {
|
||||||
|
core.debug(`Buildx.versionSatisfies false: undefined version`);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return semver.satisfies(ver, range) || /^[0-9a-f]{7}$/.exec(ver) !== null;
|
const res = semver.satisfies(ver, range) || /^[0-9a-f]{7}$/.exec(ver) !== null;
|
||||||
|
core.debug(`Buildx.versionSatisfies ${ver} statisfies ${range}: ${res}`);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static resolveCertsDriverOpts(driver: string, endpoint: string, cert: Cert): Array<string> {
|
public static resolveCertsDriverOpts(driver: string, endpoint: string, cert: Cert): Array<string> {
|
||||||
|
|||||||
@@ -42,10 +42,10 @@ export class Install {
|
|||||||
|
|
||||||
constructor(opts?: InstallOpts) {
|
constructor(opts?: InstallOpts) {
|
||||||
this.context = opts?.context || new Context();
|
this.context = opts?.context || new Context();
|
||||||
this.standalone = opts?.standalone ?? !Docker.isAvailable;
|
this.standalone = opts?.standalone ?? !Docker.getInstance().available;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async download(version: string, dest: string): Promise<string> {
|
public async download(version: string, dest?: string): Promise<string> {
|
||||||
const release: GitHubRelease = await Install.getRelease(version);
|
const release: GitHubRelease = await Install.getRelease(version);
|
||||||
const fversion = release.tag_name.replace(/^v+|v+$/g, '');
|
const fversion = release.tag_name.replace(/^v+|v+$/g, '');
|
||||||
|
|
||||||
@@ -59,13 +59,14 @@ export class Install {
|
|||||||
toolPath = await this.fetchBinary(fversion);
|
toolPath = await this.fetchBinary(fversion);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dest = dest || (this.standalone ? this.context.tmpDir() : Docker.configDir);
|
||||||
if (this.standalone) {
|
if (this.standalone) {
|
||||||
return this.setStandalone(toolPath, dest);
|
return this.setStandalone(toolPath, dest);
|
||||||
}
|
}
|
||||||
return this.setPlugin(toolPath, dest);
|
return this.setPlugin(toolPath, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async build(gitContext: string, dest: string): Promise<string> {
|
public async build(gitContext: string, dest?: string): Promise<string> {
|
||||||
// eslint-disable-next-line prefer-const
|
// eslint-disable-next-line prefer-const
|
||||||
let [repo, ref] = gitContext.split('#');
|
let [repo, ref] = gitContext.split('#');
|
||||||
if (ref.length == 0) {
|
if (ref.length == 0) {
|
||||||
@@ -79,7 +80,7 @@ export class Install {
|
|||||||
} else {
|
} else {
|
||||||
vspec = await Git.getRemoteSha(repo, ref);
|
vspec = await Git.getRemoteSha(repo, ref);
|
||||||
}
|
}
|
||||||
core.debug(`Tool version spec ${vspec}`);
|
core.debug(`Install.build: tool version spec ${vspec}`);
|
||||||
|
|
||||||
let toolPath: string;
|
let toolPath: string;
|
||||||
toolPath = tc.find('buildx', vspec);
|
toolPath = tc.find('buildx', vspec);
|
||||||
@@ -98,6 +99,7 @@ export class Install {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dest = dest || Docker.configDir;
|
||||||
if (this.standalone) {
|
if (this.standalone) {
|
||||||
return this.setStandalone(toolPath, dest);
|
return this.setStandalone(toolPath, dest);
|
||||||
}
|
}
|
||||||
@@ -110,16 +112,16 @@ export class Install {
|
|||||||
|
|
||||||
let buildStandalone = false;
|
let buildStandalone = false;
|
||||||
if (this.standalone && buildxStandaloneFound) {
|
if (this.standalone && buildxStandaloneFound) {
|
||||||
core.debug(`Buildx standalone found, build with it`);
|
core.debug(`Install.buildCommand: Buildx standalone found, build with it`);
|
||||||
buildStandalone = true;
|
buildStandalone = true;
|
||||||
} else if (!this.standalone && buildxPluginFound) {
|
} else if (!this.standalone && buildxPluginFound) {
|
||||||
core.debug(`Buildx plugin found, build with it`);
|
core.debug(`Install.buildCommand: Buildx plugin found, build with it`);
|
||||||
buildStandalone = false;
|
buildStandalone = false;
|
||||||
} else if (buildxStandaloneFound) {
|
} else if (buildxStandaloneFound) {
|
||||||
core.debug(`Buildx plugin not found, but standalone found so trying to build with it`);
|
core.debug(`Install.buildCommand: Buildx plugin not found, but standalone found so trying to build with it`);
|
||||||
buildStandalone = true;
|
buildStandalone = true;
|
||||||
} else if (buildxPluginFound) {
|
} else if (buildxPluginFound) {
|
||||||
core.debug(`Buildx standalone not found, but plugin found so trying to build with it`);
|
core.debug(`Install.buildCommand: Buildx standalone not found, but plugin found so trying to build with it`);
|
||||||
buildStandalone = false;
|
buildStandalone = false;
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Neither buildx standalone or plugin have been found to build from ref ${gitContext}`);
|
throw new Error(`Neither buildx standalone or plugin have been found to build from ref ${gitContext}`);
|
||||||
|
|||||||
@@ -16,37 +16,53 @@
|
|||||||
|
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
import * as core from '@actions/core';
|
||||||
import * as exec from '@actions/exec';
|
import * as exec from '@actions/exec';
|
||||||
|
|
||||||
export class Docker {
|
export class Docker {
|
||||||
|
private static instance?: Docker;
|
||||||
|
static getInstance = (): Docker => (Docker.instance = Docker.instance ?? new Docker());
|
||||||
|
|
||||||
|
private _available: boolean | undefined;
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
||||||
|
private constructor() {}
|
||||||
|
|
||||||
static get configDir(): string {
|
static get configDir(): string {
|
||||||
return process.env.DOCKER_CONFIG || path.join(os.homedir(), '.docker');
|
return process.env.DOCKER_CONFIG || path.join(os.homedir(), '.docker');
|
||||||
}
|
}
|
||||||
|
|
||||||
static get isAvailable(): boolean {
|
get available() {
|
||||||
let dockerAvailable = false;
|
return (async () => {
|
||||||
exec
|
if (!this._available) {
|
||||||
.getExecOutput('docker', undefined, {
|
this._available = await exec
|
||||||
ignoreReturnCode: true,
|
.getExecOutput('docker', undefined, {
|
||||||
silent: true
|
ignoreReturnCode: true,
|
||||||
})
|
silent: true
|
||||||
.then(res => {
|
})
|
||||||
if (res.stderr.length > 0 && res.exitCode != 0) {
|
.then(res => {
|
||||||
dockerAvailable = false;
|
if (res.stderr.length > 0 && res.exitCode != 0) {
|
||||||
} else {
|
core.debug(`Docker.isAvailable error: ${res.stderr}`);
|
||||||
dockerAvailable = res.exitCode == 0;
|
return false;
|
||||||
}
|
} else {
|
||||||
})
|
core.debug(`Docker.isAvailable ok`);
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
return res.exitCode == 0;
|
||||||
.catch(error => {
|
}
|
||||||
dockerAvailable = false;
|
})
|
||||||
});
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
return dockerAvailable;
|
.catch(error => {
|
||||||
|
core.debug(`Docker.isAvailable failed: ${error}`);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return this._available;
|
||||||
|
})();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async printVersion(standalone?: boolean) {
|
public static async printVersion(standalone?: boolean): Promise<void> {
|
||||||
const noDocker = standalone ?? !Docker.isAvailable;
|
const noDocker = standalone ?? !Docker.getInstance().available;
|
||||||
if (noDocker) {
|
if (noDocker) {
|
||||||
|
core.debug('Docker.printVersion: Docker is not available, skipping.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await exec.exec('docker', ['version'], {
|
await exec.exec('docker', ['version'], {
|
||||||
@@ -54,9 +70,10 @@ export class Docker {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async printInfo(standalone?: boolean) {
|
public static async printInfo(standalone?: boolean): Promise<void> {
|
||||||
const noDocker = standalone ?? !Docker.isAvailable;
|
const noDocker = standalone ?? !Docker.getInstance().available;
|
||||||
if (noDocker) {
|
if (noDocker) {
|
||||||
|
core.debug('Docker.printInfo: Docker is not available, skipping.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await exec.exec('docker', ['info'], {
|
await exec.exec('docker', ['info'], {
|
||||||
|
|||||||
@@ -17,8 +17,10 @@
|
|||||||
import {Context} from './context';
|
import {Context} from './context';
|
||||||
import {Buildx} from './buildx/buildx';
|
import {Buildx} from './buildx/buildx';
|
||||||
import {Install} from './buildx/install';
|
import {Install} from './buildx/install';
|
||||||
|
import {Builder} from './buildx/builder';
|
||||||
import {BuildKit} from './buildkit/buildkit';
|
import {BuildKit} from './buildkit/buildkit';
|
||||||
import {GitHub} from './github';
|
import {GitHub} from './github';
|
||||||
|
import {Docker} from './docker';
|
||||||
|
|
||||||
export interface ToolkitOpts {
|
export interface ToolkitOpts {
|
||||||
/**
|
/**
|
||||||
@@ -31,15 +33,19 @@ export interface ToolkitOpts {
|
|||||||
export class Toolkit {
|
export class Toolkit {
|
||||||
public context: Context;
|
public context: Context;
|
||||||
public github: GitHub;
|
public github: GitHub;
|
||||||
|
public docker: Docker;
|
||||||
public buildx: Buildx;
|
public buildx: Buildx;
|
||||||
public buildxInstall: Install;
|
public buildxInstall: Install;
|
||||||
|
public builder: Builder;
|
||||||
public buildkit: BuildKit;
|
public buildkit: BuildKit;
|
||||||
|
|
||||||
constructor(opts: ToolkitOpts = {}) {
|
constructor(opts: ToolkitOpts = {}) {
|
||||||
this.context = new Context();
|
this.context = new Context();
|
||||||
this.github = new GitHub({token: opts.githubToken});
|
this.github = new GitHub({token: opts.githubToken});
|
||||||
this.buildx = new Buildx({context: this.context});
|
this.docker = Docker.getInstance();
|
||||||
|
this.buildx = new Buildx({context: this.context, standalone: !this.docker.available});
|
||||||
this.buildxInstall = new Install({context: this.context, standalone: this.buildx.standalone});
|
this.buildxInstall = new Install({context: this.context, standalone: this.buildx.standalone});
|
||||||
|
this.builder = new Builder({context: this.context, buildx: this.buildx});
|
||||||
this.buildkit = new BuildKit({context: this.context, buildx: this.buildx});
|
this.buildkit = new BuildKit({context: this.context, buildx: this.buildx});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,3 +30,11 @@ export interface NodeInfo {
|
|||||||
buildkitVersion?: string;
|
buildkitVersion?: string;
|
||||||
platforms?: string;
|
platforms?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface Node {
|
||||||
|
name?: string;
|
||||||
|
endpoint?: string;
|
||||||
|
'driver-opts'?: Array<string>;
|
||||||
|
'buildkitd-flags'?: string;
|
||||||
|
platforms?: string;
|
||||||
|
}
|
||||||
|
|||||||
23
src/util.ts
23
src/util.ts
@@ -17,8 +17,13 @@
|
|||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
import {parse} from 'csv-parse/sync';
|
import {parse} from 'csv-parse/sync';
|
||||||
|
|
||||||
|
export interface InputListOpts {
|
||||||
|
ignoreComma?: boolean;
|
||||||
|
quote?: string | boolean | Buffer | null;
|
||||||
|
}
|
||||||
|
|
||||||
export class Util {
|
export class Util {
|
||||||
public static getInputList(name: string, ignoreComma?: boolean): string[] {
|
public static getInputList(name: string, opts?: InputListOpts): string[] {
|
||||||
const res: Array<string> = [];
|
const res: Array<string> = [];
|
||||||
|
|
||||||
const items = core.getInput(name);
|
const items = core.getInput(name);
|
||||||
@@ -31,18 +36,22 @@ export class Util {
|
|||||||
relaxQuotes: true,
|
relaxQuotes: true,
|
||||||
comment: '#',
|
comment: '#',
|
||||||
relaxColumnCount: true,
|
relaxColumnCount: true,
|
||||||
skipEmptyLines: true
|
skipEmptyLines: true,
|
||||||
|
quote: opts?.quote
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const record of records as Array<string[]>) {
|
for (const record of records as Array<string[]>) {
|
||||||
if (record.length == 1) {
|
if (record.length == 1) {
|
||||||
res.push(record[0]);
|
if (opts?.ignoreComma) {
|
||||||
continue;
|
res.push(record[0]);
|
||||||
} else if (!ignoreComma) {
|
} else {
|
||||||
|
res.push(...record[0].split(','));
|
||||||
|
}
|
||||||
|
} else if (!opts?.ignoreComma) {
|
||||||
res.push(...record);
|
res.push(...record);
|
||||||
continue;
|
} else {
|
||||||
|
res.push(record.join(','));
|
||||||
}
|
}
|
||||||
res.push(record.join(','));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return res.filter(item => item).map(pat => pat.trim());
|
return res.filter(item => item).map(pat => pat.trim());
|
||||||
|
|||||||
Reference in New Issue
Block a user