Permalink
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
build-push-action/src/main.ts
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Ben Drucker <bvdrucker@gmail.com>
95 lines (85 sloc)
2.76 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import * as fs from 'fs'; | |
import * as buildx from './buildx'; | |
import * as context from './context'; | |
import * as docker from './docker'; | |
import * as stateHelper from './state-helper'; | |
import * as core from '@actions/core'; | |
import * as exec from '@actions/exec'; | |
async function run(): Promise<void> { | |
try { | |
const defContext = context.defaultContext(); | |
const inputs: context.Inputs = await context.getInputs(defContext); | |
// standalone if docker cli not available | |
const standalone = !(await docker.isAvailable()); | |
core.startGroup(`Docker info`); | |
if (standalone) { | |
core.info(`Docker info skipped in standalone mode`); | |
} else { | |
await exec.exec('docker', ['version'], { | |
failOnStdErr: false | |
}); | |
await exec.exec('docker', ['info'], { | |
failOnStdErr: false | |
}); | |
} | |
core.endGroup(); | |
if (!(await buildx.isAvailable(standalone))) { | |
core.setFailed(`Docker buildx is required. See https://github.com/docker/setup-buildx-action to set up buildx.`); | |
return; | |
} | |
stateHelper.setTmpDir(context.tmpDir()); | |
const buildxVersion = await buildx.getVersion(standalone); | |
await core.group(`Buildx version`, async () => { | |
const versionCmd = buildx.getCommand(['version'], standalone); | |
await exec.exec(versionCmd.command, versionCmd.args, { | |
failOnStdErr: false | |
}); | |
}); | |
const args: string[] = await context.getArgs(inputs, defContext, buildxVersion); | |
const buildCmd = buildx.getCommand(args, standalone); | |
await exec | |
.getExecOutput(buildCmd.command, buildCmd.args, { | |
ignoreReturnCode: true | |
}) | |
.then(res => { | |
if (res.stderr.length > 0 && res.exitCode != 0) { | |
throw new Error(`buildx failed with: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`); | |
} | |
}); | |
const imageID = await buildx.getImageID(); | |
const metadata = await buildx.getMetadata(); | |
const digest = await buildx.getDigest(metadata); | |
if (imageID) { | |
await core.group(`ImageID`, async () => { | |
core.info(imageID); | |
context.setOutput('imageid', imageID); | |
}); | |
} | |
if (digest) { | |
await core.group(`Digest`, async () => { | |
core.info(digest); | |
context.setOutput('digest', digest); | |
}); | |
} | |
if (metadata) { | |
await core.group(`Metadata`, async () => { | |
core.info(metadata); | |
context.setOutput('metadata', metadata); | |
}); | |
} | |
} catch (error) { | |
core.setFailed(error.message); | |
} | |
} | |
async function cleanup(): Promise<void> { | |
if (stateHelper.tmpDir.length > 0) { | |
core.startGroup(`Removing temp folder ${stateHelper.tmpDir}`); | |
fs.rmSync(stateHelper.tmpDir, {recursive: true}); | |
core.endGroup(); | |
} | |
} | |
if (!stateHelper.IsPost) { | |
run(); | |
} else { | |
cleanup(); | |
} |