Compare commits

..

10 Commits

Author SHA1 Message Date
CrazyMax
5e8f679709 Merge pull request #38 from crazy-max/util-quote
Some checks failed
publish / publish (push) Has been cancelled
util: handle quote opt with the same api for input list
2023-02-18 01:57:40 +01:00
CrazyMax
f288f4f7ea util: handle quote opt with the same api for input list
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 01:53:59 +01:00
CrazyMax
cb9121174a Merge pull request #37 from crazy-max/toolkit-builder
toolkit: add builder
2023-02-18 01:37:42 +01:00
CrazyMax
464dfbe1ec toolkit: add builder
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 01:33:37 +01:00
CrazyMax
5695c0049b Merge pull request #36 from crazy-max/update-input-list
Some checks failed
publish / publish (push) Has been cancelled
util: opt to escape quotes for input list
2023-02-18 01:12:26 +01:00
CrazyMax
44b1545abd util: opt to escape quotes for input list
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-18 01:02:56 +01:00
CrazyMax
4d9d62d542 Merge pull request #35 from crazy-max/node-type
builder: add Node type
2023-02-18 00:01:23 +01:00
CrazyMax
aa3c8ef106 Merge pull request #34 from crazy-max/buildx-optional-dest
buildx: dest dir optional on install
2023-02-17 23:58:35 +01:00
CrazyMax
259abb56df builder: add Node type
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-17 23:56:13 +01:00
CrazyMax
76e5a25cff buildx: dest dir optional on install
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
2023-02-17 23:54:28 +01:00
5 changed files with 50 additions and 16 deletions

View File

@@ -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

View File

@@ -45,7 +45,7 @@ export class Install {
this.standalone = opts?.standalone ?? !Docker.isAvailable; this.standalone = opts?.standalone ?? !Docker.isAvailable;
} }
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) {
@@ -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);
} }

View File

@@ -17,6 +17,7 @@
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';
@@ -33,6 +34,7 @@ export class Toolkit {
public github: GitHub; public github: GitHub;
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 = {}) {
@@ -40,6 +42,7 @@ export class Toolkit {
this.github = new GitHub({token: opts.githubToken}); this.github = new GitHub({token: opts.githubToken});
this.buildx = new Buildx({context: this.context}); this.buildx = new Buildx({context: this.context});
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});
} }
} }

View File

@@ -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;
}

View File

@@ -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());