import * as fs from 'fs'; import * as core from '@actions/core'; import * as actionsToolkit from '@docker/actions-toolkit'; import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; import {getContext, getInputs, Inputs} from './context'; import {Meta, Version} from './meta'; function setOutput(name: string, value: string) { core.setOutput(name, value); core.exportVariable(`DOCKER_METADATA_OUTPUT_${name.replace(/\W/g, '_').toUpperCase()}`, value); } actionsToolkit.run( // main async () => { const inputs: Inputs = getInputs(); const toolkit = new Toolkit({githubToken: inputs.githubToken}); const context = await getContext(inputs.context); const repo = await toolkit.github.repoData(); await core.group(`Context info`, async () => { core.info(`eventName: ${context.eventName}`); core.info(`sha: ${context.sha}`); core.info(`ref: ${context.ref}`); core.info(`workflow: ${context.workflow}`); core.info(`action: ${context.action}`); core.info(`actor: ${context.actor}`); core.info(`runNumber: ${context.runNumber}`); core.info(`runId: ${context.runId}`); }); if (core.isDebug()) { await core.group(`Webhook payload`, async () => { core.info(JSON.stringify(context.payload, null, 2)); }); } const meta: Meta = new Meta(inputs, context, repo); const version: Version = meta.version; if (meta.version.main == undefined || meta.version.main.length == 0) { core.warning(`No Docker image version has been generated. Check tags input.`); } else { await core.group(`Docker image version`, async () => { core.info(version.main || ''); }); } setOutput('version', version.main || ''); // Docker tags const tags: Array = meta.getTags(); if (tags.length == 0) { core.warning('No Docker tag has been generated. Check tags input.'); } else { await core.group(`Docker tags`, async () => { for (const tag of tags) { core.info(tag); } }); } setOutput('tags', tags.join(inputs.sepTags)); // Docker labels const labels: Array = meta.getLabels(); await core.group(`Docker labels`, async () => { for (const label of labels) { core.info(label); } setOutput('labels', labels.join(inputs.sepLabels)); }); // Annotations const annotationsRaw: Array = meta.getAnnotations(); const annotationsLevels = process.env.DOCKER_METADATA_ANNOTATIONS_LEVELS || 'manifest'; await core.group(`Annotations`, async () => { const annotations: Array = []; for (const level of annotationsLevels.split(',')) { annotations.push( ...annotationsRaw.map(label => { const v = `${level}:${label}`; core.info(v); return v; }) ); } setOutput(`annotations`, annotations.join(inputs.sepAnnotations)); }); // JSON const jsonOutput = meta.getJSON(annotationsLevels.split(',')); await core.group(`JSON output`, async () => { core.info(JSON.stringify(jsonOutput, null, 2)); setOutput('json', JSON.stringify(jsonOutput)); }); // Specifying local and remote bake files is supported since Buildx 0.12.0. // Set cwd:// prefix for local bake files to avoid ambiguity with remote // https://github.com/docker/buildx/pull/1838 const bakeFileCwdPrefix = (await toolkit.buildx.versionSatisfies('>=0.12.0').catch(() => false)) ? 'cwd://' : ''; // Bake files for (const kind of ['tags', 'labels', 'annotations:' + annotationsLevels]) { const outputName = kind.split(':')[0]; const bakeFile: string = meta.getBakeFile(kind); await core.group(`Bake file definition (${outputName})`, async () => { core.info(fs.readFileSync(bakeFile, 'utf8')); setOutput(`bake-file-${outputName}`, `${bakeFileCwdPrefix}${bakeFile}`); }); } // Bake file with tags and labels setOutput(`bake-file`, `${bakeFileCwdPrefix}${meta.getBakeFileTagsLabels()}`); } );