Parse image reference before push

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
CrazyMax 2020-08-16 01:50:46 +02:00
parent b15ad02902
commit 320acb8414
No known key found for this signature in database
GPG key ID: 3248E46B6BB8C7F7
3 changed files with 84 additions and 3 deletions

48
dist/index.js generated vendored
View file

@ -1004,6 +1004,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
const os = __importStar(__webpack_require__(87)); const os = __importStar(__webpack_require__(87));
const buildx = __importStar(__webpack_require__(982)); const buildx = __importStar(__webpack_require__(982));
const context_helper_1 = __webpack_require__(338); const context_helper_1 = __webpack_require__(338);
const docker_1 = __webpack_require__(231);
const core = __importStar(__webpack_require__(470)); const core = __importStar(__webpack_require__(470));
const exec = __importStar(__webpack_require__(986)); const exec = __importStar(__webpack_require__(986));
function run() { function run() {
@ -1081,7 +1082,12 @@ function run() {
if (!buildxEnabled && inputs.push) { if (!buildxEnabled && inputs.push) {
let pushRepos = []; let pushRepos = [];
yield asyncForEach(inputs.tags, (tag) => __awaiter(this, void 0, void 0, function* () { yield asyncForEach(inputs.tags, (tag) => __awaiter(this, void 0, void 0, function* () {
const repo = tag.split(':', -1)[0]; const img = yield docker_1.parseImage(tag);
if (!img) {
core.warning(`Cannot parse image reference ${tag}`);
return;
}
const repo = `${img.registry}${img.namespace}${img.repository}`;
if (!pushRepos.includes(repo)) { if (!pushRepos.includes(repo)) {
pushRepos.push(repo); pushRepos.push(repo);
core.info(`⬆️ Pushing ${repo}...`); core.info(`⬆️ Pushing ${repo}...`);
@ -1105,6 +1111,46 @@ run();
/***/ }), /***/ }),
/***/ 231:
/***/ (function(__unusedmodule, exports) {
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseImage = void 0;
exports.parseImage = (image) => __awaiter(void 0, void 0, void 0, function* () {
const match = image.match(/^(?:([^\/]+)\/)?(?:([^\/]+)\/)?([^@:\/]+)(?:[@:](.+))?$/);
if (!match) {
return;
}
let res = {
registry: match[1],
namespace: match[2],
repository: match[3],
tag: match[4]
};
if (!res.namespace && res.registry && !/[:.]/.test(res.registry)) {
res.namespace = res.registry;
res.registry = undefined;
}
res.registry = res.registry ? `${res.registry}/` : '';
res.namespace = res.namespace && res.namespace !== 'library' ? `${res.namespace}/` : '';
res.tag = res.tag && res.tag !== 'latest' ? `:${res.tag}` : '';
return res;
});
//# sourceMappingURL=docker.js.map
/***/ }),
/***/ 338: /***/ 338:
/***/ (function(__unusedmodule, exports, __webpack_require__) { /***/ (function(__unusedmodule, exports, __webpack_require__) {

30
src/docker.ts Normal file
View file

@ -0,0 +1,30 @@
export interface Image {
registry?: string;
namespace?: string;
repository: string;
tag?: string;
}
export const parseImage = async (image: string): Promise<Image | undefined> => {
const match = image.match(/^(?:([^\/]+)\/)?(?:([^\/]+)\/)?([^@:\/]+)(?:[@:](.+))?$/);
if (!match) {
return;
}
let res: Image = {
registry: match[1],
namespace: match[2],
repository: match[3],
tag: match[4]
};
if (!res.namespace && res.registry && !/[:.]/.test(res.registry)) {
res.namespace = res.registry;
res.registry = undefined;
}
res.registry = res.registry ? `${res.registry}/` : '';
res.namespace = res.namespace && res.namespace !== 'library' ? `${res.namespace}/` : '';
res.tag = res.tag && res.tag !== 'latest' ? `:${res.tag}` : '';
return res;
};

View file

@ -1,6 +1,7 @@
import * as os from 'os'; import * as os from 'os';
import * as buildx from './buildx'; import * as buildx from './buildx';
import {Inputs, loadInputs, mustBuildx} from './context-helper'; import {Inputs, loadInputs, mustBuildx} from './context-helper';
import {Image, parseImage} from './docker';
import * as core from '@actions/core'; import * as core from '@actions/core';
import * as exec from '@actions/exec'; import * as exec from '@actions/exec';
@ -84,10 +85,14 @@ async function run(): Promise<void> {
if (!buildxEnabled && inputs.push) { if (!buildxEnabled && inputs.push) {
let pushRepos: Array<string> = []; let pushRepos: Array<string> = [];
await asyncForEach(inputs.tags, async tag => { await asyncForEach(inputs.tags, async tag => {
const repo = tag.split(':', -1)[0]; const img: Image | undefined = await parseImage(tag);
if (!img) {
core.warning(`Cannot parse image reference ${tag}`);
return;
}
const repo: string = `${img.registry}${img.namespace}${img.repository}`;
if (!pushRepos.includes(repo)) { if (!pushRepos.includes(repo)) {
pushRepos.push(repo); pushRepos.push(repo);
core.info(`⬆️ Pushing ${repo}...`); core.info(`⬆️ Pushing ${repo}...`);
await exec.exec('docker', ['push', repo]); await exec.exec('docker', ['push', repo]);
} }