mirror of
				https://gitea.com/docker/build-push-action.git
				synced 2025-10-31 00:58:18 +07:00 
			
		
		
		
	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