Remove builder v1 support
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									585c2ae3b7
								
							
						
					
					
						commit
						78a1e0d9a3
					
				
							
								
								
									
										24
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @ -12,30 +12,6 @@ on: | |||||||
| 
 | 
 | ||||||
| jobs: | jobs: | ||||||
|   main: |   main: | ||||||
|     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: Build and push |  | ||||||
|         uses: ./ |  | ||||||
|         with: |  | ||||||
|           context: ./test |  | ||||||
|           file: ./test/Dockerfile |  | ||||||
|           push: true |  | ||||||
|           tags: | |  | ||||||
|             localhost:5000/name/app:latest |  | ||||||
|             localhost:5000/name/app:1.0.0 |  | ||||||
|       - |  | ||||||
|         name: Dump context |  | ||||||
|         uses: crazy-max/ghaction-dump-context@v1 |  | ||||||
| 
 |  | ||||||
|   buildx: |  | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|  | |||||||
							
								
								
									
										62
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								README.md
									
									
									
									
									
								
							| @ -6,7 +6,6 @@ ___ | |||||||
| 
 | 
 | ||||||
| * [Usage](#usage) | * [Usage](#usage) | ||||||
|   * [Quick start](#quick-start) |   * [Quick start](#quick-start) | ||||||
|   * [With Buildx](#with-buildx) |  | ||||||
| * [Customizing](#customizing) | * [Customizing](#customizing) | ||||||
|   * [inputs](#inputs) |   * [inputs](#inputs) | ||||||
|   * [outputs](#outputs) |   * [outputs](#outputs) | ||||||
| @ -14,49 +13,16 @@ ___ | |||||||
| 
 | 
 | ||||||
| ## Usage | ## Usage | ||||||
| 
 | 
 | ||||||
|  | This action uses our [setup-buildx](https://github.com/docker/setup-buildx-action) action that extends the | ||||||
|  | `docker build` command named [buildx](https://github.com/docker/buildx) with the full support of the features | ||||||
|  | provided by [Moby BuildKit](https://github.com/moby/buildkit) builder toolkik. This includes multi-arch build, | ||||||
|  | build-secrets, remote cache, etc. and different builder deployment/namespacing options. | ||||||
|  | 
 | ||||||
| ### Quick start | ### Quick start | ||||||
| 
 | 
 | ||||||
| ```yaml | ```yaml | ||||||
| name: ci | name: ci | ||||||
| 
 | 
 | ||||||
| on: |  | ||||||
|   pull_request: |  | ||||||
|     branches: master |  | ||||||
|   push: |  | ||||||
|     branches: master |  | ||||||
|     tags: |  | ||||||
| 
 |  | ||||||
| jobs: |  | ||||||
|   build: |  | ||||||
|     runs-on: ubuntu-latest |  | ||||||
|     steps: |  | ||||||
|       - |  | ||||||
|         name: Checkout |  | ||||||
|         uses: actions/checkout@v2 |  | ||||||
|       - |  | ||||||
|         name: Login to DockerHub |  | ||||||
|         uses: docker/login-action@v1 |  | ||||||
|         with: |  | ||||||
|           username: ${{ secrets.DOCKER_USERNAME }} |  | ||||||
|           password: ${{ secrets.DOCKER_PASSWORD }} |  | ||||||
|       - |  | ||||||
|         name: Build and push |  | ||||||
|         uses: docker/build-push-action@v2 |  | ||||||
|         with: |  | ||||||
|           tags: | |  | ||||||
|             user/app:latest |  | ||||||
|             user/app:1.0.0 |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| ### With Buildx |  | ||||||
| 
 |  | ||||||
| You can also use our [setup-buildx](https://github.com/docker/setup-buildx-action) action that extends the |  | ||||||
| `docker build` command with the full support of the features provided by |  | ||||||
| [Moby BuildKit](https://github.com/moby/buildkit) builder toolkit to build multi-platform images. |  | ||||||
| 
 |  | ||||||
| ```yaml |  | ||||||
| name: ci |  | ||||||
| 
 |  | ||||||
| on: | on: | ||||||
|   pull_request: |   pull_request: | ||||||
|     branches: master |     branches: master | ||||||
| @ -94,6 +60,7 @@ jobs: | |||||||
|         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 |           platforms: linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/386,linux/ppc64le,linux/s390x | ||||||
|  |           push: true | ||||||
|           tags: | |           tags: | | ||||||
|             user/app:latest |             user/app:latest | ||||||
|             user/app:1.0.0 |             user/app:1.0.0 | ||||||
| @ -107,6 +74,7 @@ Following inputs can be used as `step.with` keys | |||||||
| 
 | 
 | ||||||
| | Name                | Type    | Default                           | Description                        | | | Name                | Type    | Default                           | Description                        | | ||||||
| |---------------------|---------|-----------------------------------|------------------------------------| | |---------------------|---------|-----------------------------------|------------------------------------| | ||||||
|  | | `builder`           | String  |                                   | Builder instance | | ||||||
| | `context`           | String  | `.`                               | Build's context is the set of files located in the specified `PATH` or `URL` | | | `context`           | String  | `.`                               | Build's context is the set of files located in the specified `PATH` or `URL` | | ||||||
| | `file`              | String  | `./Dockerfile`                    | Path to the Dockerfile. | | | `file`              | String  | `./Dockerfile`                    | Path to the Dockerfile. | | ||||||
| | `build-args`        | String  |                                   | Newline-delimited list of build-time variables | | | `build-args`        | String  |                                   | Newline-delimited list of build-time variables | | ||||||
| @ -115,16 +83,12 @@ Following inputs can be used as `step.with` keys | |||||||
| | `pull`              | Bool    | `false`                           | Always attempt to pull a newer version of the image | | | `pull`              | Bool    | `false`                           | Always attempt to pull a newer version of the image | | ||||||
| | `target`            | String  |                                   | Sets the target stage to build | | | `target`            | String  |                                   | Sets the target stage to build | | ||||||
| | `no-cache`          | Bool    | `false`                           | Do not use cache when building the image | | | `no-cache`          | Bool    | `false`                           | Do not use cache when building the image | | ||||||
| | `builder`**¹**      | String  |                                   | Builder instance | | | `platforms`         | String  |                                   | Comma-delimited list of target platforms for build | | ||||||
| | `platforms`**¹**    | String  |                                   | Comma-delimited list of target platforms for build | | | `load`              | Bool    | `false`                           | Shorthand for `--output=type=docker` | | ||||||
| | `load`**¹**         | Bool    | `false`                           | Shorthand for `--output=type=docker` | | | `push`              | Bool    | `false`                           | Shorthand for `--output=type=registry` | | ||||||
| | `push`              | Bool    | `false`                           | Whether to push the built image (or shorthand for `--output=type=registry` if buildx used) | | | `outputs`           | String  |                                   | Newline-delimited list of output destinations (format: `type=local,dest=path`) | | ||||||
| | `outputs`**¹**      | String  |                                   | Newline-delimited list of output destinations (format: `type=local,dest=path`) | | | `cache-from`        | String  |                                   | Newline-delimited list of external cache sources (eg. `user/app:cache`, `type=local,src=path/to/dir`) | | ||||||
| | `cache-from`**¹**   | String  |                                   | Newline-delimited list of external cache sources (eg. `user/app:cache`, `type=local,src=path/to/dir`) | | | `cache-to`          | String  |                                   | Newline-delimited list of cache export destinations (eg. `user/app:cache`, `type=local,dest=path/to/dir`) | | ||||||
| | `cache-to`**¹**     | String  |                                   | Newline-delimited list of cache export destinations (eg. `user/app:cache`, `type=local,dest=path/to/dir`) | |  | ||||||
| 
 |  | ||||||
| > **¹** Only available if [docker buildx](https://github.com/docker/buildx) is enabled. |  | ||||||
| > See [setup-buildx](https://github.com/docker/setup-buildx-action) action for more info. |  | ||||||
| 
 | 
 | ||||||
| ### outputs | ### outputs | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -6,6 +6,9 @@ branding: | |||||||
|   color: 'blue' |   color: 'blue' | ||||||
| 
 | 
 | ||||||
| inputs: | inputs: | ||||||
|  |   builder: | ||||||
|  |     description: "Builder instance" | ||||||
|  |     required: false | ||||||
|   context: |   context: | ||||||
|     description: "Build's context is the set of files located in the specified PATH or URL" |     description: "Build's context is the set of files located in the specified PATH or URL" | ||||||
|     required: false |     required: false | ||||||
| @ -34,9 +37,6 @@ inputs: | |||||||
|     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' | ||||||
|   builder: |  | ||||||
|     description: "Builder instance" |  | ||||||
|     required: false |  | ||||||
|   platforms: |   platforms: | ||||||
|     description: "Comma-delimited list of target platforms for build" |     description: "Comma-delimited list of target platforms for build" | ||||||
|     required: false |     required: false | ||||||
| @ -45,7 +45,7 @@ inputs: | |||||||
|     required: false |     required: false | ||||||
|     default: 'false' |     default: 'false' | ||||||
|   push: |   push: | ||||||
|     description: "Whether to push the built image (shorthand for --output=type=registry if buildx used)" |     description: "Shorthand for --output=type=registry" | ||||||
|     required: false |     required: false | ||||||
|     default: 'false' |     default: 'false' | ||||||
|   outputs: |   outputs: | ||||||
| @ -65,4 +65,3 @@ outputs: | |||||||
| runs: | runs: | ||||||
|   using: 'node12' |   using: 'node12' | ||||||
|   main: 'dist/index.js' |   main: 'dist/index.js' | ||||||
| 
 |  | ||||||
|  | |||||||
							
								
								
									
										161
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										161
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1004,7 +1004,6 @@ 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() { | ||||||
| @ -1015,23 +1014,15 @@ function run() { | |||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             const inputs = yield context_helper_1.loadInputs(); |             const inputs = yield context_helper_1.loadInputs(); | ||||||
|             const buildxAvailable = yield buildx.isAvailable(); |             if (!(yield buildx.isAvailable())) { | ||||||
|             const buildxInstalled = buildxAvailable && (yield buildx.isInstalled()); |                 core.setFailed(`Buildx is required. See https://github.com/docker/setup-buildx-action to set up buildx.`); | ||||||
|             const buildxEnabled = (yield context_helper_1.mustBuildx(inputs)) || buildxInstalled; |                 return; | ||||||
|             let buildArgs = []; |  | ||||||
|             // Check buildx
 |  | ||||||
|             if (buildxEnabled) { |  | ||||||
|                 if (!buildxAvailable) { |  | ||||||
|                     core.setFailed(`Buildx is required but not available`); |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|                 core.info(`🚀 Buildx will be used to build your image`); |  | ||||||
|                 buildArgs.push('buildx', 'build'); |  | ||||||
|             } |             } | ||||||
|             else { |             let buildArgs = ['buildx', 'build']; | ||||||
|                 buildArgs.push('build'); |             if (inputs.builder) { | ||||||
|  |                 core.info(`📌 Using builder instance ${inputs.builder}`); | ||||||
|  |                 yield buildx.use(inputs.builder); | ||||||
|             } |             } | ||||||
|             // Global options
 |  | ||||||
|             if (inputs.file) { |             if (inputs.file) { | ||||||
|                 buildArgs.push('--file', inputs.file); |                 buildArgs.push('--file', inputs.file); | ||||||
|             } |             } | ||||||
| @ -1053,50 +1044,27 @@ function run() { | |||||||
|             if (inputs.noCache) { |             if (inputs.noCache) { | ||||||
|                 buildArgs.push('--no-cache'); |                 buildArgs.push('--no-cache'); | ||||||
|             } |             } | ||||||
|             // Buildx options
 |             if (inputs.platforms) { | ||||||
|             if (buildxEnabled) { |                 buildArgs.push('--platform', inputs.platforms); | ||||||
|                 if (inputs.builder) { |  | ||||||
|                     core.info(`📌 Using builder instance ${inputs.builder}`); |  | ||||||
|                     yield buildx.use(inputs.builder); |  | ||||||
|                 } |  | ||||||
|                 if (inputs.platforms) { |  | ||||||
|                     buildArgs.push('--platform', inputs.platforms); |  | ||||||
|                 } |  | ||||||
|                 if (inputs.load) { |  | ||||||
|                     buildArgs.push('--load'); |  | ||||||
|                 } |  | ||||||
|                 if (inputs.push) { |  | ||||||
|                     buildArgs.push('--push'); |  | ||||||
|                 } |  | ||||||
|                 yield asyncForEach(inputs.outputs, (output) => __awaiter(this, void 0, void 0, function* () { |  | ||||||
|                     buildArgs.push('--output', output); |  | ||||||
|                 })); |  | ||||||
|                 yield asyncForEach(inputs.cacheFrom, (cacheFrom) => __awaiter(this, void 0, void 0, function* () { |  | ||||||
|                     buildArgs.push('--cache-from', cacheFrom); |  | ||||||
|                 })); |  | ||||||
|                 yield asyncForEach(inputs.cacheTo, (cacheTo) => __awaiter(this, void 0, void 0, function* () { |  | ||||||
|                     buildArgs.push('--cache-from', cacheTo); |  | ||||||
|                 })); |  | ||||||
|             } |             } | ||||||
|  |             if (inputs.load) { | ||||||
|  |                 buildArgs.push('--load'); | ||||||
|  |             } | ||||||
|  |             if (inputs.push) { | ||||||
|  |                 buildArgs.push('--push'); | ||||||
|  |             } | ||||||
|  |             yield asyncForEach(inputs.outputs, (output) => __awaiter(this, void 0, void 0, function* () { | ||||||
|  |                 buildArgs.push('--output', output); | ||||||
|  |             })); | ||||||
|  |             yield asyncForEach(inputs.cacheFrom, (cacheFrom) => __awaiter(this, void 0, void 0, function* () { | ||||||
|  |                 buildArgs.push('--cache-from', cacheFrom); | ||||||
|  |             })); | ||||||
|  |             yield asyncForEach(inputs.cacheTo, (cacheTo) => __awaiter(this, void 0, void 0, function* () { | ||||||
|  |                 buildArgs.push('--cache-from', cacheTo); | ||||||
|  |             })); | ||||||
|             buildArgs.push(inputs.context); |             buildArgs.push(inputs.context); | ||||||
|             core.info(`🏃 Starting build...`); |             core.info(`🏃 Starting build...`); | ||||||
|             yield exec.exec('docker', buildArgs); |             yield exec.exec('docker', buildArgs); | ||||||
|             if (!buildxEnabled && inputs.push) { |  | ||||||
|                 let pushRepos = []; |  | ||||||
|                 yield asyncForEach(inputs.tags, (tag) => __awaiter(this, void 0, void 0, function* () { |  | ||||||
|                     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}...`); |  | ||||||
|                         yield exec.exec('docker', ['push', repo]); |  | ||||||
|                     } |  | ||||||
|                 })); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         catch (error) { |         catch (error) { | ||||||
|             core.setFailed(error.message); |             core.setFailed(error.message); | ||||||
| @ -1113,63 +1081,6 @@ run(); | |||||||
| 
 | 
 | ||||||
| /***/ }), | /***/ }), | ||||||
| 
 | 
 | ||||||
| /***/ 231: |  | ||||||
| /***/ (function(__unusedmodule, exports, __webpack_require__) { |  | ||||||
| 
 |  | ||||||
| "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()); |  | ||||||
|     }); |  | ||||||
| }; |  | ||||||
| var __importDefault = (this && this.__importDefault) || function (mod) { |  | ||||||
|     return (mod && mod.__esModule) ? mod : { "default": mod }; |  | ||||||
| }; |  | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); |  | ||||||
| exports.parseImage = exports.config = void 0; |  | ||||||
| const path_1 = __importDefault(__webpack_require__(622)); |  | ||||||
| const os_1 = __importDefault(__webpack_require__(87)); |  | ||||||
| const fs_1 = __importDefault(__webpack_require__(747)); |  | ||||||
| function config() { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         const dockerHome = process.env.DOCKER_CONFIG || path_1.default.join(os_1.default.homedir(), '.docker'); |  | ||||||
|         const file = path_1.default.join(dockerHome, 'config.json'); |  | ||||||
|         if (!fs_1.default.existsSync(file)) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         return JSON.parse(fs_1.default.readFileSync(file, { encoding: 'utf-8' })); |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.config = config; |  | ||||||
| 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__) { | ||||||
| 
 | 
 | ||||||
| @ -1204,7 +1115,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge | |||||||
|     }); |     }); | ||||||
| }; | }; | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); | Object.defineProperty(exports, "__esModule", { value: true }); | ||||||
| exports.mustBuildx = exports.loadInputs = void 0; | exports.loadInputs = void 0; | ||||||
| const core = __importStar(__webpack_require__(470)); | const core = __importStar(__webpack_require__(470)); | ||||||
| function loadInputs() { | function loadInputs() { | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |     return __awaiter(this, void 0, void 0, function* () { | ||||||
| @ -1228,17 +1139,6 @@ function loadInputs() { | |||||||
|     }); |     }); | ||||||
| } | } | ||||||
| exports.loadInputs = loadInputs; | exports.loadInputs = loadInputs; | ||||||
| function mustBuildx(inputs) { |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         return (inputs.builder.length > 0 || |  | ||||||
|             inputs.platforms.length > 0 || |  | ||||||
|             inputs.load || |  | ||||||
|             inputs.outputs.length > 0 || |  | ||||||
|             inputs.cacheFrom.length > 0 || |  | ||||||
|             inputs.cacheTo.length > 0); |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.mustBuildx = mustBuildx; |  | ||||||
| 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); | ||||||
| @ -1913,8 +1813,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge | |||||||
|     }); |     }); | ||||||
| }; | }; | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); | Object.defineProperty(exports, "__esModule", { value: true }); | ||||||
| exports.use = exports.isInstalled = exports.isAvailable = void 0; | exports.use = exports.isAvailable = void 0; | ||||||
| const docker = __importStar(__webpack_require__(231)); |  | ||||||
| const exec = __importStar(__webpack_require__(807)); | const exec = __importStar(__webpack_require__(807)); | ||||||
| function isAvailable() { | function isAvailable() { | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |     return __awaiter(this, void 0, void 0, function* () { | ||||||
| @ -1927,14 +1826,6 @@ function isAvailable() { | |||||||
|     }); |     }); | ||||||
| } | } | ||||||
| exports.isAvailable = isAvailable; | exports.isAvailable = isAvailable; | ||||||
| function isInstalled() { |  | ||||||
|     var _a; |  | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |  | ||||||
|         const dockerCfg = yield docker.config(); |  | ||||||
|         return ((_a = dockerCfg === null || dockerCfg === void 0 ? void 0 : dockerCfg.aliases) === null || _a === void 0 ? void 0 : _a.builder) == 'buildx'; |  | ||||||
|     }); |  | ||||||
| } |  | ||||||
| exports.isInstalled = isInstalled; |  | ||||||
| function use(builder) { | function use(builder) { | ||||||
|     return __awaiter(this, void 0, void 0, function* () { |     return __awaiter(this, void 0, void 0, function* () { | ||||||
|         return yield exec.exec(`docker`, ['buildx', 'use', '--builder', builder], false).then(res => { |         return yield exec.exec(`docker`, ['buildx', 'use', '--builder', builder], false).then(res => { | ||||||
|  | |||||||
| @ -1,4 +1,3 @@ | |||||||
| import * as docker from './docker'; |  | ||||||
| import * as exec from './exec'; | import * as exec from './exec'; | ||||||
| 
 | 
 | ||||||
| export async function isAvailable(): Promise<Boolean> { | export async function isAvailable(): Promise<Boolean> { | ||||||
| @ -10,11 +9,6 @@ export async function isAvailable(): Promise<Boolean> { | |||||||
|   }); |   }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function isInstalled(): Promise<Boolean> { |  | ||||||
|   const dockerCfg = await docker.config(); |  | ||||||
|   return dockerCfg?.aliases?.builder == 'buildx'; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| export async function use(builder: string): Promise<void> { | export async function use(builder: string): Promise<void> { | ||||||
|   return await exec.exec(`docker`, ['buildx', 'use', '--builder', builder], false).then(res => { |   return await exec.exec(`docker`, ['buildx', 'use', '--builder', builder], false).then(res => { | ||||||
|     if (res.stderr != '' && !res.success) { |     if (res.stderr != '' && !res.success) { | ||||||
|  | |||||||
| @ -38,17 +38,6 @@ export async function loadInputs(): Promise<Inputs> { | |||||||
|   }; |   }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export async function mustBuildx(inputs: Inputs): Promise<boolean> { |  | ||||||
|   return ( |  | ||||||
|     inputs.builder.length > 0 || |  | ||||||
|     inputs.platforms.length > 0 || |  | ||||||
|     inputs.load || |  | ||||||
|     inputs.outputs.length > 0 || |  | ||||||
|     inputs.cacheFrom.length > 0 || |  | ||||||
|     inputs.cacheTo.length > 0 |  | ||||||
|   ); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| async function getInputList(name: string): Promise<string[]> { | async function getInputList(name: string): Promise<string[]> { | ||||||
|   const items = core.getInput(name); |   const items = core.getInput(name); | ||||||
|   if (items == '') { |   if (items == '') { | ||||||
|  | |||||||
| @ -1,54 +0,0 @@ | |||||||
| import path from 'path'; |  | ||||||
| import os from 'os'; |  | ||||||
| import fs from 'fs'; |  | ||||||
| 
 |  | ||||||
| export interface Config { |  | ||||||
|   credsStore?: string; |  | ||||||
|   experimental?: string; |  | ||||||
|   stackOrchestrator?: string; |  | ||||||
|   aliases?: { |  | ||||||
|     builder?: string; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| export interface Image { |  | ||||||
|   registry?: string; |  | ||||||
|   namespace?: string; |  | ||||||
|   repository: string; |  | ||||||
|   tag?: string; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| export async function config(): Promise<Config | undefined> { |  | ||||||
|   const dockerHome: string = process.env.DOCKER_CONFIG || path.join(os.homedir(), '.docker'); |  | ||||||
| 
 |  | ||||||
|   const file: string = path.join(dockerHome, 'config.json'); |  | ||||||
|   if (!fs.existsSync(file)) { |  | ||||||
|     return; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return JSON.parse(fs.readFileSync(file, {encoding: 'utf-8'})) as Config; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 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; |  | ||||||
| }; |  | ||||||
							
								
								
									
										87
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										87
									
								
								src/main.ts
									
									
									
									
									
								
							| @ -1,7 +1,6 @@ | |||||||
| 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} 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'; | ||||||
| 
 | 
 | ||||||
| @ -13,24 +12,18 @@ async function run(): Promise<void> { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const inputs: Inputs = await loadInputs(); |     const inputs: Inputs = await loadInputs(); | ||||||
|     const buildxAvailable = await buildx.isAvailable(); |  | ||||||
|     const buildxInstalled = buildxAvailable && (await buildx.isInstalled()); |  | ||||||
|     const buildxEnabled = (await mustBuildx(inputs)) || buildxInstalled; |  | ||||||
|     let buildArgs: Array<string> = []; |  | ||||||
| 
 | 
 | ||||||
|     // Check buildx
 |     if (!(await buildx.isAvailable())) { | ||||||
|     if (buildxEnabled) { |       core.setFailed(`Buildx is required. See https://github.com/docker/setup-buildx-action to set up buildx.`); | ||||||
|       if (!buildxAvailable) { |       return; | ||||||
|         core.setFailed(`Buildx is required but not available`); |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
|       core.info(`🚀 Buildx will be used to build your image`); |  | ||||||
|       buildArgs.push('buildx', 'build'); |  | ||||||
|     } else { |  | ||||||
|       buildArgs.push('build'); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Global options
 |     let buildArgs: Array<string> = ['buildx', 'build']; | ||||||
|  | 
 | ||||||
|  |     if (inputs.builder) { | ||||||
|  |       core.info(`📌 Using builder instance ${inputs.builder}`); | ||||||
|  |       await buildx.use(inputs.builder); | ||||||
|  |     } | ||||||
|     if (inputs.file) { |     if (inputs.file) { | ||||||
|       buildArgs.push('--file', inputs.file); |       buildArgs.push('--file', inputs.file); | ||||||
|     } |     } | ||||||
| @ -52,54 +45,28 @@ async function run(): Promise<void> { | |||||||
|     if (inputs.noCache) { |     if (inputs.noCache) { | ||||||
|       buildArgs.push('--no-cache'); |       buildArgs.push('--no-cache'); | ||||||
|     } |     } | ||||||
| 
 |     if (inputs.platforms) { | ||||||
|     // Buildx options
 |       buildArgs.push('--platform', inputs.platforms); | ||||||
|     if (buildxEnabled) { |  | ||||||
|       if (inputs.builder) { |  | ||||||
|         core.info(`📌 Using builder instance ${inputs.builder}`); |  | ||||||
|         await buildx.use(inputs.builder); |  | ||||||
|       } |  | ||||||
|       if (inputs.platforms) { |  | ||||||
|         buildArgs.push('--platform', inputs.platforms); |  | ||||||
|       } |  | ||||||
|       if (inputs.load) { |  | ||||||
|         buildArgs.push('--load'); |  | ||||||
|       } |  | ||||||
|       if (inputs.push) { |  | ||||||
|         buildArgs.push('--push'); |  | ||||||
|       } |  | ||||||
|       await asyncForEach(inputs.outputs, async output => { |  | ||||||
|         buildArgs.push('--output', output); |  | ||||||
|       }); |  | ||||||
|       await asyncForEach(inputs.cacheFrom, async cacheFrom => { |  | ||||||
|         buildArgs.push('--cache-from', cacheFrom); |  | ||||||
|       }); |  | ||||||
|       await asyncForEach(inputs.cacheTo, async cacheTo => { |  | ||||||
|         buildArgs.push('--cache-from', cacheTo); |  | ||||||
|       }); |  | ||||||
|     } |     } | ||||||
| 
 |     if (inputs.load) { | ||||||
|  |       buildArgs.push('--load'); | ||||||
|  |     } | ||||||
|  |     if (inputs.push) { | ||||||
|  |       buildArgs.push('--push'); | ||||||
|  |     } | ||||||
|  |     await asyncForEach(inputs.outputs, async output => { | ||||||
|  |       buildArgs.push('--output', output); | ||||||
|  |     }); | ||||||
|  |     await asyncForEach(inputs.cacheFrom, async cacheFrom => { | ||||||
|  |       buildArgs.push('--cache-from', cacheFrom); | ||||||
|  |     }); | ||||||
|  |     await asyncForEach(inputs.cacheTo, async cacheTo => { | ||||||
|  |       buildArgs.push('--cache-from', cacheTo); | ||||||
|  |     }); | ||||||
|     buildArgs.push(inputs.context); |     buildArgs.push(inputs.context); | ||||||
| 
 | 
 | ||||||
|     core.info(`🏃 Starting build...`); |     core.info(`🏃 Starting build...`); | ||||||
|     await exec.exec('docker', buildArgs); |     await exec.exec('docker', buildArgs); | ||||||
| 
 |  | ||||||
|     if (!buildxEnabled && inputs.push) { |  | ||||||
|       let pushRepos: Array<string> = []; |  | ||||||
|       await asyncForEach(inputs.tags, async tag => { |  | ||||||
|         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]); |  | ||||||
|         } |  | ||||||
|       }); |  | ||||||
|     } |  | ||||||
|   } catch (error) { |   } catch (error) { | ||||||
|     core.setFailed(error.message); |     core.setFailed(error.message); | ||||||
|   } |   } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user