diff --git a/__tests__/buildx.test.ts b/__tests__/buildx.test.ts index 025b344..2399865 100644 --- a/__tests__/buildx.test.ts +++ b/__tests__/buildx.test.ts @@ -77,6 +77,124 @@ describe('inspect', () => { }, 100000); }); +describe('parseInspect', () => { + // prettier-ignore + test.each([ + [ + 'inspect1.txt', + { + "nodes": [ + { + "name": "builder-5cb467f7-0940-47e1-b94b-d51f54054d620", + "endpoint": "unix:///var/run/docker.sock", + "status": "running", + "buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host", + "buildkit": "v0.10.4", + "platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/arm64,linux/riscv64,linux/386,linux/arm/v7,linux/arm/v6" + } + ], + "name": "builder-5cb467f7-0940-47e1-b94b-d51f54054d62", + "driver": "docker-container" + } + ], + [ + 'inspect2.txt', + { + "nodes": [ + { + "name": "builder-5f449644-ff29-48af-8344-abb0292d06730", + "endpoint": "unix:///var/run/docker.sock", + "driver-opts": [ + "image=moby/buildkit:latest" + ], + "status": "running", + "buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host", + "buildkit": "v0.10.4", + "platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386" + } + ], + "name": "builder-5f449644-ff29-48af-8344-abb0292d0673", + "driver": "docker-container" + } + ], + [ + 'inspect3.txt', + { + "nodes": [ + { + "name": "builder-9929e463-7954-4dc3-89cd-514cca29ff800", + "endpoint": "unix:///var/run/docker.sock", + "driver-opts": [ + "image=moby/buildkit:master", + "network=host" + ], + "status": "running", + "buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host", + "buildkit": "3fab389", + "platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386" + } + ], + "name": "builder-9929e463-7954-4dc3-89cd-514cca29ff80", + "driver": "docker-container" + } + ], + [ + 'inspect4.txt', + { + "nodes": [ + { + "name": "default", + "endpoint": "default", + "status": "running", + "buildkit": "20.10.17", + "platforms": "linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/arm/v7,linux/arm/v6" + } + ], + "name": "default", + "driver": "docker" + } + ], + [ + 'inspect5.txt', + { + "nodes": [ + { + "name": "aws_graviton2", + "endpoint": "tcp://1.23.45.67:1234", + "driver-opts": [ + "cert=/home/user/.certs/aws_graviton2/cert.pem", + "key=/home/user/.certs/aws_graviton2/key.pem", + "cacert=/home/user/.certs/aws_graviton2/ca.pem" + ], + "status": "running", + "platforms": "darwin/arm64,linux/arm64,linux/arm/v5,linux/arm/v6,linux/arm/v7,windows/arm64" + } + ], + "name": "remote-builder", + "driver": "remote" + } + ], + [ + 'inspect6.txt', + { + "nodes": [ + { + "name": "builder-17cfff01-48d9-4c3d-9332-9992e308a5100", + "endpoint": "unix:///var/run/docker.sock", + "status": "running", + "buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host", + "platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/386" + } + ], + "name": "builder-17cfff01-48d9-4c3d-9332-9992e308a510", + "driver": "docker-container" + } + ], + ])('given %p', async (inspectFile, expected) => { + expect(await buildx.parseInspect(fs.readFileSync(path.join(__dirname, 'fixtures', inspectFile)).toString())).toEqual(expected); + }); +}); + describe('build', () => { const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'setup-buildx-')); diff --git a/__tests__/fixtures/inspect1.txt b/__tests__/fixtures/inspect1.txt new file mode 100644 index 0000000..35c57b4 --- /dev/null +++ b/__tests__/fixtures/inspect1.txt @@ -0,0 +1,10 @@ +Name: builder-5cb467f7-0940-47e1-b94b-d51f54054d62 +Driver: docker-container + +Nodes: +Name: builder-5cb467f7-0940-47e1-b94b-d51f54054d620 +Endpoint: unix:///var/run/docker.sock +Status: running +Flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host +Buildkit: v0.10.4 +Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/arm64, linux/riscv64, linux/386, linux/arm/v7, linux/arm/v6 diff --git a/__tests__/fixtures/inspect2.txt b/__tests__/fixtures/inspect2.txt new file mode 100644 index 0000000..6fbe0cb --- /dev/null +++ b/__tests__/fixtures/inspect2.txt @@ -0,0 +1,11 @@ +Name: builder-5f449644-ff29-48af-8344-abb0292d0673 +Driver: docker-container + +Nodes: +Name: builder-5f449644-ff29-48af-8344-abb0292d06730 +Endpoint: unix:///var/run/docker.sock +Driver Options: image="moby/buildkit:latest" +Status: running +Flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host +Buildkit: v0.10.4 +Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/386 diff --git a/__tests__/fixtures/inspect3.txt b/__tests__/fixtures/inspect3.txt new file mode 100644 index 0000000..a2ec5e2 --- /dev/null +++ b/__tests__/fixtures/inspect3.txt @@ -0,0 +1,11 @@ +Name: builder-9929e463-7954-4dc3-89cd-514cca29ff80 +Driver: docker-container + +Nodes: +Name: builder-9929e463-7954-4dc3-89cd-514cca29ff800 +Endpoint: unix:///var/run/docker.sock +Driver Options: image="moby/buildkit:master" network="host" +Status: running +Flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host +Buildkit: 3fab389 +Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/amd64/v4, linux/386 diff --git a/__tests__/fixtures/inspect4.txt b/__tests__/fixtures/inspect4.txt new file mode 100644 index 0000000..8a6ea90 --- /dev/null +++ b/__tests__/fixtures/inspect4.txt @@ -0,0 +1,9 @@ +Name: default +Driver: docker + +Nodes: +Name: default +Endpoint: default +Status: running +Buildkit: 20.10.17 +Platforms: linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6 diff --git a/__tests__/fixtures/inspect5.txt b/__tests__/fixtures/inspect5.txt new file mode 100644 index 0000000..6c17e5d --- /dev/null +++ b/__tests__/fixtures/inspect5.txt @@ -0,0 +1,9 @@ +Name: remote-builder +Driver: remote + +Nodes: +Name: aws_graviton2 +Endpoint: tcp://1.23.45.67:1234 +Driver Options: cert="/home/user/.certs/aws_graviton2/cert.pem" key="/home/user/.certs/aws_graviton2/key.pem" cacert="/home/user/.certs/aws_graviton2/ca.pem" +Status: running +Platforms: darwin/arm64*, linux/arm64*, linux/arm/v5*, linux/arm/v6*, linux/arm/v7*, windows/arm64*, linux/amd64, linux/amd64/v2, linux/riscv64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64 diff --git a/__tests__/fixtures/inspect6.txt b/__tests__/fixtures/inspect6.txt new file mode 100644 index 0000000..eba8df3 --- /dev/null +++ b/__tests__/fixtures/inspect6.txt @@ -0,0 +1,9 @@ +Name: builder-17cfff01-48d9-4c3d-9332-9992e308a510 +Driver: docker-container + +Nodes: +Name: builder-17cfff01-48d9-4c3d-9332-9992e308a5100 +Endpoint: unix:///var/run/docker.sock +Status: running +Flags: --allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host +Platforms: linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/386 diff --git a/src/buildx.ts b/src/buildx.ts index d81eeeb..ebaffef 100644 --- a/src/buildx.ts +++ b/src/buildx.ts @@ -104,79 +104,83 @@ export async function inspect(name: string, standalone?: boolean): Promise 0 && res.exitCode != 0) { throw new Error(res.stderr.trim()); } - const builder: Builder = { - nodes: [] - }; - let node: Node = {}; - for (const line of res.stdout.trim().split(`\n`)) { - const [key, ...rest] = line.split(':'); - const value = rest.map(v => v.trim()).join(':'); - if (key.length == 0 || value.length == 0) { - continue; - } - switch (key.toLowerCase()) { - case 'name': { - if (builder.name == undefined) { - builder.name = value; - } else { - if (Object.keys(node).length > 0) { - builder.nodes.push(node); - node = {}; - } - node.name = value; - } - break; - } - case 'driver': { - builder.driver = value; - break; - } - case 'endpoint': { - node.endpoint = value; - break; - } - case 'driver options': { - node['driver-opts'] = (value.match(/(\w+)="([^"]*)"/g) || []).map(v => v.replace(/^(.*)="(.*)"$/g, '$1=$2')); - break; - } - case 'status': { - node.status = value; - break; - } - case 'flags': { - node['buildkitd-flags'] = value; - break; - } - case 'buildkit': { - node.buildkit = value; - break; - } - case 'platforms': { - let platforms: Array = []; - // if a preferred platform is being set then use only these - // https://docs.docker.com/engine/reference/commandline/buildx_inspect/#get-information-about-a-builder-instance - if (value.includes('*')) { - for (const platform of value.split(', ')) { - if (platform.includes('*')) { - platforms.push(platform.replace('*', '')); - } - } - } else { - // otherwise set all platforms available - platforms = value.split(', '); - } - node.platforms = platforms.join(','); - break; - } - } - } - if (Object.keys(node).length > 0) { - builder.nodes.push(node); - } - return builder; + return parseInspect(res.stdout); }); } +export async function parseInspect(data: string): Promise { + const builder: Builder = { + nodes: [] + }; + let node: Node = {}; + for (const line of data.trim().split(`\n`)) { + const [key, ...rest] = line.split(':'); + const value = rest.map(v => v.trim()).join(':'); + if (key.length == 0 || value.length == 0) { + continue; + } + switch (key.toLowerCase()) { + case 'name': { + if (builder.name == undefined) { + builder.name = value; + } else { + if (Object.keys(node).length > 0) { + builder.nodes.push(node); + node = {}; + } + node.name = value; + } + break; + } + case 'driver': { + builder.driver = value; + break; + } + case 'endpoint': { + node.endpoint = value; + break; + } + case 'driver options': { + node['driver-opts'] = (value.match(/(\w+)="([^"]*)"/g) || []).map(v => v.replace(/^(.*)="(.*)"$/g, '$1=$2')); + break; + } + case 'status': { + node.status = value; + break; + } + case 'flags': { + node['buildkitd-flags'] = value; + break; + } + case 'buildkit': { + node.buildkit = value; + break; + } + case 'platforms': { + let platforms: Array = []; + // if a preferred platform is being set then use only these + // https://docs.docker.com/engine/reference/commandline/buildx_inspect/#get-information-about-a-builder-instance + if (value.includes('*')) { + for (const platform of value.split(', ')) { + if (platform.includes('*')) { + platforms.push(platform.replace('*', '')); + } + } + } else { + // otherwise set all platforms available + platforms = value.split(', '); + } + node.platforms = platforms.join(','); + break; + } + } + } + if (Object.keys(node).length > 0) { + builder.nodes.push(node); + } + return builder; +} + export async function build(inputBuildRef: string, dest: string, standalone: boolean): Promise { // eslint-disable-next-line prefer-const let [repo, ref] = inputBuildRef.split('#');