Parse image reference before push
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									b15ad02902
								
							
						
					
					
						commit
						320acb8414
					
				
							
								
								
									
										48
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -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
									
								
							
							
						
						
									
										30
									
								
								src/docker.ts
									
									
									
									
									
										Normal 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;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -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]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user