mirror of
https://github.com/docker/build-push-action
synced 2024-11-22 18:31:40 +00:00
Add digest output
Fix platforms and allow inputs Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
parent
44d05b9191
commit
38c1f188ca
8 changed files with 244 additions and 68 deletions
49
.github/workflows/ci.yml
vendored
49
.github/workflows/ci.yml
vendored
|
@ -11,7 +11,54 @@ on:
|
||||||
- v2-working-branch # remove when merged to master
|
- v2-working-branch # remove when merged to master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
main:
|
single:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Run local registry
|
||||||
|
run: |
|
||||||
|
docker run -d -p 5000:5000 registry:2
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2.3.1
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: ./setup-qemu/ # change to docker/setup-qemu-action@master
|
||||||
|
with:
|
||||||
|
platforms: all
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: ./setup-buildx/ # change to docker/setup-buildx-action@master
|
||||||
|
with:
|
||||||
|
driver-opt: network=host
|
||||||
|
buildkitd-flags: --allow-insecure-entitlement security.insecure
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
id: docker_build
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
context: ./test
|
||||||
|
file: ./test/Dockerfile
|
||||||
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
|
allow: network.host,security.insecure
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
localhost:5000/name/app:latest
|
||||||
|
localhost:5000/name/app:1.0.0
|
||||||
|
-
|
||||||
|
name: Inspect
|
||||||
|
run: |
|
||||||
|
docker buildx imagetools inspect localhost:5000/name/app:1.0.0
|
||||||
|
-
|
||||||
|
name: Image digest
|
||||||
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
|
-
|
||||||
|
name: Dump context
|
||||||
|
if: always()
|
||||||
|
uses: crazy-max/ghaction-dump-context@v1
|
||||||
|
|
||||||
|
multi:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
|
52
README.md
52
README.md
|
@ -32,7 +32,56 @@ on:
|
||||||
tags:
|
tags:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
buildx:
|
main:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
-
|
||||||
|
name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
-
|
||||||
|
name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1
|
||||||
|
with:
|
||||||
|
platforms: all
|
||||||
|
-
|
||||||
|
name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v1
|
||||||
|
-
|
||||||
|
name: Login to DockerHub
|
||||||
|
uses: crazy-max/ghaction-docker-login@v1 # switch to docker/login-action@v1 when available
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
-
|
||||||
|
name: Build and push
|
||||||
|
id: docker_build
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
|
with:
|
||||||
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
user/app:latest
|
||||||
|
user/app:1.0.0
|
||||||
|
-
|
||||||
|
name: Image digest
|
||||||
|
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Multi-platform image
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: ci
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: master
|
||||||
|
push:
|
||||||
|
branches: master
|
||||||
|
tags:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
multi:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
|
@ -58,7 +107,6 @@ jobs:
|
||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v2
|
||||||
with:
|
with:
|
||||||
builder: ${{ steps.buildx.outputs.name }}
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
platforms: linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/386,linux/ppc64le,linux/s390x
|
|
||||||
push: true
|
push: true
|
||||||
tags: |
|
tags: |
|
||||||
user/app:latest
|
user/app:latest
|
||||||
|
|
15
__tests__/buildx.test.ts
Normal file
15
__tests__/buildx.test.ts
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import fs from 'fs';
|
||||||
|
import * as buildx from '../src/buildx';
|
||||||
|
|
||||||
|
const digest = 'sha256:bfb45ab72e46908183546477a08f8867fc40cebadd00af54b071b097aed127a9';
|
||||||
|
|
||||||
|
describe('getImageID', () => {
|
||||||
|
it('matches', async () => {
|
||||||
|
const imageIDFile = await buildx.getImageIDFile();
|
||||||
|
console.log(`imageIDFile: ${imageIDFile}`);
|
||||||
|
await fs.writeFileSync(imageIDFile, digest);
|
||||||
|
const imageID = await buildx.getImageID();
|
||||||
|
console.log(`imageID: ${imageID}`);
|
||||||
|
expect(imageID).toEqual(digest);
|
||||||
|
});
|
||||||
|
});
|
16
action.yml
16
action.yml
|
@ -19,13 +19,13 @@ inputs:
|
||||||
required: false
|
required: false
|
||||||
default: './Dockerfile'
|
default: './Dockerfile'
|
||||||
build-args:
|
build-args:
|
||||||
description: "Newline-delimited list of build-time variables"
|
description: "List of build-time variables"
|
||||||
required: false
|
required: false
|
||||||
labels:
|
labels:
|
||||||
description: "Newline-delimited list of metadata for an image"
|
description: "List of metadata for an image"
|
||||||
required: false
|
required: false
|
||||||
tags:
|
tags:
|
||||||
description: "Newline-delimited list of tags"
|
description: "List of tags"
|
||||||
required: false
|
required: false
|
||||||
pull:
|
pull:
|
||||||
description: "Always attempt to pull a newer version of the image"
|
description: "Always attempt to pull a newer version of the image"
|
||||||
|
@ -35,14 +35,14 @@ inputs:
|
||||||
description: "Sets the target stage to build"
|
description: "Sets the target stage to build"
|
||||||
required: false
|
required: false
|
||||||
allow:
|
allow:
|
||||||
description: "Allow extra privileged entitlement (eg. network.host,security.insecure)"
|
description: "List of extra privileged entitlement (eg. network.host,security.insecure)"
|
||||||
required: false
|
required: false
|
||||||
no-cache:
|
no-cache:
|
||||||
description: "Do not use cache when building the image"
|
description: "Do not use cache when building the image"
|
||||||
required: false
|
required: false
|
||||||
default: 'false'
|
default: 'false'
|
||||||
platforms:
|
platforms:
|
||||||
description: "Comma-delimited list of target platforms for build"
|
description: "List of target platforms for build"
|
||||||
required: false
|
required: false
|
||||||
load:
|
load:
|
||||||
description: "Load is a shorthand for --output=type=docker"
|
description: "Load is a shorthand for --output=type=docker"
|
||||||
|
@ -53,13 +53,13 @@ inputs:
|
||||||
required: false
|
required: false
|
||||||
default: 'false'
|
default: 'false'
|
||||||
outputs:
|
outputs:
|
||||||
description: "Newline-delimited list of output destinations (format: type=local,dest=path)"
|
description: "List of output destinations (format: type=local,dest=path)"
|
||||||
required: false
|
required: false
|
||||||
cache-from:
|
cache-from:
|
||||||
description: "Newline-delimited list of external cache sources for buildx (eg. user/app:cache, type=local,src=path/to/dir)"
|
description: "List of external cache sources for buildx (eg. user/app:cache, type=local,src=path/to/dir)"
|
||||||
required: false
|
required: false
|
||||||
cache-to:
|
cache-to:
|
||||||
description: "Newline-delimited list of cache export destinations for buildx (eg. user/app:cache, type=local,dest=path/to/dir)"
|
description: "List of cache export destinations for buildx (eg. user/app:cache, type=local,dest=path/to/dir)"
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
|
|
80
dist/index.js
generated
vendored
80
dist/index.js
generated
vendored
|
@ -1025,6 +1025,12 @@ function run() {
|
||||||
core.info(`🏃 Starting build...`);
|
core.info(`🏃 Starting build...`);
|
||||||
const args = yield context_1.getArgs(inputs);
|
const args = yield context_1.getArgs(inputs);
|
||||||
yield exec.exec('docker', args);
|
yield exec.exec('docker', args);
|
||||||
|
const imageID = yield buildx.getImageID();
|
||||||
|
if (imageID) {
|
||||||
|
core.info('🛒 Extracting digest...');
|
||||||
|
core.info(`${imageID}`);
|
||||||
|
core.setOutput('digest', imageID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
core.setFailed(error.message);
|
core.setFailed(error.message);
|
||||||
|
@ -1405,8 +1411,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.asyncForEach = exports.getInputList = exports.getArgs = exports.getInputs = void 0;
|
exports.asyncForEach = exports.getInputList = exports.getArgs = exports.getInputs = exports.tmpDir = void 0;
|
||||||
|
const fs = __importStar(__webpack_require__(747));
|
||||||
|
const os = __importStar(__webpack_require__(87));
|
||||||
|
const path = __importStar(__webpack_require__(622));
|
||||||
|
const buildx = __importStar(__webpack_require__(982));
|
||||||
const core = __importStar(__webpack_require__(470));
|
const core = __importStar(__webpack_require__(470));
|
||||||
|
exports.tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-build-push-'));
|
||||||
function getInputs() {
|
function getInputs() {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
return {
|
return {
|
||||||
|
@ -1440,24 +1451,6 @@ function getArgs(inputs) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.getArgs = getArgs;
|
exports.getArgs = getArgs;
|
||||||
function getCommonArgs(inputs) {
|
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
|
||||||
let args = [];
|
|
||||||
if (inputs.noCache) {
|
|
||||||
args.push('--no-cache');
|
|
||||||
}
|
|
||||||
if (inputs.pull) {
|
|
||||||
args.push('--pull');
|
|
||||||
}
|
|
||||||
if (inputs.load) {
|
|
||||||
args.push('--load');
|
|
||||||
}
|
|
||||||
if (inputs.push) {
|
|
||||||
args.push('--push');
|
|
||||||
}
|
|
||||||
return args;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function getBuildArgs(inputs) {
|
function getBuildArgs(inputs) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
let args = ['build'];
|
let args = ['build'];
|
||||||
|
@ -1473,12 +1466,15 @@ function getBuildArgs(inputs) {
|
||||||
if (inputs.target) {
|
if (inputs.target) {
|
||||||
args.push('--target', inputs.target);
|
args.push('--target', inputs.target);
|
||||||
}
|
}
|
||||||
if (inputs.allow) {
|
if (inputs.allow.length > 0) {
|
||||||
args.push('--allow', inputs.allow.join(','));
|
args.push('--allow', inputs.allow.join(','));
|
||||||
}
|
}
|
||||||
if (inputs.platforms) {
|
if (inputs.platforms.length > 0) {
|
||||||
args.push('--platform', inputs.platforms.join(','));
|
args.push('--platform', inputs.platforms.join(','));
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
args.push('--iidfile', yield buildx.getImageIDFile());
|
||||||
|
}
|
||||||
yield exports.asyncForEach(inputs.outputs, (output) => __awaiter(this, void 0, void 0, function* () {
|
yield exports.asyncForEach(inputs.outputs, (output) => __awaiter(this, void 0, void 0, function* () {
|
||||||
args.push('--output', output);
|
args.push('--output', output);
|
||||||
}));
|
}));
|
||||||
|
@ -1494,6 +1490,24 @@ function getBuildArgs(inputs) {
|
||||||
return args;
|
return args;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
function getCommonArgs(inputs) {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
let args = [];
|
||||||
|
if (inputs.noCache) {
|
||||||
|
args.push('--no-cache');
|
||||||
|
}
|
||||||
|
if (inputs.pull) {
|
||||||
|
args.push('--pull');
|
||||||
|
}
|
||||||
|
if (inputs.load) {
|
||||||
|
args.push('--load');
|
||||||
|
}
|
||||||
|
if (inputs.push) {
|
||||||
|
args.push('--push');
|
||||||
|
}
|
||||||
|
return args;
|
||||||
|
});
|
||||||
|
}
|
||||||
function getInputList(name) {
|
function getInputList(name) {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
const items = core.getInput(name);
|
const items = core.getInput(name);
|
||||||
|
@ -1838,9 +1852,31 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
||||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.use = exports.isAvailable = void 0;
|
exports.use = exports.isAvailable = exports.getImageID = exports.getImageIDFile = void 0;
|
||||||
|
const fs_1 = __importDefault(__webpack_require__(747));
|
||||||
|
const path_1 = __importDefault(__webpack_require__(622));
|
||||||
|
const context = __importStar(__webpack_require__(482));
|
||||||
const exec = __importStar(__webpack_require__(807));
|
const exec = __importStar(__webpack_require__(807));
|
||||||
|
function getImageIDFile() {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
return path_1.default.join(context.tmpDir, 'iidfile');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.getImageIDFile = getImageIDFile;
|
||||||
|
function getImageID() {
|
||||||
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
const iidFile = yield getImageIDFile();
|
||||||
|
if (!fs_1.default.existsSync(iidFile)) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return fs_1.default.readFileSync(iidFile, { encoding: 'utf-8' });
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.getImageID = getImageID;
|
||||||
function isAvailable() {
|
function isAvailable() {
|
||||||
return __awaiter(this, void 0, void 0, function* () {
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
return yield exec.exec(`docker`, ['buildx'], true).then(res => {
|
return yield exec.exec(`docker`, ['buildx'], true).then(res => {
|
||||||
|
|
|
@ -1,5 +1,20 @@
|
||||||
|
import fs from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
import * as context from './context';
|
||||||
import * as exec from './exec';
|
import * as exec from './exec';
|
||||||
|
|
||||||
|
export async function getImageIDFile(): Promise<string> {
|
||||||
|
return path.join(context.tmpDir, 'iidfile');
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getImageID(): Promise<string | undefined> {
|
||||||
|
const iidFile = await getImageIDFile();
|
||||||
|
if (!fs.existsSync(iidFile)) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return fs.readFileSync(iidFile, {encoding: 'utf-8'});
|
||||||
|
}
|
||||||
|
|
||||||
export async function isAvailable(): Promise<Boolean> {
|
export async function isAvailable(): Promise<Boolean> {
|
||||||
return await exec.exec(`docker`, ['buildx'], true).then(res => {
|
return await exec.exec(`docker`, ['buildx'], true).then(res => {
|
||||||
if (res.stderr != '' && !res.success) {
|
if (res.stderr != '' && !res.success) {
|
||||||
|
|
|
@ -1,5 +1,11 @@
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as os from 'os';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as buildx from './buildx';
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
|
|
||||||
|
export const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-build-push-'));
|
||||||
|
|
||||||
export interface Inputs {
|
export interface Inputs {
|
||||||
context: string;
|
context: string;
|
||||||
file: string;
|
file: string;
|
||||||
|
@ -48,6 +54,43 @@ export async function getArgs(inputs: Inputs): Promise<Array<string>> {
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getBuildArgs(inputs: Inputs): Promise<Array<string>> {
|
||||||
|
let args: Array<string> = ['build'];
|
||||||
|
await asyncForEach(inputs.buildArgs, async buildArg => {
|
||||||
|
args.push('--build-arg', buildArg);
|
||||||
|
});
|
||||||
|
await asyncForEach(inputs.labels, async label => {
|
||||||
|
args.push('--label', label);
|
||||||
|
});
|
||||||
|
await asyncForEach(inputs.tags, async tag => {
|
||||||
|
args.push('--tag', tag);
|
||||||
|
});
|
||||||
|
if (inputs.target) {
|
||||||
|
args.push('--target', inputs.target);
|
||||||
|
}
|
||||||
|
if (inputs.allow.length > 0) {
|
||||||
|
args.push('--allow', inputs.allow.join(','));
|
||||||
|
}
|
||||||
|
if (inputs.platforms.length > 0) {
|
||||||
|
args.push('--platform', inputs.platforms.join(','));
|
||||||
|
} else {
|
||||||
|
args.push('--iidfile', await buildx.getImageIDFile());
|
||||||
|
}
|
||||||
|
await asyncForEach(inputs.outputs, async output => {
|
||||||
|
args.push('--output', output);
|
||||||
|
});
|
||||||
|
await asyncForEach(inputs.cacheFrom, async cacheFrom => {
|
||||||
|
args.push('--cache-from', cacheFrom);
|
||||||
|
});
|
||||||
|
await asyncForEach(inputs.cacheTo, async cacheTo => {
|
||||||
|
args.push('--cache-to', cacheTo);
|
||||||
|
});
|
||||||
|
if (inputs.file) {
|
||||||
|
args.push('--file', inputs.file);
|
||||||
|
}
|
||||||
|
return args;
|
||||||
|
}
|
||||||
|
|
||||||
async function getCommonArgs(inputs: Inputs): Promise<Array<string>> {
|
async function getCommonArgs(inputs: Inputs): Promise<Array<string>> {
|
||||||
let args: Array<string> = [];
|
let args: Array<string> = [];
|
||||||
if (inputs.noCache) {
|
if (inputs.noCache) {
|
||||||
|
@ -65,41 +108,6 @@ async function getCommonArgs(inputs: Inputs): Promise<Array<string>> {
|
||||||
return args;
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getBuildArgs(inputs: Inputs): Promise<Array<string>> {
|
|
||||||
let args: Array<string> = ['build'];
|
|
||||||
await asyncForEach(inputs.buildArgs, async buildArg => {
|
|
||||||
args.push('--build-arg', buildArg);
|
|
||||||
});
|
|
||||||
await asyncForEach(inputs.labels, async label => {
|
|
||||||
args.push('--label', label);
|
|
||||||
});
|
|
||||||
await asyncForEach(inputs.tags, async tag => {
|
|
||||||
args.push('--tag', tag);
|
|
||||||
});
|
|
||||||
if (inputs.target) {
|
|
||||||
args.push('--target', inputs.target);
|
|
||||||
}
|
|
||||||
if (inputs.allow) {
|
|
||||||
args.push('--allow', inputs.allow.join(','));
|
|
||||||
}
|
|
||||||
if (inputs.platforms) {
|
|
||||||
args.push('--platform', inputs.platforms.join(','));
|
|
||||||
}
|
|
||||||
await asyncForEach(inputs.outputs, async output => {
|
|
||||||
args.push('--output', output);
|
|
||||||
});
|
|
||||||
await asyncForEach(inputs.cacheFrom, async cacheFrom => {
|
|
||||||
args.push('--cache-from', cacheFrom);
|
|
||||||
});
|
|
||||||
await asyncForEach(inputs.cacheTo, async cacheTo => {
|
|
||||||
args.push('--cache-to', cacheTo);
|
|
||||||
});
|
|
||||||
if (inputs.file) {
|
|
||||||
args.push('--file', inputs.file);
|
|
||||||
}
|
|
||||||
return args;
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getInputList(name: string): Promise<string[]> {
|
export async function getInputList(name: string): Promise<string[]> {
|
||||||
const items = core.getInput(name);
|
const items = core.getInput(name);
|
||||||
if (items == '') {
|
if (items == '') {
|
||||||
|
|
|
@ -25,6 +25,13 @@ async function run(): Promise<void> {
|
||||||
core.info(`🏃 Starting build...`);
|
core.info(`🏃 Starting build...`);
|
||||||
const args: string[] = await getArgs(inputs);
|
const args: string[] = await getArgs(inputs);
|
||||||
await exec.exec('docker', args);
|
await exec.exec('docker', args);
|
||||||
|
|
||||||
|
const imageID = await buildx.getImageID();
|
||||||
|
if (imageID) {
|
||||||
|
core.info('🛒 Extracting digest...');
|
||||||
|
core.info(`${imageID}`);
|
||||||
|
core.setOutput('digest', imageID);
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
core.setFailed(error.message);
|
core.setFailed(error.message);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue