|
1 | 1 | import * as fs from 'fs';
|
2 | 2 | import * as yaml from 'js-yaml';
|
| 3 | +import * as uuid from 'uuid'; |
3 | 4 | import * as core from '@actions/core';
|
4 | 5 | import * as actionsToolkit from '@docker/actions-toolkit';
|
5 | 6 |
|
@@ -68,6 +69,33 @@ actionsToolkit.run(
|
68 | 69 | fs.mkdirSync(Buildx.certsDir, {recursive: true});
|
69 | 70 | stateHelper.setCertsDir(Buildx.certsDir);
|
70 | 71 |
|
| 72 | + // if the default context has TLS data loaded and endpoint is not set, then |
| 73 | + // we create a temporary docker context only if driver is docker-container |
| 74 | + // https://github.com/docker/buildx/blob/b96ad59f64d40873e4959336d294b648bb3937fe/builder/builder.go#L489 |
| 75 | + // https://github.com/docker/setup-buildx-action/issues/105 |
| 76 | + if (!standalone && inputs.driver == 'docker-container' && (await Docker.context()) == 'default' && inputs.endpoint.length == 0) { |
| 77 | + const contextInfo = await Docker.contextInspect('default'); |
| 78 | + core.debug(`context info: ${JSON.stringify(contextInfo, undefined, 2)}`); |
| 79 | + const hasTLSData = Object.keys(contextInfo.Endpoints).length > 0 && Object.values(contextInfo.Endpoints)[0].TLSData; |
| 80 | + const hasTLSMaterial = Object.keys(contextInfo.TLSMaterial).length > 0 && Object.values(contextInfo.TLSMaterial)[0].length > 0; |
| 81 | + if (hasTLSData || hasTLSMaterial) { |
| 82 | + const tmpDockerContext = `buildx-${uuid.v4()}`; |
| 83 | + await core.group(`Creating temp docker context (TLS data loaded in default one)`, async () => { |
| 84 | + await Docker.getExecOutput(['context', 'create', tmpDockerContext], { |
| 85 | + ignoreReturnCode: true |
| 86 | + }).then(res => { |
| 87 | + if (res.stderr.length > 0 && res.exitCode != 0) { |
| 88 | + core.warning(`cannot create docker context ${tmpDockerContext}: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`); |
| 89 | + } else { |
| 90 | + core.info(`Setting builder endpoint to ${tmpDockerContext} context`); |
| 91 | + inputs.endpoint = tmpDockerContext; |
| 92 | + stateHelper.setTmpDockerContext(tmpDockerContext); |
| 93 | + } |
| 94 | + }); |
| 95 | + }); |
| 96 | + } |
| 97 | + } |
| 98 | + |
71 | 99 | if (inputs.driver !== 'docker') {
|
72 | 100 | await core.group(`Creating a new builder instance`, async () => {
|
73 | 101 | const certsDriverOpts = Buildx.resolveCertsDriverOpts(inputs.driver, inputs.endpoint, {
|
@@ -214,6 +242,18 @@ actionsToolkit.run(
|
214 | 242 | });
|
215 | 243 | }
|
216 | 244 |
|
| 245 | + if (stateHelper.tmpDockerContext) { |
| 246 | + await core.group(`Removing temp docker context`, async () => { |
| 247 | + await Exec.getExecOutput('docker', ['context', 'rm', '-f', stateHelper.tmpDockerContext], { |
| 248 | + ignoreReturnCode: true |
| 249 | + }).then(res => { |
| 250 | + if (res.stderr.length > 0 && res.exitCode != 0) { |
| 251 | + core.warning(`${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`); |
| 252 | + } |
| 253 | + }); |
| 254 | + }); |
| 255 | + } |
| 256 | + |
217 | 257 | if (stateHelper.certsDir.length > 0 && fs.existsSync(stateHelper.certsDir)) {
|
218 | 258 | await core.group(`Cleaning up certificates`, async () => {
|
219 | 259 | fs.rmSync(stateHelper.certsDir, {recursive: true});
|
|
0 commit comments