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 buildx = __importStar(__webpack_require__(982));
 | 
			
		||||
const context_helper_1 = __webpack_require__(338);
 | 
			
		||||
const docker_1 = __webpack_require__(231);
 | 
			
		||||
const core = __importStar(__webpack_require__(470));
 | 
			
		||||
const exec = __importStar(__webpack_require__(986));
 | 
			
		||||
function run() {
 | 
			
		||||
@ -1081,7 +1082,12 @@ function run() {
 | 
			
		||||
            if (!buildxEnabled && inputs.push) {
 | 
			
		||||
                let pushRepos = [];
 | 
			
		||||
                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)) {
 | 
			
		||||
                        pushRepos.push(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:
 | 
			
		||||
/***/ (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 buildx from './buildx';
 | 
			
		||||
import {Inputs, loadInputs, mustBuildx} from './context-helper';
 | 
			
		||||
import {Image, parseImage} from './docker';
 | 
			
		||||
import * as core from '@actions/core';
 | 
			
		||||
import * as exec from '@actions/exec';
 | 
			
		||||
 | 
			
		||||
@ -84,10 +85,14 @@ async function run(): Promise<void> {
 | 
			
		||||
    if (!buildxEnabled && inputs.push) {
 | 
			
		||||
      let pushRepos: Array<string> = [];
 | 
			
		||||
      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)) {
 | 
			
		||||
          pushRepos.push(repo);
 | 
			
		||||
 | 
			
		||||
          core.info(`⬆️ Pushing ${repo}...`);
 | 
			
		||||
          await exec.exec('docker', ['push', repo]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user