Compare commits
	
		
			252 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 6a58db7e0d | ||
|   | d56292e348 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 790eb2db47 | ||
|   | 2a81c53912 | ||
|   | 00b2400aad | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 484614d7a1 | ||
|   | d95759405f | ||
|   | 5bb6d36be0 | ||
|   | a99c5e53ef | ||
|   | fc1a41d2e5 | ||
|   | 95cefc3c57 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 8ec3610541 | ||
|   | a946f06b5d | ||
|   | ce223e774e | ||
|   | d267e74486 | ||
|   | d350de3bba | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 45a8690f10 | ||
|   | b167a89702 | ||
|   | 81d4866861 | ||
|   | 07aea5fc9c | ||
|   | 1d91983c26 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 496312bcb8 | ||
|   | 4b4e9c3e2d | ||
|   | eb27bcbef3 | ||
|   | b7471d4240 | ||
|   | e2df91e851 | ||
|   | 85ce96bcbc | ||
|   | f549413411 | ||
|   | 99988698a5 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | e30725c029 | ||
|   | f1dc97ee10 | ||
|   | 51ecd0a47f | ||
|   | 830f01a409 | ||
|   | 8b13d483f2 | ||
|   | 03a7a3d9fb | ||
|   | 30389db034 | ||
|   | 05ca2e6f5e | ||
|   | 774ea5c2f1 | ||
|   | 534bd3c5e6 | ||
|   | 0f5a2d6712 | ||
|   | 987520896f | ||
|   | a19c171088 | ||
|   | 347dac9901 | ||
|   | 2dd22fa31c | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | dd904132a2 | ||
|   | f03ac48505 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | c8c479bb5b | ||
|   | 379311a773 | ||
|   | 6842354d08 | ||
|   | 7ce9a1f69d | ||
|   | 11e8a2e291 | ||
|   | 9407e67a52 | ||
|   | 15c905b16b | ||
|   | a25d6a0130 | ||
|   | 39322d9057 | ||
|   | 0648fd6fd6 | ||
|   | 30d8a59ee0 | ||
|   | 71320d2e17 | ||
|   | 272f8b84cf | ||
|   | 5e716dcfd6 | ||
|   | a83788eef0 | ||
|   | d0d9a72195 | ||
|   | a8165e7b70 | ||
|   | a024221c60 | ||
|   | 4c3fce4ab2 | ||
|   | 7c965aebec | ||
|   | 7932f6210d | ||
|   | 70deadb37a | ||
|   | 165fe681b8 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 2d305372c4 | ||
|   | c252a3bb80 | ||
|   | 4661366cb8 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 03d7e8ebf0 | ||
|   | 22f6533f7c | ||
|   | b30c61b0de | ||
|   | 51cc8966ea | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | db8b80b0d3 | ||
|   | 39a1a82492 | ||
|   | c77919d12e | ||
|   | 341de1b1a5 | ||
|   | 8c0edbc76e | ||
|   | 1fb9cbdb32 | ||
|   | 693fdd6ca6 | ||
|   | fe4c1ac86d | ||
|   | c74574e6c8 | ||
|   | 2d0cf98781 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 5f1d4ea81f | ||
|   | 59b5ed6124 | ||
|   | bd61d52837 | ||
|   | f6efb5fcbb | ||
|   | 2dfca373f3 | ||
|   | 95cb08cb26 | ||
|   | eb5c2a6eea | ||
|   | 83612bea36 | ||
|   | 40fefd8a58 | ||
|   | 90a1e4619e | ||
|   | 5a9fc40575 | ||
|   | 6c48dad5f0 | ||
|   | 16c2ddbfa7 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 0fe8589bf4 | ||
|   | f3692cbe43 | ||
|   | 51ce2e7281 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 1759384a3b | ||
|   | d5234d6605 | ||
|   | ec8fe6a2ec | ||
|   | c6ec880f34 | ||
|   | 69d3837448 | ||
|   | aa0df6f73a | ||
|   | f0ad70c1de | ||
|   | 1a6cf9b6d7 | ||
|   | 1c2ad20e10 | ||
|   | f5bc16b105 | ||
|   | 86f43c11f1 | ||
|   | f385c9ed95 | ||
|   | 798ed00eea | ||
|   | bea6a01aa4 | ||
|   | 3a2cc9a001 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 7a18bafc06 | ||
|   | 312f67c662 | ||
|   | b8ba4729df | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | afe5b71b31 | ||
|   | 6f5431bef1 | ||
|   | da30c94fcd | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 718cf00a00 | ||
|   | c4fbfe3f62 | ||
|   | 449215757a | ||
|   | cafcc1d31f | ||
|   | 7560281ec7 | ||
|   | 9102fb725f | ||
|   | 43262924e3 | ||
|   | 455b065be4 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 26f93d2e65 | ||
|   | 91cb32d715 | ||
|   | 7085ac52c5 | ||
|   | dc7b9719a9 | ||
|   | f55bc08278 | ||
|   | aa877a9d36 | ||
|   | f211e3e9de | ||
|   | b23216e504 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | be7e600e20 | ||
|   | 7117987c01 | ||
|   | 17ebdd4d65 | ||
|   | 3472856dd9 | ||
|   | 74283caced | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 5b77ad49e8 | ||
|   | 2a6fbda6d8 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 03815bdb06 | ||
|   | 130c56f342 | ||
|   | 20111c6447 | ||
|   | 2e23606dc9 | ||
|   | c62171c994 | ||
|   | 63e7b23412 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | a7c4ed7e88 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 1f1648ab3d | ||
|   | 766152f6a9 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 2895b304f6 | ||
|   | 79abd3f86f | ||
|   | 292fc577e1 | ||
|   | 5146db6c4d | ||
|   | a8ba68b618 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 68780ae5cd | ||
|   | f76216067a | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 92ae2888fa | ||
|   | e2e5a5f8da | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 50d73b9aba | ||
|   | 94ab11c41e | ||
|   | 34e94a5fed | ||
|   | ee7ac3140a | ||
|   | 93fe949311 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 75abbe0a7b | ||
|   | e639814ab4 | ||
|   | 96016fa2cf | ||
|   | cddc6485b4 | ||
|   | 1e85bf381a | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 7c99741146 | ||
|   | abe5d8f79a | ||
|   | 580d5c72a2 | ||
|   | e673438944 | ||
|   | f40e8894f1 | ||
|   | a1c666d855 | ||
|   | d5b70f51d8 | ||
|   | 2e941f2def | ||
|   | eef74457f7 | ||
|   | e168301d39 | ||
|   | 29f1eeb9e5 | ||
|   | faca7837b0 | ||
|   | dffa64995b | ||
|   | c0e291b502 | ||
|   | 2323559062 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | e80b8cc6d8 | ||
|   | 31e7cc5f84 | ||
|   | 9db0a23fb3 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 90e26af07a | ||
|   | 01ed3f7910 | ||
|   | 11ae4c31f6 | ||
|   | 983bf3e000 | ||
|   | 9a462131b5 | ||
|   | 1806a02fac | ||
|   | c1f17c078a | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 76bfd425d8 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 5a93241d03 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 2f13c4010e | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 1dd5af0c3a | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 55dd79473c | ||
|   | b1f1f719c7 | ||
|   | 68810d1ede | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | cd8b844a0a | ||
|   | 894f000c27 | ||
|   | f080c7125b | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 49b8353604 | ||
|   | 0d135e0c2f | ||
|   | 36d8e005ca | ||
|   | 012185ccbe | ||
|   | 881cacd606 | ||
|   | 076026291d | ||
|   | f4b1b8d38d | ||
|   | 316c3e4a7c | ||
|   | 5b1c96aee8 | ||
|   | 0f034385ce | ||
|   | 72750233ac | ||
|   | abdb186058 | ||
|   | 9b365965c1 | ||
|   | 583a3147f8 | ||
|   | 2913c18445 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 26e1d017b6 | ||
|   | 2a4b53665e | ||
|   | 03951fea2c | ||
|   | 04f80b2fda | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 240d54e928 | ||
|   | 070ea47eff | ||
|   | d3872b2920 | ||
|   | cb02c5f3d1 | ||
|   | f0d07f4abd | ||
|   | 31740423d9 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | f25fc8d621 | ||
|   | 8d9ae5d563 | ||
|   | 33d65376eb | ||
|   | 4ad06cec8a | ||
|   | bae85ae215 | ||
|   | 154c24e1f3 | ||
|   | 8f7787f9f5 | ||
|   | 87e1457170 | ||
|   | 467d3396dc | ||
|   | 370507b713 | ||
|   | 0ddb9e80d4 | ||
|   | daf8c4fb8d | ||
|   | db0ae322da | ||
|   | 5c0276ad2c | ||
|   | ca778fe8a3 | ||
|   | c3c3e01512 | ||
|   | a999bae018 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 4608f72b35 | 
							
								
								
									
										2
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| /coverage | ||||
| /node_modules | ||||
							
								
								
									
										23
									
								
								.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.eslintrc.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
|   "env": { | ||||
|     "node": true, | ||||
|     "es2021": true, | ||||
|     "jest": true | ||||
|   }, | ||||
|   "extends": [ | ||||
|     "eslint:recommended", | ||||
|     "plugin:@typescript-eslint/recommended", | ||||
|     "plugin:jest/recommended", | ||||
|     "plugin:prettier/recommended" | ||||
|   ], | ||||
|   "parser": "@typescript-eslint/parser", | ||||
|   "parserOptions": { | ||||
|     "ecmaVersion": "latest", | ||||
|     "sourceType": "module" | ||||
|   }, | ||||
|   "plugins": [ | ||||
|     "@typescript-eslint", | ||||
|     "jest", | ||||
|     "prettier" | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										33
									
								
								.github/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								.github/CONTRIBUTING.md
									
									
									
									
										vendored
									
									
								
							| @@ -2,35 +2,24 @@ | ||||
|  | ||||
| Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. | ||||
|  | ||||
| Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE). | ||||
| Contributions to this project are [released](https://docs.github.com/en/github/site-policy/github-terms-of-service#6-contributions-under-repository-license) | ||||
| to the public under the [project's open source license](LICENSE). | ||||
|  | ||||
| ## Submitting a pull request | ||||
|  | ||||
| 1. [Fork](https://github.com/docker/setup-buildx-action/fork) and clone the repository | ||||
| 2. Configure and install the dependencies: `yarn install` | ||||
| 3. Create a new branch: `git checkout -b my-branch-name` | ||||
| 4. Make your change, add tests, and make sure the tests still pass | ||||
| 5. Run pre-checkin: `yarn run pre-checkin` | ||||
| 6. Push to your fork and [submit a pull request](https://github.com/docker/setup-buildx-action/compare) | ||||
| 7. Pat yourself on the back and wait for your pull request to be reviewed and merged. | ||||
|  | ||||
| ## Container based developer flow | ||||
|  | ||||
| If you don't want to maintain a Node developer environment that fits this project you can use containerized commands instead of invoking yarn directly. | ||||
|  | ||||
| ``` | ||||
| # format code and build javascript artifacts | ||||
| docker buildx bake pre-checkin | ||||
|  | ||||
| # validate all code has correctly formatted and built | ||||
| docker buildx bake validate | ||||
|  | ||||
| # run tests | ||||
| docker buildx bake test | ||||
| ``` | ||||
| 4. Make your changes | ||||
| 5. Make sure the tests pass: `docker buildx bake test` | ||||
| 6. Format code and build javascript artifacts: `docker buildx bake pre-checkin` | ||||
| 7. Validate all code has correctly formatted and built: `docker buildx bake validate` | ||||
| 8. Push to your fork and [submit a pull request](https://github.com/docker/setup-buildx-action/compare) | ||||
| 9. Pat your self on the back and wait for your pull request to be reviewed and merged. | ||||
|  | ||||
| Here are a few things you can do that will increase the likelihood of your pull request being accepted: | ||||
|  | ||||
| - Write tests. | ||||
| - Make sure the `README.md` and any other relevant **documentation are kept up-to-date**. | ||||
| - We try to follow [SemVer v2.0.0](https://semver.org/). Randomly breaking public APIs is not an option. | ||||
| - Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as **separate pull requests**. | ||||
| @@ -39,5 +28,5 @@ Here are a few things you can do that will increase the likelihood of your pull | ||||
| ## Resources | ||||
|  | ||||
| - [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) | ||||
| - [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) | ||||
| - [GitHub Help](https://help.github.com) | ||||
| - [Using Pull Requests](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) | ||||
| - [GitHub Help](https://docs.github.com/en) | ||||
|   | ||||
							
								
								
									
										3
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/ISSUE_TEMPLATE/bug_report.md
									
									
									
									
										vendored
									
									
								
							| @@ -30,4 +30,5 @@ about: Create a report to help us improve | ||||
|  | ||||
| ### Logs | ||||
|  | ||||
| > Download the [log file of your build](https://help.github.com/en/actions/configuring-and-managing-workflows/managing-a-workflow-run#downloading-logs) and [attach it](https://help.github.com/en/github/managing-your-work-on-github/file-attachments-on-issues-and-pull-requests) to this issue. | ||||
| > Download the [log file of your build](https://docs.github.com/en/actions/managing-workflow-runs/using-workflow-run-logs#downloading-logs) | ||||
| > and [attach it](https://docs.github.com/en/github/managing-your-work-on-github/file-attachments-on-issues-and-pull-requests) to this issue. | ||||
|   | ||||
							
								
								
									
										12
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							| @@ -4,19 +4,15 @@ updates: | ||||
|     directory: "/" | ||||
|     schedule: | ||||
|       interval: "daily" | ||||
|       time: "06:00" | ||||
|       timezone: "Europe/Paris" | ||||
|     labels: | ||||
|       - ":game_die: dependencies" | ||||
|       - ":robot: bot" | ||||
|       - "dependencies" | ||||
|       - "bot" | ||||
|   - package-ecosystem: "npm" | ||||
|     directory: "/" | ||||
|     schedule: | ||||
|       interval: "daily" | ||||
|       time: "06:00" | ||||
|       timezone: "Europe/Paris" | ||||
|     allow: | ||||
|       - dependency-type: "production" | ||||
|     labels: | ||||
|       - ":game_die: dependencies" | ||||
|       - ":robot: bot" | ||||
|       - "dependencies" | ||||
|       - "bot" | ||||
|   | ||||
							
								
								
									
										77
									
								
								.github/labels.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								.github/labels.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,77 +0,0 @@ | ||||
| ## more info https://github.com/crazy-max/ghaction-github-labeler | ||||
| - # automerge | ||||
|   name: ":bell: automerge" | ||||
|   color: "8f4fbc" | ||||
|   description: "" | ||||
| - # bot | ||||
|   name: ":robot: bot" | ||||
|   color: "69cde9" | ||||
|   description: "" | ||||
| - # bug | ||||
|   name: ":bug: bug" | ||||
|   color: "b60205" | ||||
|   description: "" | ||||
| - # dependencies | ||||
|   name: ":game_die: dependencies" | ||||
|   color: "0366d6" | ||||
|   description: "" | ||||
| - # documentation | ||||
|   name: ":memo: documentation" | ||||
|   color: "c5def5" | ||||
|   description: "" | ||||
| - # duplicate | ||||
|   name: ":busts_in_silhouette: duplicate" | ||||
|   color: "cccccc" | ||||
|   description: "" | ||||
| - # enhancement | ||||
|   name: ":sparkles: enhancement" | ||||
|   color: "0054ca" | ||||
|   description: "" | ||||
| - # feature request | ||||
|   name: ":bulb: feature request" | ||||
|   color: "0e8a16" | ||||
|   description: "" | ||||
| - # feedback | ||||
|   name: ":mega: feedback" | ||||
|   color: "03a9f4" | ||||
|   description: "" | ||||
| - # future maybe | ||||
|   name: ":rocket: future maybe" | ||||
|   color: "fef2c0" | ||||
|   description: "" | ||||
| - # good first issue | ||||
|   name: ":hatching_chick: good first issue" | ||||
|   color: "7057ff" | ||||
|   description: "" | ||||
| - # help wanted | ||||
|   name: ":pray: help wanted" | ||||
|   color: "4caf50" | ||||
|   description: "" | ||||
| - # hold | ||||
|   name: ":hand: hold" | ||||
|   color: "24292f" | ||||
|   description: "" | ||||
| - # invalid | ||||
|   name: ":no_entry_sign: invalid" | ||||
|   color: "e6e6e6" | ||||
|   description: "" | ||||
| - # maybe bug | ||||
|   name: ":interrobang: maybe bug" | ||||
|   color: "ff5722" | ||||
|   description: "" | ||||
| - # needs more info | ||||
|   name: ":thinking: needs more info" | ||||
|   color: "795548" | ||||
|   description: "" | ||||
| - # question | ||||
|   name: ":question: question" | ||||
|   color: "3f51b5" | ||||
|   description: "" | ||||
| - # upstream | ||||
|   name: ":eyes: upstream" | ||||
|   color: "fbca04" | ||||
|   description: "" | ||||
| - # wontfix | ||||
|   name: ":coffin: wontfix" | ||||
|   color: "ffffff" | ||||
|   description: "" | ||||
							
								
								
									
										
											BIN
										
									
								
								.github/setup-buildx-action.png
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.github/setup-buildx-action.png
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 15 KiB | 
							
								
								
									
										413
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										413
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,18 +1,15 @@ | ||||
| name: ci | ||||
|  | ||||
| on: | ||||
|   schedule: | ||||
|     - cron: '0 10 * * *' | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/v* | ||||
|     paths-ignore: | ||||
|       - "**.md" | ||||
|       - 'master' | ||||
|       - 'releases/v*' | ||||
|     tags: | ||||
|       - 'v*' | ||||
|   pull_request: | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/v* | ||||
|     paths-ignore: | ||||
|       - "**.md" | ||||
|  | ||||
| jobs: | ||||
|   main: | ||||
| @@ -22,12 +19,12 @@ jobs: | ||||
|       matrix: | ||||
|         buildx-version: | ||||
|           - latest | ||||
|           - v0.2.2 | ||||
|           - v0.4.1 | ||||
|           - "" | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
| @@ -35,42 +32,87 @@ jobs: | ||||
|         with: | ||||
|           version: ${{ matrix.buildx-version }} | ||||
|       - | ||||
|         name: Builder instance name | ||||
|         run: echo ${{ steps.buildx.outputs.name }} | ||||
|       - | ||||
|         name: Available platforms | ||||
|         run: echo ${{ steps.buildx.outputs.platforms }} | ||||
|       - | ||||
|         name: Dump context | ||||
|         uses: crazy-max/ghaction-dump-context@v1 | ||||
|         name: Nodes output | ||||
|         run: | | ||||
|           cat << EOF | ||||
|           ${{ steps.buildx.outputs.nodes }} | ||||
|           EOF | ||||
|  | ||||
|   multi: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Set up Docker Buildx 1 | ||||
|         id: buildx1 | ||||
|         uses: ./ | ||||
|       - | ||||
|         name: Builder 1 instance name | ||||
|         run: echo ${{ steps.buildx1.outputs.name }} | ||||
|       - | ||||
|         name: Set up Docker Buildx 2 | ||||
|         id: buildx2 | ||||
|         uses: ./ | ||||
|  | ||||
|   error: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Stop docker | ||||
|         run: | | ||||
|           sudo systemctl stop docker | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
|         continue-on-error: true | ||||
|         uses: ./ | ||||
|       - | ||||
|         name: Builder 2 instance name | ||||
|         run: echo ${{ steps.buildx2.outputs.name }} | ||||
|         name: Check | ||||
|         run: | | ||||
|           echo "${{ toJson(steps.buildx) }}" | ||||
|           if [ "${{ steps.buildx.outcome }}" != "failure" ] || [ "${{ steps.buildx.conclusion }}" != "success" ]; then | ||||
|             echo "::error::Should have failed" | ||||
|             exit 1 | ||||
|           fi | ||||
|       - | ||||
|         name: Dump context | ||||
|         if: always() | ||||
|         uses: crazy-max/ghaction-dump-context@v2 | ||||
|  | ||||
|   debug: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Create Dockerfile | ||||
|         run: | | ||||
|           cat > ./Dockerfile <<EOL | ||||
|           FROM alpine | ||||
|           RUN uname -a | ||||
|           EOL | ||||
|       - | ||||
|         name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v2 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           buildkitd-flags: --debug | ||||
|       - | ||||
|         name: Build | ||||
|         uses: docker/build-push-action@v4 | ||||
|         with: | ||||
|           context: . | ||||
|           platforms: linux/amd64,linux/arm64,linux/ppc64le | ||||
|  | ||||
|   install: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
| @@ -92,7 +134,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
| @@ -115,7 +157,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
| @@ -128,7 +170,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
| @@ -161,7 +203,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Create context | ||||
|         run: | | ||||
| @@ -175,6 +217,67 @@ jobs: | ||||
|         uses: ./ | ||||
|         with: | ||||
|           endpoint: mycontext | ||||
|         env: | ||||
|           DOCKER_CONTEXT: mycontext | ||||
|  | ||||
|   config: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Create buildkitd conf | ||||
|         run: | | ||||
|           cat > /tmp/buildkitd.toml <<EOL | ||||
|           debug = true | ||||
|           [registry."docker.io"] | ||||
|             mirrors = ["mirror.gcr.io"] | ||||
|           EOL | ||||
|       - | ||||
|         name: Create Dockerfile | ||||
|         run: | | ||||
|           cat > ./Dockerfile <<EOL | ||||
|           FROM alpine | ||||
|           EOL | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           buildkitd-flags: --debug | ||||
|           config: /tmp/buildkitd.toml | ||||
|       - | ||||
|         name: Build | ||||
|         uses: docker/build-push-action@v4 | ||||
|         with: | ||||
|           context: . | ||||
|  | ||||
|   config-inline: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Create Dockerfile | ||||
|         run: | | ||||
|           cat > ./Dockerfile <<EOL | ||||
|           FROM alpine | ||||
|           EOL | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           buildkitd-flags: --debug | ||||
|           config-inline: | | ||||
|             debug = true | ||||
|             [registry."docker.io"] | ||||
|               mirrors = ["mirror.gcr.io"] | ||||
|       - | ||||
|         name: Build | ||||
|         uses: docker/build-push-action@v4 | ||||
|         with: | ||||
|           context: . | ||||
|  | ||||
|   with-qemu: | ||||
|     runs-on: ubuntu-latest | ||||
| @@ -183,7 +286,7 @@ jobs: | ||||
|       matrix: | ||||
|         buildx-version: | ||||
|           - latest | ||||
|           - v0.2.2 | ||||
|           - v0.4.1 | ||||
|           - "" | ||||
|         qemu-platforms: | ||||
|           - all | ||||
| @@ -191,10 +294,10 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v1 | ||||
|         uses: docker/setup-qemu-action@v2 | ||||
|         with: | ||||
|           platforms: ${{ matrix.qemu-platforms }} | ||||
|       - | ||||
| @@ -204,8 +307,242 @@ jobs: | ||||
|         with: | ||||
|           version: ${{ matrix.buildx-version }} | ||||
|       - | ||||
|         name: Available platforms | ||||
|         name: List builder platforms | ||||
|         run: echo ${{ steps.buildx.outputs.platforms }} | ||||
|  | ||||
|   build-ref: | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         ref: | ||||
|           - master | ||||
|           - refs/tags/v0.5.1 | ||||
|           - refs/pull/731/head | ||||
|           - cb185f095fd3d9444e0aa605d3789e9e05f2a1e7 | ||||
|     steps: | ||||
|       - | ||||
|         name: Builder instance name | ||||
|         run: echo ${{ steps.buildx.outputs.name }} | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           version: https://github.com/docker/buildx.git#${{ matrix.ref }} | ||||
|       - | ||||
|         name: Create Dockerfile | ||||
|         run: | | ||||
|           cat > ./Dockerfile <<EOL | ||||
|           FROM alpine | ||||
|           EOL | ||||
|       - | ||||
|         name: Build | ||||
|         uses: docker/build-push-action@master | ||||
|         with: | ||||
|           context: . | ||||
|  | ||||
|   standalone-cmd: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Uninstall docker cli | ||||
|         run: | | ||||
|           sudo apt-get purge -y moby-cli moby-buildx | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|       - | ||||
|         name: Create Dockerfile | ||||
|         run: | | ||||
|           cat > ./Dockerfile <<EOL | ||||
|           FROM alpine | ||||
|           EOL | ||||
|       - | ||||
|         name: Build | ||||
|         run: | | ||||
|           buildx build . | ||||
|  | ||||
|   standalone-action: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Uninstall docker cli | ||||
|         run: | | ||||
|           sudo apt-get purge -y moby-cli moby-buildx | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           version: ${{ matrix.buildx-version }} | ||||
|       - | ||||
|         name: Create Dockerfile | ||||
|         run: | | ||||
|           cat > ./Dockerfile <<EOL | ||||
|           FROM alpine | ||||
|           EOL | ||||
|       - | ||||
|         name: Build | ||||
|         uses: docker/build-push-action@master | ||||
|         with: | ||||
|           context: . | ||||
|  | ||||
|   standalone-install-error: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Uninstall docker cli | ||||
|         run: | | ||||
|           sudo apt-get purge -y moby-cli moby-buildx | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
|         continue-on-error: true | ||||
|         uses: ./ | ||||
|         with: | ||||
|           install: true | ||||
|       - | ||||
|         name: Check | ||||
|         run: | | ||||
|           echo "${{ toJson(steps.buildx) }}" | ||||
|           if [ "${{ steps.buildx.outcome }}" != "failure" ] || [ "${{ steps.buildx.conclusion }}" != "success" ]; then | ||||
|             echo "::error::Should have failed" | ||||
|             exit 1 | ||||
|           fi | ||||
|  | ||||
|   append: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Create dummy contexts | ||||
|         run: | | ||||
|           docker context create ctxbuilder2 | ||||
|           docker context create ctxbuilder3 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           append: | | ||||
|             - name: builder2 | ||||
|               endpoint: ctxbuilder2 | ||||
|               platforms: linux/amd64 | ||||
|               driver-opts: | ||||
|                 - image=moby/buildkit:master | ||||
|                 - network=host | ||||
|             - endpoint: ctxbuilder3 | ||||
|               platforms: linux/arm64 | ||||
|       - | ||||
|         name: List builder platforms | ||||
|         run: echo ${{ steps.buildx.outputs.platforms }} | ||||
|  | ||||
|   platforms: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v2 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           platforms: linux/amd64 | ||||
|  | ||||
|   docker-context: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Create Docker context | ||||
|         run: | | ||||
|           docker context create foo | ||||
|           docker context use foo | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           driver: docker | ||||
|  | ||||
|   cleanup: | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         cleanup: | ||||
|           - true | ||||
|           - false | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           cleanup: ${{ matrix.cleanup }} | ||||
|  | ||||
|   k3s: | ||||
|     runs-on: ubuntu-20.04 | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         version: | ||||
|           - v0.11.0-rc1 | ||||
|           - v0.10.5 | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Install k3s | ||||
|         uses: crazy-max/.github/.github/actions/install-k3s@605d30d5ae97f6680578ace4b56645af79343e60 | ||||
|         with: | ||||
|           version: "v1.21.2-k3s1" | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           version: ${{ matrix.version }} | ||||
|           driver: kubernetes | ||||
|           platforms: linux/amd64 | ||||
|           driver-opts: | | ||||
|             image=moby/buildkit:buildx-stable-1 | ||||
|             qemu.install=true | ||||
|           append: | | ||||
|             - platforms: linux/arm64 | ||||
|               driver-opts: | ||||
|                 - image=moby/buildkit:buildx-stable-1 | ||||
|                 - qemu.install=true | ||||
|             - platforms: linux/s390x | ||||
|               driver-opts: | ||||
|                 - image=moby/buildkit:buildx-stable-1 | ||||
|                 - qemu.install=true | ||||
|       - | ||||
|         name: Create Dockerfile | ||||
|         run: | | ||||
|           cat > ./Dockerfile <<EOL | ||||
|           FROM alpine | ||||
|           RUN uname -a | ||||
|           EOL | ||||
|       - | ||||
|         name: Build | ||||
|         uses: docker/build-push-action@master | ||||
|         with: | ||||
|           context: . | ||||
|   | ||||
							
								
								
									
										20
									
								
								.github/workflows/labels.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								.github/workflows/labels.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,20 +0,0 @@ | ||||
| name: labels | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - 'master' | ||||
|     paths: | ||||
|       - '.github/labels.yml' | ||||
|       - '.github/workflows/labels.yml' | ||||
|  | ||||
| jobs: | ||||
|   labeler: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Run Labeler | ||||
|         uses: crazy-max/ghaction-github-labeler@v3 | ||||
							
								
								
									
										35
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @@ -3,44 +3,27 @@ name: test | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/v* | ||||
|     paths-ignore: | ||||
|       - "**.md" | ||||
|       - 'master' | ||||
|       - 'releases/v*' | ||||
|   pull_request: | ||||
|     paths-ignore: | ||||
|       - "**.md" | ||||
|  | ||||
| jobs: | ||||
|   test-containerized: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Validate | ||||
|         run: docker buildx bake validate | ||||
|       - | ||||
|         name: Test | ||||
|         run: docker buildx bake test | ||||
|  | ||||
|   test: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Install | ||||
|         run: yarn install | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|       - | ||||
|         name: Test | ||||
|         run: yarn run test | ||||
|         uses: docker/bake-action@v3 | ||||
|         with: | ||||
|           targets: test | ||||
|       - | ||||
|         name: Upload coverage | ||||
|         uses: codecov/codecov-action@v1 | ||||
|         if: success() | ||||
|         uses: codecov/codecov-action@v3 | ||||
|         with: | ||||
|           token: ${{ secrets.CODECOV_TOKEN }} | ||||
|           file: ./coverage/clover.xml | ||||
|   | ||||
							
								
								
									
										41
									
								
								.github/workflows/validate.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								.github/workflows/validate.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| name: validate | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - 'master' | ||||
|       - 'releases/v*' | ||||
|   pull_request: | ||||
|  | ||||
| jobs: | ||||
|   prepare: | ||||
|     runs-on: ubuntu-latest | ||||
|     outputs: | ||||
|       targets: ${{ steps.targets.outputs.matrix }} | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Targets matrix | ||||
|         id: targets | ||||
|         run: | | ||||
|           echo "matrix=$(docker buildx bake validate --print | jq -cr '.group.validate.targets')" >> $GITHUB_OUTPUT | ||||
|  | ||||
|   validate: | ||||
|     runs-on: ubuntu-latest | ||||
|     needs: | ||||
|       - prepare | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         target: ${{ fromJson(needs.prepare.outputs.targets) }} | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         name: Validate | ||||
|         uses: docker/bake-action@v3 | ||||
|         with: | ||||
|           targets: ${{ matrix.target }} | ||||
| @@ -1,5 +1,5 @@ | ||||
| { | ||||
|   "printWidth": 120, | ||||
|   "printWidth": 240, | ||||
|   "tabWidth": 2, | ||||
|   "useTabs": false, | ||||
|   "semi": true, | ||||
|   | ||||
							
								
								
									
										52
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								Dockerfile
									
									
									
									
									
								
							| @@ -1,52 +0,0 @@ | ||||
| #syntax=docker/dockerfile:1.1-experimental | ||||
|  | ||||
| FROM node:14 AS deps | ||||
| WORKDIR /src | ||||
| COPY package.json yarn.lock ./ | ||||
| RUN --mount=type=cache,target=/usr/local/share/.cache/yarn \ | ||||
|   yarn install | ||||
|  | ||||
| FROM scratch AS update-yarn | ||||
| COPY --from=deps /src/yarn.lock / | ||||
|  | ||||
| FROM deps AS validate-yarn | ||||
| COPY .git .git | ||||
| RUN status=$(git status --porcelain -- yarn.lock); if [ -n "$status" ]; then echo $status; exit 1; fi | ||||
|  | ||||
| FROM deps AS base | ||||
| COPY . . | ||||
|  | ||||
| FROM base AS build | ||||
| RUN yarn build | ||||
|  | ||||
| FROM deps AS test | ||||
| COPY --from=docker /usr/local/bin/docker /usr/bin/ | ||||
| ARG TARGETOS | ||||
| ARG TARGETARCH | ||||
| ARG BUILDX_VERSION=v0.4.2 | ||||
| ENV RUNNER_TEMP=/tmp/github_runner | ||||
| ENV RUNNER_TOOL_CACHE=/tmp/github_tool_cache | ||||
| RUN mkdir -p /usr/local/lib/docker/cli-plugins && \ | ||||
|   curl -fsSL https://github.com/docker/buildx/releases/download/$BUILDX_VERSION/buildx-$BUILDX_VERSION.$TARGETOS-$TARGETARCH > /usr/local/lib/docker/cli-plugins/docker-buildx && \ | ||||
|   chmod +x /usr/local/lib/docker/cli-plugins/docker-buildx && \ | ||||
|   docker buildx version | ||||
| COPY . . | ||||
| RUN yarn run test | ||||
|  | ||||
| FROM base AS run-format | ||||
| RUN yarn run format | ||||
|  | ||||
| FROM scratch AS format | ||||
| COPY --from=run-format /src/src/*.ts /src/ | ||||
|  | ||||
| FROM base AS validate-format | ||||
| RUN yarn run format-check | ||||
|  | ||||
| FROM scratch AS dist | ||||
| COPY --from=build /src/dist/ /dist/ | ||||
|  | ||||
| FROM build AS validate-build | ||||
| RUN status=$(git status --porcelain -- dist); if [ -n "$status" ]; then echo $status; exit 1; fi | ||||
|  | ||||
| FROM base AS dev | ||||
| ENTRYPOINT ["bash"] | ||||
							
								
								
									
										202
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										202
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,37 +1,35 @@ | ||||
| [](https://github.com/docker/setup-buildx-action/releases/latest) | ||||
| [](https://github.com/marketplace/actions/docker-setup-buildx) | ||||
| [](https://github.com/docker/setup-buildx-action/actions?workflow=ci) | ||||
| [](https://github.com/docker/setup-buildx-action/actions?workflow=test) | ||||
| [](https://github.com/docker/setup-buildx-action/actions?workflow=ci) | ||||
| [](https://github.com/docker/setup-buildx-action/actions?workflow=test) | ||||
| [](https://codecov.io/gh/docker/setup-buildx-action) | ||||
|  | ||||
| ## About | ||||
|  | ||||
| GitHub Action to set up Docker [Buildx](https://github.com/docker/buildx). | ||||
|  | ||||
| > :bulb: See also: | ||||
| > * [login](https://github.com/docker/login-action) action | ||||
| > * [setup-qemu](https://github.com/docker/setup-qemu-action) action | ||||
| > * [build-push](https://github.com/docker/build-push-action) action | ||||
| This action will create and boot a builder that can be used in the following | ||||
| steps of your workflow if you're using Buildx or the [`build-push` action](https://github.com/docker/build-push-action/). | ||||
| By default, the [`docker-container` driver](https://docs.docker.com/build/building/drivers/docker-container/) | ||||
| will be used to be able to build multi-platform images and export cache using | ||||
| a [BuildKit](https://github.com/moby/buildkit) container. | ||||
|  | ||||
|  | ||||
|  | ||||
| ___ | ||||
|  | ||||
| * [Usage](#usage) | ||||
|   * [Quick start](#quick-start) | ||||
|   * [With QEMU](#with-qemu) | ||||
|   * [Install by default](#install-by-default) | ||||
| * [Configuring your builder](#configuring-your-builder) | ||||
| * [Customizing](#customizing) | ||||
|   * [inputs](#inputs) | ||||
|   * [outputs](#outputs) | ||||
|   * [environment variables](#environment-variables) | ||||
| * [Keep up-to-date with GitHub Dependabot](#keep-up-to-date-with-github-dependabot) | ||||
| * [Limitation](#limitation) | ||||
| * [Notes](#notes) | ||||
|   * [`nodes` output](#nodes-output) | ||||
| * [Contributing](#contributing) | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| ### Quick start | ||||
|  | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
| @@ -44,135 +42,117 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
|         uses: docker/setup-buildx-action@v1 | ||||
|       - | ||||
|         name: Builder instance name | ||||
|         run: echo ${{ steps.buildx.outputs.name }} | ||||
|       - | ||||
|         name: Available platforms | ||||
|         run: echo ${{ steps.buildx.outputs.platforms }} | ||||
| ``` | ||||
|  | ||||
| ### With QEMU | ||||
|  | ||||
| If you want support for more platforms you can use our [setup-qemu](https://github.com/docker/setup-qemu-action) action: | ||||
|  | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|  | ||||
| jobs: | ||||
|   buildx: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|         uses: actions/checkout@v3 | ||||
|       - | ||||
|         # Add support for more platforms with QEMU (optional) | ||||
|         # https://github.com/docker/setup-qemu-action | ||||
|         name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v1 | ||||
|         uses: docker/setup-qemu-action@v2 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
|         uses: docker/setup-buildx-action@v1 | ||||
|       - | ||||
|         name: Available platforms | ||||
|         run: echo ${{ steps.buildx.outputs.platforms }} | ||||
|         uses: docker/setup-buildx-action@v2 | ||||
| ``` | ||||
|  | ||||
| ### Install by default | ||||
| ## Configuring your builder | ||||
|  | ||||
| Implemented with https://github.com/docker/buildx#setting-buildx-as-default-builder-in-docker-1903 | ||||
|  | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|  | ||||
| jobs: | ||||
|   buildx: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         uses: docker/setup-buildx-action@v1 | ||||
|         id: buildx | ||||
|         with: | ||||
|           install: true | ||||
|       - | ||||
|         name: Build | ||||
|         run: | | ||||
|           docker build . # will run buildx | ||||
| ``` | ||||
| * [Version pinning](https://docs.docker.com/build/ci/github-actions/configure-builder/#version-pinning): Pin to a specific Buildx or BuildKit version | ||||
| * [BuildKit container logs](https://docs.docker.com/build/ci/github-actions/configure-builder/#buildkit-container-logs): Enable BuildKit container logs for debugging purposes | ||||
| * [BuildKit Daemon configuration](https://docs.docker.com/build/ci/github-actions/configure-builder/#buildkit-daemon-configuration) | ||||
|   * [Registry mirror](https://docs.docker.com/build/ci/github-actions/configure-builder/#registry-mirror): Configure a registry mirror for your builds | ||||
|   * [Max parallelism](https://docs.docker.com/build/ci/github-actions/configure-builder/#max-parallelism): Configure the maximum parallelism for your builds | ||||
| * [Append additional nodes to the builder](https://docs.docker.com/build/ci/github-actions/configure-builder/#append-additional-nodes-to-the-builder): Create additional nodes for your builder | ||||
| * [Authentication for remote builders](https://docs.docker.com/build/ci/github-actions/configure-builder/#authentication-for-remote-builders) | ||||
|   * [SSH authentication](https://docs.docker.com/build/ci/github-actions/configure-builder/#ssh-authentication): Authenticate to a remote builder using SSH | ||||
|   * [TLS authentication](https://docs.docker.com/build/ci/github-actions/configure-builder/#tls-authentication): Authenticate to a remote builder using TLS | ||||
| * [Standalone mode](https://docs.docker.com/build/ci/github-actions/configure-builder/#standalone-mode): Use Buildx as a standalone binary (without the Docker CLI) | ||||
| * [Isolated builders](https://docs.docker.com/build/ci/github-actions/configure-builder/#isolated-builders): Create isolated builders for your builds | ||||
|  | ||||
| ## Customizing | ||||
|  | ||||
| ### inputs | ||||
|  | ||||
| Following inputs can be used as `step.with` keys | ||||
| Following inputs can be used as `step.with` keys: | ||||
|  | ||||
| | Name               | Type    | Description                       | | ||||
| |--------------------|---------|-----------------------------------| | ||||
| | `version`          | String  | [Buildx](https://github.com/docker/buildx) version. (eg. `v0.3.0`, `latest`) | | ||||
| | `driver`           | String  | Sets the [builder driver](https://github.com/docker/buildx#--driver-driver) to be used (default `docker-container`) | | ||||
| | `driver-opts`      | CSV     | List of additional [driver-specific options](https://github.com/docker/buildx#--driver-opt-options) (eg. `image=moby/buildkit:master`) | | ||||
| | `buildkitd-flags`  | String  | [Flags for buildkitd](https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md) daemon (since [buildx v0.3.0](https://github.com/docker/buildx/releases/tag/v0.3.0)) | | ||||
| | `install`          | Bool    | Sets up `docker build` command as an alias to `docker buildx` (default `false`) | | ||||
| | `use`              | Bool    | Switch to this builder instance (default `true`) | | ||||
| | `endpoint`         | String  | [Optional address for docker socket](https://github.com/docker/buildx#buildx-create-options-contextendpoint) or context from `docker context ls` | | ||||
|  | ||||
| > `CSV` type must be a newline-delimited string | ||||
| > ```yaml | ||||
| > driver-opts: image=moby/buildkit:master | ||||
| > ``` | ||||
| > `List` type is a newline-delimited string | ||||
| > ```yaml | ||||
| > driver-opts: | | ||||
| >   image=moby/buildkit:master | ||||
| >   network=host | ||||
| > ``` | ||||
|  | ||||
| > `CSV` type must be a comma-delimited string | ||||
| > ```yaml | ||||
| > platforms: linux/amd64,linux/arm64 | ||||
| > ``` | ||||
|  | ||||
| | Name              | Type     | Default            | Description                                                                                                                                                                  | | ||||
| |-------------------|----------|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | ||||
| | `version`         | String   |                    | [Buildx](https://github.com/docker/buildx) version. (eg. `v0.3.0`, `latest`, `https://github.com/docker/buildx.git#master`)                                                  | | ||||
| | `driver`          | String   | `docker-container` | Sets the [builder driver](https://docs.docker.com/engine/reference/commandline/buildx_create/#driver) to be used                                                             | | ||||
| | `driver-opts`     | List     |                    | List of additional [driver-specific options](https://docs.docker.com/engine/reference/commandline/buildx_create/#driver-opt) (eg. `image=moby/buildkit:master`)              | | ||||
| | `buildkitd-flags` | String   |                    | [Flags for buildkitd](https://docs.docker.com/engine/reference/commandline/buildx_create/#buildkitd-flags) daemon                                                            | | ||||
| | `install`         | Bool     | `false`            | Sets up `docker build` command as an alias to `docker buildx`                                                                                                                | | ||||
| | `use`             | Bool     | `true`             | Switch to this builder instance                                                                                                                                              | | ||||
| | `endpoint`        | String   |                    | [Optional address for docker socket](https://docs.docker.com/engine/reference/commandline/buildx_create/#description) or context from `docker context ls`                    | | ||||
| | `platforms`       | List/CSV |                    | Fixed [platforms](https://docs.docker.com/engine/reference/commandline/buildx_create/#platform) for current node. If not empty, values take priority over the detected ones. | | ||||
| | `config`¹         | String   |                    | [BuildKit config file](https://docs.docker.com/engine/reference/commandline/buildx_create/#config)                                                                           | | ||||
| | `config-inline`¹  | String   |                    | Same as `config` but inline                                                                                                                                                  | | ||||
| | `append`          | YAML     |                    | [Append additional nodes](docs/advanced/append-nodes.md) to the builder                                                                                                      | | ||||
| | `cleanup`         | Bool     | `true`             | Cleanup temp files and remove builder at the end of a job                                                                                                                    | | ||||
|  | ||||
| > * ¹ `config` and `config-inline` are mutually exclusive | ||||
|  | ||||
| ### outputs | ||||
|  | ||||
| Following outputs are available | ||||
|  | ||||
| | Name          | Type    | Description                           | | ||||
| |---------------|---------|---------------------------------------| | ||||
| | `name`        | String  | Builder instance name | | ||||
| | `platforms`   | String  | Available platforms (comma separated) | | ||||
| | Name        | Type   | Description                                     | | ||||
| |-------------|--------|-------------------------------------------------| | ||||
| | `name`      | String | Builder name                                    | | ||||
| | `driver`    | String | Builder driver                                  | | ||||
| | `platforms` | String | Builder node platforms (preferred or available) | | ||||
| | `nodes`     | JSON   | Builder [nodes metadata](#nodes-output)         | | ||||
|  | ||||
| ### environment variables | ||||
|  | ||||
| The following [official docker environment variables](https://docs.docker.com/engine/reference/commandline/cli/#environment-variables) are supported: | ||||
|  | ||||
| | Name            | Type    | Default      | Description                                    | | ||||
| |-----------------|---------|-------------|-------------------------------------------------| | ||||
| | `DOCKER_CONFIG` | String  | `~/.docker` | The location of your client configuration files | | ||||
| | Name            | Type   | Default     | Description                                     | | ||||
| |-----------------|--------|-------------|-------------------------------------------------| | ||||
| | `DOCKER_CONFIG` | String | `~/.docker` | The location of your client configuration files | | ||||
|  | ||||
| ## Keep up-to-date with GitHub Dependabot | ||||
| ## Notes | ||||
|  | ||||
| Since [Dependabot](https://docs.github.com/en/github/administering-a-repository/keeping-your-actions-up-to-date-with-github-dependabot) | ||||
| has [native GitHub Actions support](https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates#package-ecosystem), | ||||
| to enable it on your GitHub repo all you need to do is add the `.github/dependabot.yml` file: | ||||
| ### `nodes` output | ||||
|  | ||||
| ```yaml | ||||
| version: 2 | ||||
| updates: | ||||
|   # Maintain dependencies for GitHub Actions | ||||
|   - package-ecosystem: "github-actions" | ||||
|     directory: "/" | ||||
|     schedule: | ||||
|       interval: "daily" | ||||
| ```json | ||||
| [ | ||||
|   { | ||||
|      "name": "builder-3820d274-502c-4498-ae24-d4c32b3023d90", | ||||
|      "endpoint": "unix:///var/run/docker.sock", | ||||
|      "driver-opts": [ | ||||
|        "network=host", | ||||
|        "image=moby/buildkit:master" | ||||
|      ], | ||||
|     "status": "running", | ||||
|     "buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host", | ||||
|     "buildkit": "3fab389", | ||||
|     "platforms": "linux/amd64,linux/amd64/v2,linux/amd64/v3,linux/amd64/v4,linux/386" | ||||
|   } | ||||
| ] | ||||
| ``` | ||||
|  | ||||
| ## Limitation | ||||
| | Name              | Type   | Description                | | ||||
| |-------------------|--------|----------------------------| | ||||
| | `name`            | String | Node name                  | | ||||
| | `endpoint`        | String | Node endpoint              | | ||||
| | `driver-opts`     | List   | Options for the driver     | | ||||
| | `status`          | String | Node status                | | ||||
| | `buildkitd-flags` | String | Flags for buildkitd daemon | | ||||
| | `buildkit`        | String | BuildKit version           | | ||||
| | `platforms`       | String | Platforms available        | | ||||
|  | ||||
| This action is only available for Linux [virtual environments](https://docs.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners#supported-virtual-environments-and-hardware-resources). | ||||
| ## Contributing | ||||
|  | ||||
| Want to contribute? Awesome! You can find information about contributing to | ||||
| this project in the [CONTRIBUTING.md](/.github/CONTRIBUTING.md) | ||||
|   | ||||
| @@ -1,64 +0,0 @@ | ||||
| import fs = require('fs'); | ||||
| import * as docker from '../src/docker'; | ||||
| import * as buildx from '../src/buildx'; | ||||
| import * as path from 'path'; | ||||
| import * as os from 'os'; | ||||
| import * as semver from 'semver'; | ||||
| import * as exec from '@actions/exec'; | ||||
|  | ||||
| describe('getVersion', () => { | ||||
|   it('valid', async () => { | ||||
|     await exec.exec('docker', ['buildx', 'version']); | ||||
|     const version = await buildx.getVersion(); | ||||
|     console.log(`version: ${version}`); | ||||
|     expect(semver.valid(version)).not.toBeNull(); | ||||
|   }, 100000); | ||||
| }); | ||||
|  | ||||
| describe('parseVersion', () => { | ||||
|   test.each([ | ||||
|     ['github.com/docker/buildx 0.4.1+azure bda4882a65349ca359216b135896bddc1d92461c', '0.4.1'], | ||||
|     ['github.com/docker/buildx v0.4.1 bda4882a65349ca359216b135896bddc1d92461c', '0.4.1'], | ||||
|     ['github.com/docker/buildx v0.4.2 fb7b670b764764dc4716df3eba07ffdae4cc47b2', '0.4.2'] | ||||
|   ])('given %p', async (stdout, expected) => { | ||||
|     expect(await buildx.parseVersion(stdout)).toEqual(expected); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| describe('platforms', () => { | ||||
|   async function isDaemonRunning() { | ||||
|     return await docker.isDaemonRunning(); | ||||
|   } | ||||
|   (isDaemonRunning() ? it : it.skip)( | ||||
|     'valid', | ||||
|     async () => { | ||||
|       const platforms = buildx.platforms(); | ||||
|       console.log(`platforms: ${platforms}`); | ||||
|       expect(platforms).not.toBeUndefined(); | ||||
|       expect(platforms).not.toEqual(''); | ||||
|     }, | ||||
|     100000 | ||||
|   ); | ||||
| }); | ||||
|  | ||||
| describe('countBuilders', () => { | ||||
|   it('valid', async () => { | ||||
|     const countBuilders = await buildx.countBuilders(); | ||||
|     console.log(`countBuilders: ${countBuilders}`); | ||||
|     expect(countBuilders).toBeGreaterThan(0); | ||||
|   }, 100000); | ||||
| }); | ||||
|  | ||||
| describe('install', () => { | ||||
|   const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'setup-buildx-')); | ||||
|   it('acquires v0.2.2 version of buildx', async () => { | ||||
|     const buildxBin = await buildx.install('v0.2.2', tmpDir); | ||||
|     console.log(buildxBin); | ||||
|     expect(fs.existsSync(buildxBin)).toBe(true); | ||||
|   }, 100000); | ||||
|   it('acquires latest version of buildx', async () => { | ||||
|     const buildxBin = await buildx.install('latest', tmpDir); | ||||
|     console.log(buildxBin); | ||||
|     expect(fs.existsSync(buildxBin)).toBe(true); | ||||
|   }, 100000); | ||||
| }); | ||||
| @@ -1,81 +1,226 @@ | ||||
| import {beforeEach, describe, expect, jest, test} from '@jest/globals'; | ||||
| import * as uuid from 'uuid'; | ||||
| import {Buildx} from '@docker/actions-toolkit/lib/buildx/buildx'; | ||||
| import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; | ||||
| import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; | ||||
| import {Node} from '@docker/actions-toolkit/lib/types/builder'; | ||||
|  | ||||
| import * as context from '../src/context'; | ||||
|  | ||||
| describe('getInputList', () => { | ||||
|   it('handles single line correctly', async () => { | ||||
|     await setInput('foo', 'bar'); | ||||
|     const res = await context.getInputList('foo'); | ||||
|     console.log(res); | ||||
|     expect(res).toEqual(['bar']); | ||||
|   }); | ||||
| jest.mock('uuid'); | ||||
| jest.spyOn(uuid, 'v4').mockReturnValue('9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'); | ||||
|  | ||||
|   it('handles multiple lines correctly', async () => { | ||||
|     setInput('foo', 'bar\nbaz'); | ||||
|     const res = await context.getInputList('foo'); | ||||
|     console.log(res); | ||||
|     expect(res).toEqual(['bar', 'baz']); | ||||
|   }); | ||||
|  | ||||
|   it('remove empty lines correctly', async () => { | ||||
|     setInput('foo', 'bar\n\nbaz'); | ||||
|     const res = await context.getInputList('foo'); | ||||
|     console.log(res); | ||||
|     expect(res).toEqual(['bar', 'baz']); | ||||
|   }); | ||||
|  | ||||
|   it('handles comma correctly', async () => { | ||||
|     setInput('foo', 'bar,baz'); | ||||
|     const res = await context.getInputList('foo'); | ||||
|     console.log(res); | ||||
|     expect(res).toEqual(['bar', 'baz']); | ||||
|   }); | ||||
|  | ||||
|   it('remove empty result correctly', async () => { | ||||
|     setInput('foo', 'bar,baz,'); | ||||
|     const res = await context.getInputList('foo'); | ||||
|     console.log(res); | ||||
|     expect(res).toEqual(['bar', 'baz']); | ||||
|   }); | ||||
|  | ||||
|   it('handles different new lines correctly', async () => { | ||||
|     setInput('foo', 'bar\r\nbaz'); | ||||
|     const res = await context.getInputList('foo'); | ||||
|     console.log(res); | ||||
|     expect(res).toEqual(['bar', 'baz']); | ||||
|   }); | ||||
|  | ||||
|   it('handles different new lines and comma correctly', async () => { | ||||
|     setInput('foo', 'bar\r\nbaz,bat'); | ||||
|     const res = await context.getInputList('foo'); | ||||
|     console.log(res); | ||||
|     expect(res).toEqual(['bar', 'baz', 'bat']); | ||||
|   }); | ||||
|  | ||||
|   it('handles multiple lines and ignoring comma correctly', async () => { | ||||
|     setInput('driver-opts', 'image=moby/buildkit:master\nnetwork=host'); | ||||
|     const res = await context.getInputList('driver-opts', true); | ||||
|     console.log(res); | ||||
|     expect(res).toEqual(['image=moby/buildkit:master', 'network=host']); | ||||
|   }); | ||||
|  | ||||
|   it('handles different new lines and ignoring comma correctly', async () => { | ||||
|     setInput('driver-opts', 'image=moby/buildkit:master\r\nnetwork=host'); | ||||
|     const res = await context.getInputList('driver-opts', true); | ||||
|     console.log(res); | ||||
|     expect(res).toEqual(['image=moby/buildkit:master', 'network=host']); | ||||
|   }); | ||||
| jest.spyOn(Docker, 'context').mockImplementation((): Promise<string> => { | ||||
|   return Promise.resolve('default'); | ||||
| }); | ||||
|  | ||||
| describe('asyncForEach', () => { | ||||
|   it('executes async tasks sequentially', async () => { | ||||
|     const testValues = [1, 2, 3, 4, 5]; | ||||
|     const results: number[] = []; | ||||
|  | ||||
|     await context.asyncForEach(testValues, async value => { | ||||
|       results.push(value); | ||||
|     }); | ||||
|  | ||||
|     expect(results).toEqual(testValues); | ||||
| describe('getCreateArgs', () => { | ||||
|   beforeEach(() => { | ||||
|     process.env = Object.keys(process.env).reduce((object, key) => { | ||||
|       if (!key.startsWith('INPUT_')) { | ||||
|         object[key] = process.env[key]; | ||||
|       } | ||||
|       return object; | ||||
|     }, {}); | ||||
|   }); | ||||
|  | ||||
|   // prettier-ignore | ||||
|   test.each([ | ||||
|     [ | ||||
|       0, | ||||
|       'v0.10.3', | ||||
|       new Map<string, string>([ | ||||
|         ['install', 'false'], | ||||
|         ['use', 'true'], | ||||
|         ['cleanup', 'true'], | ||||
|       ]), | ||||
|       [ | ||||
|         'create', | ||||
|         '--name', 'builder-9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d', | ||||
|         '--driver', 'docker-container', | ||||
|         '--buildkitd-flags', '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host', | ||||
|         '--use' | ||||
|       ] | ||||
|     ], | ||||
|     [ | ||||
|       1, | ||||
|       'v0.10.3', | ||||
|       new Map<string, string>([ | ||||
|         ['driver', 'docker'], | ||||
|         ['install', 'false'], | ||||
|         ['use', 'true'], | ||||
|         ['cleanup', 'true'], | ||||
|       ]), | ||||
|       [ | ||||
|         'create', | ||||
|         '--name', 'default', | ||||
|         '--driver', 'docker', | ||||
|         '--buildkitd-flags', '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host', | ||||
|         '--use' | ||||
|       ] | ||||
|     ], | ||||
|     [ | ||||
|       2, | ||||
|       'v0.10.3', | ||||
|       new Map<string, string>([ | ||||
|         ['install', 'false'], | ||||
|         ['use', 'false'], | ||||
|         ['driver-opts', 'image=moby/buildkit:master\nnetwork=host'], | ||||
|         ['cleanup', 'true'], | ||||
|       ]), | ||||
|       [ | ||||
|         'create', | ||||
|         '--name', 'builder-9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d', | ||||
|         '--driver', 'docker-container', | ||||
|         '--driver-opt', 'image=moby/buildkit:master', | ||||
|         '--driver-opt', 'network=host', | ||||
|         '--buildkitd-flags', '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host' | ||||
|       ] | ||||
|     ], | ||||
|     [ | ||||
|       3, | ||||
|       'v0.10.3', | ||||
|       new Map<string, string>([ | ||||
|         ['driver', 'remote'], | ||||
|         ['endpoint', 'tls://foo:1234'], | ||||
|         ['install', 'false'], | ||||
|         ['use', 'true'], | ||||
|         ['cleanup', 'true'], | ||||
|       ]), | ||||
|       [ | ||||
|         'create', | ||||
|         '--name', 'builder-9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d', | ||||
|         '--driver', 'remote', | ||||
|         '--use', | ||||
|         'tls://foo:1234' | ||||
|       ] | ||||
|     ], | ||||
|     [ | ||||
|       4, | ||||
|       'v0.10.3', | ||||
|       new Map<string, string>([ | ||||
|         ['driver', 'remote'], | ||||
|         ['platforms', 'linux/arm64,linux/arm/v7'], | ||||
|         ['endpoint', 'tls://foo:1234'], | ||||
|         ['install', 'false'], | ||||
|         ['use', 'true'], | ||||
|         ['cleanup', 'true'], | ||||
|       ]), | ||||
|       [ | ||||
|         'create', | ||||
|         '--name', 'builder-9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d', | ||||
|         '--driver', 'remote', | ||||
|         '--platform', 'linux/arm64,linux/arm/v7', | ||||
|         '--use', | ||||
|         'tls://foo:1234' | ||||
|       ] | ||||
|     ], | ||||
|     [ | ||||
|       5, | ||||
|       'v0.10.3', | ||||
|       new Map<string, string>([ | ||||
|         ['install', 'false'], | ||||
|         ['use', 'false'], | ||||
|         ['driver-opts', `"env.no_proxy=localhost,127.0.0.1,.mydomain"`], | ||||
|         ['cleanup', 'true'], | ||||
|       ]), | ||||
|       [ | ||||
|         'create', | ||||
|         '--name', 'builder-9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d', | ||||
|         '--driver', 'docker-container', | ||||
|         '--driver-opt', '"env.no_proxy=localhost,127.0.0.1,.mydomain"', | ||||
|         '--buildkitd-flags', '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host' | ||||
|       ] | ||||
|     ], | ||||
|     [ | ||||
|       6, | ||||
|       'v0.10.3', | ||||
|       new Map<string, string>([ | ||||
|         ['install', 'false'], | ||||
|         ['use', 'false'], | ||||
|         ['platforms', 'linux/amd64\n"linux/arm64,linux/arm/v7"'], | ||||
|         ['cleanup', 'true'], | ||||
|       ]), | ||||
|       [ | ||||
|         'create', | ||||
|         '--name', 'builder-9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d', | ||||
|         '--driver', 'docker-container', | ||||
|         '--buildkitd-flags', '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host', | ||||
|         '--platform', 'linux/amd64,linux/arm64,linux/arm/v7' | ||||
|       ] | ||||
|     ] | ||||
|   ])( | ||||
|     '[%d] given buildx %s and %p as inputs, returns %p', | ||||
|     async (num: number, buildxVersion: string, inputs: Map<string, string>, expected: Array<string>) => { | ||||
|       inputs.forEach((value: string, name: string) => { | ||||
|         setInput(name, value); | ||||
|       }); | ||||
|       const toolkit = new Toolkit(); | ||||
|       jest.spyOn(Buildx.prototype, 'version').mockImplementation(async (): Promise<string> => { | ||||
|         return buildxVersion; | ||||
|       }); | ||||
|       const inp = await context.getInputs(); | ||||
|       const res = await context.getCreateArgs(inp, toolkit); | ||||
|       expect(res).toEqual(expected); | ||||
|     } | ||||
|   ); | ||||
| }); | ||||
|  | ||||
| describe('getAppendArgs', () => { | ||||
|   beforeEach(() => { | ||||
|     process.env = Object.keys(process.env).reduce((object, key) => { | ||||
|       if (!key.startsWith('INPUT_')) { | ||||
|         object[key] = process.env[key]; | ||||
|       } | ||||
|       return object; | ||||
|     }, {}); | ||||
|   }); | ||||
|  | ||||
|   // prettier-ignore | ||||
|   test.each([ | ||||
|     [ | ||||
|       0, | ||||
|       'v0.10.3', | ||||
|       new Map<string, string>([ | ||||
|         ['install', 'false'], | ||||
|         ['use', 'true'], | ||||
|         ['cleanup', 'true'], | ||||
|       ]), | ||||
|       { | ||||
|         "name": "aws_graviton2", | ||||
|         "endpoint": "ssh://me@graviton2", | ||||
|         "driver-opts": [ | ||||
|           "image=moby/buildkit:latest" | ||||
|         ], | ||||
|         "buildkitd-flags": "--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host", | ||||
|         "platforms": "linux/arm64" | ||||
|       }, | ||||
|       [ | ||||
|         'create', | ||||
|         '--name', 'builder-9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d', | ||||
|         '--append', | ||||
|         '--node', 'aws_graviton2', | ||||
|         '--driver-opt', 'image=moby/buildkit:latest', | ||||
|         '--buildkitd-flags', '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host', | ||||
|         '--platform', 'linux/arm64', | ||||
|         'ssh://me@graviton2' | ||||
|       ] | ||||
|     ] | ||||
|   ])( | ||||
|     '[%d] given buildx %s and %p as inputs, returns %p', | ||||
|     async (num: number, buildxVersion: string, inputs: Map<string, string>, node: Node, expected: Array<string>) => { | ||||
|       inputs.forEach((value: string, name: string) => { | ||||
|         setInput(name, value); | ||||
|       }); | ||||
|       const toolkit = new Toolkit(); | ||||
|       jest.spyOn(Buildx.prototype, 'version').mockImplementation(async (): Promise<string> => { | ||||
|         return buildxVersion; | ||||
|       }); | ||||
|       const inp = await context.getInputs(); | ||||
|       const res = await context.getAppendArgs(inp, node, toolkit); | ||||
|       expect(res).toEqual(expected); | ||||
|     } | ||||
|   ); | ||||
| }); | ||||
|  | ||||
| // See: https://github.com/actions/toolkit/blob/master/packages/core/src/core.ts#L67 | ||||
|   | ||||
| @@ -1,17 +0,0 @@ | ||||
| import * as github from '../src/github'; | ||||
|  | ||||
| describe('github', () => { | ||||
|   it('returns latest buildx GitHub release', async () => { | ||||
|     const release = await github.getRelease('latest'); | ||||
|     console.log(release); | ||||
|     expect(release).not.toBeNull(); | ||||
|     expect(release?.tag_name).not.toEqual(''); | ||||
|   }); | ||||
|  | ||||
|   it('returns v0.2.2 buildx GitHub release', async () => { | ||||
|     const release = await github.getRelease('v0.2.2'); | ||||
|     console.log(release); | ||||
|     expect(release).not.toBeNull(); | ||||
|     expect(release?.tag_name).toEqual('v0.2.2'); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										34
									
								
								action.yml
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								action.yml
									
									
									
									
									
								
							| @@ -22,7 +22,7 @@ inputs: | ||||
|     default: '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host' | ||||
|     required: false | ||||
|   install: | ||||
|     description: 'Sets up docker build command as an alias to docker buildx' | ||||
|     description: 'Sets up docker build command as an alias to docker buildx build' | ||||
|     default: 'false' | ||||
|     required: false | ||||
|   use: | ||||
| @@ -32,14 +32,40 @@ inputs: | ||||
|   endpoint: | ||||
|     description: 'Optional address for docker socket or context from `docker context ls`' | ||||
|     required: false | ||||
|   platforms: | ||||
|     description: 'Fixed platforms for current node. If not empty, values take priority over the detected ones' | ||||
|     required: false | ||||
|   config: | ||||
|     description: 'BuildKit config file' | ||||
|     required: false | ||||
|   config-inline: | ||||
|     description: 'Inline BuildKit config' | ||||
|     required: false | ||||
|   append: | ||||
|     description: 'Append additional nodes to the builder' | ||||
|     required: false | ||||
|   cleanup: | ||||
|     description: 'Cleanup temp files and remove builder at the end of a job' | ||||
|     default: 'true' | ||||
|     required: false | ||||
|  | ||||
| outputs: | ||||
|   name: | ||||
|     description: 'Builder instance name' | ||||
|     description: 'Builder name' | ||||
|   driver: | ||||
|     description: 'Builder driver' | ||||
|   platforms: | ||||
|     description: 'Available platforms (comma separated)' | ||||
|     description: 'Builder node platforms (preferred or available)' | ||||
|   nodes: | ||||
|     description: 'Builder nodes metadata' | ||||
|   endpoint: | ||||
|     description: 'Builder node endpoint (deprecated, use nodes output instead)' | ||||
|   status: | ||||
|     description: 'Builder node status (deprecated, use nodes output instead)' | ||||
|   flags: | ||||
|     description: 'Builder node flags (deprecated, use nodes output instead)' | ||||
|  | ||||
| runs: | ||||
|   using: 'node12' | ||||
|   using: 'node16' | ||||
|   main: 'dist/index.js' | ||||
|   post: 'dist/index.js' | ||||
|   | ||||
							
								
								
									
										3
									
								
								codecov.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								codecov.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| comment: false | ||||
| github_checks: | ||||
|   annotations: false | ||||
							
								
								
									
										79
									
								
								dev.Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								dev.Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| # syntax=docker/dockerfile:1 | ||||
|  | ||||
| ARG NODE_VERSION=16 | ||||
| ARG DOCKER_VERSION=20.10.13 | ||||
| ARG BUILDX_VERSION=0.8.1 | ||||
|  | ||||
| FROM node:${NODE_VERSION}-alpine AS base | ||||
| RUN apk add --no-cache cpio findutils git | ||||
| WORKDIR /src | ||||
|  | ||||
| FROM base AS deps | ||||
| RUN --mount=type=bind,target=.,rw \ | ||||
|   --mount=type=cache,target=/src/node_modules \ | ||||
|   yarn install && mkdir /vendor && cp yarn.lock /vendor | ||||
|  | ||||
| FROM scratch AS vendor-update | ||||
| COPY --from=deps /vendor / | ||||
|  | ||||
| FROM deps AS vendor-validate | ||||
| RUN --mount=type=bind,target=.,rw <<EOT | ||||
| set -e | ||||
| git add -A | ||||
| cp -rf /vendor/* . | ||||
| if [ -n "$(git status --porcelain -- yarn.lock)" ]; then | ||||
|   echo >&2 'ERROR: Vendor result differs. Please vendor your package with "docker buildx bake vendor-update"' | ||||
|   git status --porcelain -- yarn.lock | ||||
|   exit 1 | ||||
| fi | ||||
| EOT | ||||
|  | ||||
| FROM deps AS build | ||||
| RUN --mount=type=bind,target=.,rw \ | ||||
|   --mount=type=cache,target=/src/node_modules \ | ||||
|   yarn run build && mkdir /out && cp -Rf dist /out/ | ||||
|  | ||||
| FROM scratch AS build-update | ||||
| COPY --from=build /out / | ||||
|  | ||||
| FROM build AS build-validate | ||||
| RUN --mount=type=bind,target=.,rw <<EOT | ||||
| set -e | ||||
| git add -A | ||||
| cp -rf /out/* . | ||||
| if [ -n "$(git status --porcelain -- dist)" ]; then | ||||
|   echo >&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"' | ||||
|   git status --porcelain -- dist | ||||
|   exit 1 | ||||
| fi | ||||
| EOT | ||||
|  | ||||
| FROM deps AS format | ||||
| RUN --mount=type=bind,target=.,rw \ | ||||
|   --mount=type=cache,target=/src/node_modules \ | ||||
|   yarn run format \ | ||||
|   && mkdir /out && find . -name '*.ts' -not -path './node_modules/*' | cpio -pdm /out | ||||
|  | ||||
| FROM scratch AS format-update | ||||
| COPY --from=format /out / | ||||
|  | ||||
| FROM deps AS lint | ||||
| RUN --mount=type=bind,target=.,rw \ | ||||
|   --mount=type=cache,target=/src/node_modules \ | ||||
|   yarn run lint | ||||
|  | ||||
| FROM docker:${DOCKER_VERSION} as docker | ||||
| FROM docker/buildx-bin:${BUILDX_VERSION} as buildx | ||||
|  | ||||
| FROM deps AS test | ||||
| ENV RUNNER_TEMP=/tmp/github_runner | ||||
| ENV RUNNER_TOOL_CACHE=/tmp/github_tool_cache | ||||
| RUN --mount=type=bind,target=.,rw \ | ||||
|   --mount=type=cache,target=/src/node_modules \ | ||||
|   --mount=type=bind,from=docker,source=/usr/local/bin/docker,target=/usr/bin/docker \ | ||||
|   --mount=type=bind,from=buildx,source=/buildx,target=/usr/bin/buildx \ | ||||
|   --mount=type=bind,from=buildx,source=/buildx,target=/usr/libexec/docker/cli-plugins/docker-buildx \ | ||||
|   yarn run test --coverageDirectory=/tmp/coverage | ||||
|  | ||||
| FROM scratch AS test-coverage | ||||
| COPY --from=test /tmp/coverage / | ||||
							
								
								
									
										7758
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7758
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								dist/index.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								dist/index.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1269
									
								
								dist/licenses.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1269
									
								
								dist/licenses.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								dist/sourcemap-register.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								dist/sourcemap-register.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -3,40 +3,51 @@ group "default" { | ||||
| } | ||||
|  | ||||
| group "pre-checkin" { | ||||
|   targets = ["update-yarn", "format", "build"] | ||||
|   targets = ["vendor-update", "format", "build"] | ||||
| } | ||||
|  | ||||
| group "validate" { | ||||
| 	targets = ["validate-format", "validate-build", "validate-yarn"] | ||||
| } | ||||
|  | ||||
| target "update-yarn" { | ||||
|   target = "update-yarn" | ||||
|   output = ["."] | ||||
|   targets = ["lint", "build-validate", "vendor-validate"] | ||||
| } | ||||
|  | ||||
| target "build" { | ||||
|   target = "dist" | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "build-update" | ||||
|   output = ["."] | ||||
| } | ||||
|  | ||||
| target "test" { | ||||
|   target = "test" | ||||
| target "build-validate" { | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "build-validate" | ||||
|   output = ["type=cacheonly"] | ||||
| } | ||||
|  | ||||
| target "format" { | ||||
|   target = "format" | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "format-update" | ||||
|   output = ["."] | ||||
| } | ||||
|  | ||||
| target "validate-format" { | ||||
|   target = "validate-format" | ||||
| target "lint" { | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "lint" | ||||
|   output = ["type=cacheonly"] | ||||
| } | ||||
|  | ||||
| target "validate-build" { | ||||
|   target = "validate-build" | ||||
| target "vendor-update" { | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "vendor-update" | ||||
|   output = ["."] | ||||
| } | ||||
|  | ||||
| target "validate-yarn" { | ||||
| 	target = "validate-yarn" | ||||
| } | ||||
| target "vendor-validate" { | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "vendor-validate" | ||||
|   output = ["type=cacheonly"] | ||||
| } | ||||
|  | ||||
| target "test" { | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "test-coverage" | ||||
|   output = ["./coverage"] | ||||
| } | ||||
|   | ||||
							
								
								
									
										3
									
								
								docs/advanced/append-nodes.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								docs/advanced/append-nodes.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # Append additional nodes to the builder | ||||
|  | ||||
| This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/configure-builder/#append-additional-nodes-to-the-builder) | ||||
							
								
								
									
										3
									
								
								docs/advanced/auth.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								docs/advanced/auth.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # Authentication support | ||||
|  | ||||
| This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/configure-builder/#authentication-for-remote-builders) | ||||
							
								
								
									
										3
									
								
								docs/advanced/buildkit-config.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								docs/advanced/buildkit-config.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # BuildKit daemon configuration | ||||
|  | ||||
| This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/configure-builder/#buildkit-daemon-configuration) | ||||
							
								
								
									
										3
									
								
								docs/advanced/standalone.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								docs/advanced/standalone.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| # Standalone mode | ||||
|  | ||||
| This page has moved to [Docker Docs website](https://docs.docker.com/build/ci/github-actions/configure-builder/#standalone-mode) | ||||
| @@ -1,6 +0,0 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX) | ||||
| DOCKER_BUILDKIT=1 docker build --iidfile $iidfile --progress=plain . | ||||
| docker run -it --rm $(cat $iidfile) | ||||
| docker rmi $(cat $iidfile) | ||||
| @@ -1,12 +0,0 @@ | ||||
| module.exports = { | ||||
|   clearMocks: true, | ||||
|   moduleFileExtensions: ['js', 'ts'], | ||||
|   setupFiles: ["dotenv/config"], | ||||
|   testEnvironment: 'node', | ||||
|   testMatch: ['**/*.test.ts'], | ||||
|   testRunner: 'jest-circus/runner', | ||||
|   transform: { | ||||
|     '^.+\\.ts$': 'ts-jest' | ||||
|   }, | ||||
|   verbose: false | ||||
| } | ||||
							
								
								
									
										29
									
								
								jest.config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								jest.config.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| import fs from 'fs'; | ||||
| import os from 'os'; | ||||
| import path from 'path'; | ||||
|  | ||||
| const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-setup-buildx-action-')).split(path.sep).join(path.posix.sep); | ||||
|  | ||||
| process.env = Object.assign({}, process.env, { | ||||
|   TEMP: tmpDir, | ||||
|   GITHUB_REPOSITORY: 'docker/setup-buildx-action', | ||||
|   RUNNER_TEMP: path.join(tmpDir, 'runner-temp').split(path.sep).join(path.posix.sep), | ||||
|   RUNNER_TOOL_CACHE: path.join(tmpDir, 'runner-tool-cache').split(path.sep).join(path.posix.sep) | ||||
| }) as { | ||||
|   [key: string]: string; | ||||
| }; | ||||
|  | ||||
| module.exports = { | ||||
|   clearMocks: true, | ||||
|   moduleFileExtensions: ['js', 'ts'], | ||||
|   testMatch: ['**/*.test.ts'], | ||||
|   transform: { | ||||
|     '^.+\\.ts$': 'ts-jest' | ||||
|   }, | ||||
|   moduleNameMapper: { | ||||
|     '^csv-parse/sync': '<rootDir>/node_modules/csv-parse/dist/cjs/sync.cjs' | ||||
|   }, | ||||
|   collectCoverageFrom: ['src/**/{!(main.ts),}.ts'], | ||||
|   coveragePathIgnorePatterns: ['lib/', 'node_modules/', '__tests__/'], | ||||
|   verbose: true | ||||
| }; | ||||
							
								
								
									
										42
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								package.json
									
									
									
									
									
								
							| @@ -3,11 +3,11 @@ | ||||
|   "description": "Set up Docker Buildx", | ||||
|   "main": "lib/main.js", | ||||
|   "scripts": { | ||||
|     "build": "tsc && ncc build", | ||||
|     "format": "prettier --write **/*.ts", | ||||
|     "format-check": "prettier --check **/*.ts", | ||||
|     "build": "ncc build src/main.ts --source-map --minify --license licenses.txt", | ||||
|     "lint": "eslint src/**/*.ts __tests__/**/*.ts", | ||||
|     "format": "eslint --fix src/**/*.ts __tests__/**/*.ts", | ||||
|     "test": "jest --coverage", | ||||
|     "pre-checkin": "yarn run format && yarn run build" | ||||
|     "all": "yarn run build && yarn run format && yarn test" | ||||
|   }, | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
| @@ -27,23 +27,25 @@ | ||||
|   ], | ||||
|   "license": "Apache-2.0", | ||||
|   "dependencies": { | ||||
|     "@actions/core": "^1.2.6", | ||||
|     "@actions/exec": "^1.0.4", | ||||
|     "@actions/http-client": "^1.0.9", | ||||
|     "@actions/tool-cache": "^1.6.1", | ||||
|     "semver": "^7.3.2" | ||||
|     "@actions/core": "^1.10.0", | ||||
|     "@actions/exec": "^1.1.1", | ||||
|     "@docker/actions-toolkit": "^0.3.0", | ||||
|     "js-yaml": "^4.1.0", | ||||
|     "uuid": "^9.0.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/jest": "^26.0.3", | ||||
|     "@types/node": "^14.0.14", | ||||
|     "@vercel/ncc": "^0.23.0", | ||||
|     "dotenv": "^8.2.0", | ||||
|     "jest": "^26.1.0", | ||||
|     "jest-circus": "^26.1.0", | ||||
|     "jest-runtime": "^26.1.0", | ||||
|     "prettier": "^2.0.5", | ||||
|     "ts-jest": "^26.1.1", | ||||
|     "typescript": "^3.9.5", | ||||
|     "typescript-formatter": "^7.2.2" | ||||
|     "@types/node": "^16.18.21", | ||||
|     "@typescript-eslint/eslint-plugin": "^5.56.0", | ||||
|     "@typescript-eslint/parser": "^5.56.0", | ||||
|     "@vercel/ncc": "^0.36.1", | ||||
|     "eslint": "^8.36.0", | ||||
|     "eslint-config-prettier": "^8.8.0", | ||||
|     "eslint-plugin-jest": "^27.2.1", | ||||
|     "eslint-plugin-prettier": "^4.2.1", | ||||
|     "jest": "^29.5.0", | ||||
|     "prettier": "^2.8.7", | ||||
|     "ts-jest": "^29.0.5", | ||||
|     "ts-node": "^10.9.1", | ||||
|     "typescript": "^4.9.5" | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										138
									
								
								src/buildx.ts
									
									
									
									
									
								
							
							
						
						
									
										138
									
								
								src/buildx.ts
									
									
									
									
									
								
							| @@ -1,138 +0,0 @@ | ||||
| import * as fs from 'fs'; | ||||
| import * as path from 'path'; | ||||
| import * as semver from 'semver'; | ||||
| import * as util from 'util'; | ||||
| import * as context from './context'; | ||||
| import * as exec from './exec'; | ||||
| import * as github from './github'; | ||||
| import * as core from '@actions/core'; | ||||
| import * as tc from '@actions/tool-cache'; | ||||
|  | ||||
| export async function getVersion(): Promise<string> { | ||||
|   return await exec.exec(`docker`, ['buildx', 'version'], true).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       throw new Error(res.stderr); | ||||
|     } | ||||
|     return parseVersion(res.stdout); | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export async function parseVersion(stdout: string): Promise<string> { | ||||
|   const matches = /\sv?([0-9.]+)/.exec(stdout); | ||||
|   if (!matches) { | ||||
|     throw new Error(`Cannot parse Buildx version`); | ||||
|   } | ||||
|   return semver.clean(matches[1]); | ||||
| } | ||||
|  | ||||
| export async function isAvailable(): Promise<Boolean> { | ||||
|   return await exec.exec(`docker`, ['buildx'], true).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       return false; | ||||
|     } | ||||
|     return res.success; | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export async function countBuilders(): Promise<number> { | ||||
|   return await exec.exec(`docker`, ['buildx', 'ls'], true).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       throw new Error(`Cannot list builders: ${res.stderr}`); | ||||
|     } | ||||
|     return (res.stdout.trim().split(`\n`).length - 1) / 2; | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export async function platforms(): Promise<String | undefined> { | ||||
|   return await exec.exec(`docker`, ['buildx', 'inspect'], true).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       throw new Error(res.stderr); | ||||
|     } | ||||
|     for (const line of res.stdout.trim().split(`\n`)) { | ||||
|       if (line.startsWith('Platforms')) { | ||||
|         return line.replace('Platforms: ', '').replace(/\s/g, '').trim(); | ||||
|       } | ||||
|     } | ||||
|   }); | ||||
| } | ||||
|  | ||||
| export async function install(inputVersion: string, dockerConfigHome: string): Promise<string> { | ||||
|   const release: github.GitHubRelease | null = await github.getRelease(inputVersion); | ||||
|   if (!release) { | ||||
|     throw new Error(`Cannot find buildx ${inputVersion} release`); | ||||
|   } | ||||
|   core.debug(`Release found: ${release.tag_name}`); | ||||
|   const version = release.tag_name.replace(/^v+|v+$/g, ''); | ||||
|  | ||||
|   let toolPath: string; | ||||
|   toolPath = tc.find('buildx', version); | ||||
|   if (!toolPath) { | ||||
|     const c = semver.clean(version) || ''; | ||||
|     if (!semver.valid(c)) { | ||||
|       throw new Error(`Invalid Buildx version "${version}".`); | ||||
|     } | ||||
|     toolPath = await download(version); | ||||
|   } | ||||
|  | ||||
|   const pluginsDir: string = path.join(dockerConfigHome, 'cli-plugins'); | ||||
|   core.debug(`Plugins dir is ${pluginsDir}`); | ||||
|   if (!fs.existsSync(pluginsDir)) { | ||||
|     fs.mkdirSync(pluginsDir, {recursive: true}); | ||||
|   } | ||||
|  | ||||
|   const filename: string = context.osPlat == 'win32' ? 'docker-buildx.exe' : 'docker-buildx'; | ||||
|   const pluginPath: string = path.join(pluginsDir, filename); | ||||
|   core.debug(`Plugin path is ${pluginPath}`); | ||||
|   fs.copyFileSync(path.join(toolPath, filename), pluginPath); | ||||
|  | ||||
|   core.info('🔨 Fixing perms...'); | ||||
|   fs.chmodSync(pluginPath, '0755'); | ||||
|  | ||||
|   return pluginPath; | ||||
| } | ||||
|  | ||||
| async function download(version: string): Promise<string> { | ||||
|   const targetFile: string = context.osPlat == 'win32' ? 'docker-buildx.exe' : 'docker-buildx'; | ||||
|   const downloadUrl = util.format( | ||||
|     'https://github.com/docker/buildx/releases/download/v%s/%s', | ||||
|     version, | ||||
|     await filename(version) | ||||
|   ); | ||||
|   let downloadPath: string; | ||||
|  | ||||
|   try { | ||||
|     core.info(`⬇️ Downloading ${downloadUrl}...`); | ||||
|     downloadPath = await tc.downloadTool(downloadUrl); | ||||
|     core.debug(`Downloaded to ${downloadPath}`); | ||||
|   } catch (error) { | ||||
|     throw error; | ||||
|   } | ||||
|  | ||||
|   return await tc.cacheFile(downloadPath, targetFile, 'buildx', version); | ||||
| } | ||||
|  | ||||
| async function filename(version: string): Promise<string> { | ||||
|   let arch: string; | ||||
|   switch (context.osArch) { | ||||
|     case 'x64': { | ||||
|       arch = 'amd64'; | ||||
|       break; | ||||
|     } | ||||
|     case 'ppc64': { | ||||
|       arch = 'ppc64le'; | ||||
|       break; | ||||
|     } | ||||
|     case 'arm': { | ||||
|       const arm_version = (process.config.variables as any).arm_version; | ||||
|       arch = arm_version ? 'arm-v' + arm_version : 'arm'; | ||||
|       break; | ||||
|     } | ||||
|     default: { | ||||
|       arch = context.osArch; | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   const platform: string = context.osPlat == 'win32' ? 'windows' : context.osPlat; | ||||
|   const ext: string = context.osPlat == 'win32' ? '.exe' : ''; | ||||
|   return util.format('buildx-v%s.%s-%s%s', version, platform, arch, ext); | ||||
| } | ||||
							
								
								
									
										110
									
								
								src/context.ts
									
									
									
									
									
								
							
							
						
						
									
										110
									
								
								src/context.ts
									
									
									
									
									
								
							| @@ -1,49 +1,107 @@ | ||||
| import * as os from 'os'; | ||||
| import * as uuid from 'uuid'; | ||||
| import * as core from '@actions/core'; | ||||
| import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; | ||||
| import {Util} from '@docker/actions-toolkit/lib/util'; | ||||
| import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; | ||||
| import {Node} from '@docker/actions-toolkit/lib/types/builder'; | ||||
|  | ||||
| export const osPlat: string = os.platform(); | ||||
| export const osArch: string = os.arch(); | ||||
| export const builderNodeEnvPrefix = 'BUILDER_NODE'; | ||||
|  | ||||
| export interface Inputs { | ||||
|   version: string; | ||||
|   name: string; | ||||
|   driver: string; | ||||
|   driverOpts: string[]; | ||||
|   buildkitdFlags: string; | ||||
|   platforms: string[]; | ||||
|   install: boolean; | ||||
|   use: boolean; | ||||
|   endpoint: string; | ||||
|   config: string; | ||||
|   configInline: string; | ||||
|   append: string; | ||||
|   cleanup: boolean; | ||||
| } | ||||
|  | ||||
| export async function getInputs(): Promise<Inputs> { | ||||
|   return { | ||||
|     version: core.getInput('version'), | ||||
|     name: await getBuilderName(core.getInput('driver') || 'docker-container'), | ||||
|     driver: core.getInput('driver') || 'docker-container', | ||||
|     driverOpts: await getInputList('driver-opts', true), | ||||
|     buildkitdFlags: | ||||
|       core.getInput('buildkitd-flags') || | ||||
|       '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host', | ||||
|     install: /true/i.test(core.getInput('install')), | ||||
|     use: /true/i.test(core.getInput('use')), | ||||
|     endpoint: core.getInput('endpoint') | ||||
|     driverOpts: Util.getInputList('driver-opts', {ignoreComma: true, quote: false}), | ||||
|     buildkitdFlags: core.getInput('buildkitd-flags') || '--allow-insecure-entitlement security.insecure --allow-insecure-entitlement network.host', | ||||
|     platforms: Util.getInputList('platforms'), | ||||
|     install: core.getBooleanInput('install'), | ||||
|     use: core.getBooleanInput('use'), | ||||
|     endpoint: core.getInput('endpoint'), | ||||
|     config: core.getInput('config'), | ||||
|     configInline: core.getInput('config-inline'), | ||||
|     append: core.getInput('append'), | ||||
|     cleanup: core.getBooleanInput('cleanup') | ||||
|   }; | ||||
| } | ||||
|  | ||||
| export async function getInputList(name: string, ignoreComma?: boolean): Promise<string[]> { | ||||
|   const items = core.getInput(name); | ||||
|   if (items == '') { | ||||
|     return []; | ||||
|   } | ||||
|   return items | ||||
|     .split(/\r?\n/) | ||||
|     .filter(x => x) | ||||
|     .reduce<string[]>( | ||||
|       (acc, line) => acc.concat(!ignoreComma ? line.split(',').filter(x => x) : line).map(pat => pat.trim()), | ||||
|       [] | ||||
|     ); | ||||
| export async function getBuilderName(driver: string): Promise<string> { | ||||
|   return driver == 'docker' ? await Docker.context() : `builder-${uuid.v4()}`; | ||||
| } | ||||
|  | ||||
| export const asyncForEach = async (array, callback) => { | ||||
|   for (let index = 0; index < array.length; index++) { | ||||
|     await callback(array[index], index, array); | ||||
| export async function getCreateArgs(inputs: Inputs, toolkit: Toolkit): Promise<Array<string>> { | ||||
|   const args: Array<string> = ['create', '--name', inputs.name, '--driver', inputs.driver]; | ||||
|   if (await toolkit.buildx.versionSatisfies('>=0.3.0')) { | ||||
|     await Util.asyncForEach(inputs.driverOpts, async driverOpt => { | ||||
|       args.push('--driver-opt', driverOpt); | ||||
|     }); | ||||
|     if (inputs.driver != 'remote' && inputs.buildkitdFlags) { | ||||
|       args.push('--buildkitd-flags', inputs.buildkitdFlags); | ||||
|     } | ||||
|   } | ||||
| }; | ||||
|   if (inputs.platforms.length > 0) { | ||||
|     args.push('--platform', inputs.platforms.join(',')); | ||||
|   } | ||||
|   if (inputs.use) { | ||||
|     args.push('--use'); | ||||
|   } | ||||
|   if (inputs.driver != 'remote') { | ||||
|     if (inputs.config) { | ||||
|       args.push('--config', toolkit.buildkit.config.resolveFromFile(inputs.config)); | ||||
|     } else if (inputs.configInline) { | ||||
|       args.push('--config', toolkit.buildkit.config.resolveFromString(inputs.configInline)); | ||||
|     } | ||||
|   } | ||||
|   if (inputs.endpoint) { | ||||
|     args.push(inputs.endpoint); | ||||
|   } | ||||
|   return args; | ||||
| } | ||||
|  | ||||
| export async function getAppendArgs(inputs: Inputs, node: Node, toolkit: Toolkit): Promise<Array<string>> { | ||||
|   const args: Array<string> = ['create', '--name', inputs.name, '--append']; | ||||
|   if (node.name) { | ||||
|     args.push('--node', node.name); | ||||
|   } else if (inputs.driver == 'kubernetes' && (await toolkit.buildx.versionSatisfies('<0.11.0'))) { | ||||
|     args.push('--node', `node-${uuid.v4()}`); | ||||
|   } | ||||
|   if (node['driver-opts'] && (await toolkit.buildx.versionSatisfies('>=0.3.0'))) { | ||||
|     await Util.asyncForEach(node['driver-opts'], async driverOpt => { | ||||
|       args.push('--driver-opt', driverOpt); | ||||
|     }); | ||||
|     if (inputs.driver != 'remote' && node['buildkitd-flags']) { | ||||
|       args.push('--buildkitd-flags', node['buildkitd-flags']); | ||||
|     } | ||||
|   } | ||||
|   if (node.platforms) { | ||||
|     args.push('--platform', node.platforms); | ||||
|   } | ||||
|   if (node.endpoint) { | ||||
|     args.push(node.endpoint); | ||||
|   } | ||||
|   return args; | ||||
| } | ||||
|  | ||||
| export async function getInspectArgs(inputs: Inputs, toolkit: Toolkit): Promise<Array<string>> { | ||||
|   const args: Array<string> = ['inspect', '--bootstrap']; | ||||
|   if (await toolkit.buildx.versionSatisfies('>=0.4.0')) { | ||||
|     args.push('--builder', inputs.name); | ||||
|   } | ||||
|   return args; | ||||
| } | ||||
|   | ||||
| @@ -1,7 +0,0 @@ | ||||
| import * as exec from './exec'; | ||||
|  | ||||
| export async function isDaemonRunning(): Promise<boolean> { | ||||
|   return await exec.exec(`docker`, ['version', '--format', '{{.Server.Os}}'], true).then(res => { | ||||
|     return !res.stdout.includes(' ') && res.success; | ||||
|   }); | ||||
| } | ||||
							
								
								
									
										34
									
								
								src/exec.ts
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								src/exec.ts
									
									
									
									
									
								
							| @@ -1,34 +0,0 @@ | ||||
| import * as aexec from '@actions/exec'; | ||||
| import {ExecOptions} from '@actions/exec'; | ||||
|  | ||||
| export interface ExecResult { | ||||
|   success: boolean; | ||||
|   stdout: string; | ||||
|   stderr: string; | ||||
| } | ||||
|  | ||||
| export const exec = async (command: string, args: string[] = [], silent: boolean): Promise<ExecResult> => { | ||||
|   let stdout: string = ''; | ||||
|   let stderr: string = ''; | ||||
|  | ||||
|   const options: ExecOptions = { | ||||
|     silent: silent, | ||||
|     ignoreReturnCode: true | ||||
|   }; | ||||
|   options.listeners = { | ||||
|     stdout: (data: Buffer) => { | ||||
|       stdout += data.toString(); | ||||
|     }, | ||||
|     stderr: (data: Buffer) => { | ||||
|       stderr += data.toString(); | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   const returnCode: number = await aexec.exec(command, args, options); | ||||
|  | ||||
|   return { | ||||
|     success: returnCode === 0, | ||||
|     stdout: stdout.trim(), | ||||
|     stderr: stderr.trim() | ||||
|   }; | ||||
| }; | ||||
| @@ -1,12 +0,0 @@ | ||||
| import * as httpm from '@actions/http-client'; | ||||
|  | ||||
| export interface GitHubRelease { | ||||
|   id: number; | ||||
|   tag_name: string; | ||||
| } | ||||
|  | ||||
| export const getRelease = async (version: string): Promise<GitHubRelease | null> => { | ||||
|   const url: string = `https://github.com/docker/buildx/releases/${version}`; | ||||
|   const http: httpm.HttpClient = new httpm.HttpClient('setup-buildx'); | ||||
|   return (await http.getJson<GitHubRelease>(url)).result; | ||||
| }; | ||||
							
								
								
									
										274
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										274
									
								
								src/main.ts
									
									
									
									
									
								
							| @@ -1,99 +1,201 @@ | ||||
| import * as fs from 'fs'; | ||||
| import * as yaml from 'js-yaml'; | ||||
| import * as core from '@actions/core'; | ||||
| import * as exec from '@actions/exec'; | ||||
| import * as os from 'os'; | ||||
| import * as path from 'path'; | ||||
| import * as semver from 'semver'; | ||||
| import * as buildx from './buildx'; | ||||
| import * as actionsToolkit from '@docker/actions-toolkit'; | ||||
| import {Buildx} from '@docker/actions-toolkit/lib/buildx/buildx'; | ||||
| import {Builder} from '@docker/actions-toolkit/lib/buildx/builder'; | ||||
| import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; | ||||
| import {Toolkit} from '@docker/actions-toolkit/lib/toolkit'; | ||||
| import {Util} from '@docker/actions-toolkit/lib/util'; | ||||
| import {Node} from '@docker/actions-toolkit/lib/types/builder'; | ||||
|  | ||||
| import * as context from './context'; | ||||
| import * as mexec from './exec'; | ||||
| import * as stateHelper from './state-helper'; | ||||
|  | ||||
| async function run(): Promise<void> { | ||||
|   try { | ||||
|     if (os.platform() !== 'linux') { | ||||
|       core.setFailed('Only supported on linux platform'); | ||||
| actionsToolkit.run( | ||||
|   // main | ||||
|   async () => { | ||||
|     const inputs: context.Inputs = await context.getInputs(); | ||||
|     stateHelper.setCleanup(inputs.cleanup); | ||||
|  | ||||
|     const toolkit = new Toolkit(); | ||||
|     const standalone = await toolkit.buildx.isStandalone(); | ||||
|     stateHelper.setStandalone(standalone); | ||||
|  | ||||
|     await core.group(`Docker info`, async () => { | ||||
|       try { | ||||
|         await Docker.printVersion(); | ||||
|         await Docker.printInfo(); | ||||
|       } catch (e) { | ||||
|         core.info(e.message); | ||||
|       } | ||||
|     }); | ||||
|  | ||||
|     let toolPath; | ||||
|     if (Util.isValidRef(inputs.version)) { | ||||
|       if (standalone) { | ||||
|         throw new Error(`Cannot build from source without the Docker CLI`); | ||||
|       } | ||||
|       await core.group(`Build buildx from source`, async () => { | ||||
|         toolPath = await toolkit.buildxInstall.build(inputs.version); | ||||
|       }); | ||||
|     } else if (!(await toolkit.buildx.isAvailable()) || inputs.version) { | ||||
|       await core.group(`Download buildx from GitHub Releases`, async () => { | ||||
|         toolPath = await toolkit.buildxInstall.download(inputs.version || 'latest'); | ||||
|       }); | ||||
|     } | ||||
|     if (toolPath) { | ||||
|       await core.group(`Install buildx`, async () => { | ||||
|         if (standalone) { | ||||
|           await toolkit.buildxInstall.installStandalone(toolPath); | ||||
|         } else { | ||||
|           await toolkit.buildxInstall.installPlugin(toolPath); | ||||
|         } | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     await core.group(`Buildx version`, async () => { | ||||
|       await toolkit.buildx.printVersion(); | ||||
|     }); | ||||
|  | ||||
|     core.setOutput('name', inputs.name); | ||||
|     stateHelper.setBuilderName(inputs.name); | ||||
|     stateHelper.setBuilderDriver(inputs.driver); | ||||
|  | ||||
|     fs.mkdirSync(Buildx.certsDir, {recursive: true}); | ||||
|     stateHelper.setCertsDir(Buildx.certsDir); | ||||
|  | ||||
|     if (inputs.driver !== 'docker') { | ||||
|       await core.group(`Creating a new builder instance`, async () => { | ||||
|         const certsDriverOpts = Buildx.resolveCertsDriverOpts(inputs.driver, inputs.endpoint, { | ||||
|           cacert: process.env[`${context.builderNodeEnvPrefix}_0_AUTH_TLS_CACERT`], | ||||
|           cert: process.env[`${context.builderNodeEnvPrefix}_0_AUTH_TLS_CERT`], | ||||
|           key: process.env[`${context.builderNodeEnvPrefix}_0_AUTH_TLS_KEY`] | ||||
|         }); | ||||
|         if (certsDriverOpts.length > 0) { | ||||
|           inputs.driverOpts = [...inputs.driverOpts, ...certsDriverOpts]; | ||||
|         } | ||||
|         const createCmd = await toolkit.buildx.getCommand(await context.getCreateArgs(inputs, toolkit)); | ||||
|         await exec.exec(createCmd.command, createCmd.args); | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     if (inputs.append) { | ||||
|       await core.group(`Appending node(s) to builder`, async () => { | ||||
|         let nodeIndex = 1; | ||||
|         const nodes = yaml.load(inputs.append) as Node[]; | ||||
|         for (const node of nodes) { | ||||
|           const certsDriverOpts = Buildx.resolveCertsDriverOpts(inputs.driver, `${node.endpoint}`, { | ||||
|             cacert: process.env[`${context.builderNodeEnvPrefix}_${nodeIndex}_AUTH_TLS_CACERT`], | ||||
|             cert: process.env[`${context.builderNodeEnvPrefix}_${nodeIndex}_AUTH_TLS_CERT`], | ||||
|             key: process.env[`${context.builderNodeEnvPrefix}_${nodeIndex}_AUTH_TLS_KEY`] | ||||
|           }); | ||||
|           if (certsDriverOpts.length > 0) { | ||||
|             node['driver-opts'] = [...(node['driver-opts'] || []), ...certsDriverOpts]; | ||||
|           } | ||||
|           const appendCmd = await toolkit.buildx.getCommand(await context.getAppendArgs(inputs, node, toolkit)); | ||||
|           await exec.exec(appendCmd.command, appendCmd.args); | ||||
|           nodeIndex++; | ||||
|         } | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     await core.group(`Booting builder`, async () => { | ||||
|       const inspectCmd = await toolkit.buildx.getCommand(await context.getInspectArgs(inputs, toolkit)); | ||||
|       await exec.exec(inspectCmd.command, inspectCmd.args); | ||||
|     }); | ||||
|  | ||||
|     if (inputs.install) { | ||||
|       if (standalone) { | ||||
|         throw new Error(`Cannot set buildx as default builder without the Docker CLI`); | ||||
|       } | ||||
|       await core.group(`Setting buildx as default builder`, async () => { | ||||
|         const installCmd = await toolkit.buildx.getCommand(['install']); | ||||
|         await exec.exec(installCmd.command, installCmd.args); | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     const builderInspect = await toolkit.builder.inspect(inputs.name); | ||||
|     const firstNode = builderInspect.nodes[0]; | ||||
|  | ||||
|     await core.group(`Inspect builder`, async () => { | ||||
|       const reducedPlatforms: Array<string> = []; | ||||
|       for (const node of builderInspect.nodes) { | ||||
|         for (const platform of node.platforms?.split(',') || []) { | ||||
|           if (reducedPlatforms.indexOf(platform) > -1) { | ||||
|             continue; | ||||
|           } | ||||
|           reducedPlatforms.push(platform); | ||||
|         } | ||||
|       } | ||||
|       core.info(JSON.stringify(builderInspect, undefined, 2)); | ||||
|       core.setOutput('driver', builderInspect.driver); | ||||
|       core.setOutput('platforms', reducedPlatforms.join(',')); | ||||
|       core.setOutput('nodes', JSON.stringify(builderInspect.nodes, undefined, 2)); | ||||
|       core.setOutput('endpoint', firstNode.endpoint); // TODO: deprecated, to be removed in a later version | ||||
|       core.setOutput('status', firstNode.status); // TODO: deprecated, to be removed in a later version | ||||
|       core.setOutput('flags', firstNode['buildkitd-flags']); // TODO: deprecated, to be removed in a later version | ||||
|     }); | ||||
|  | ||||
|     if (!standalone && builderInspect.driver == 'docker-container') { | ||||
|       stateHelper.setContainerName(`${Buildx.containerNamePrefix}${firstNode.name}`); | ||||
|       await core.group(`BuildKit version`, async () => { | ||||
|         for (const node of builderInspect.nodes) { | ||||
|           const buildkitVersion = await toolkit.buildkit.getVersion(node); | ||||
|           core.info(`${node.name}: ${buildkitVersion}`); | ||||
|         } | ||||
|       }); | ||||
|     } | ||||
|     if (core.isDebug() || firstNode['buildkitd-flags']?.includes('--debug')) { | ||||
|       stateHelper.setDebug('true'); | ||||
|     } | ||||
|   }, | ||||
|   // post | ||||
|   async () => { | ||||
|     if (stateHelper.IsDebug && stateHelper.containerName.length > 0) { | ||||
|       await core.group(`BuildKit container logs`, async () => { | ||||
|         await exec | ||||
|           .getExecOutput('docker', ['logs', `${stateHelper.containerName}`], { | ||||
|             ignoreReturnCode: true | ||||
|           }) | ||||
|           .then(res => { | ||||
|             if (res.stderr.length > 0 && res.exitCode != 0) { | ||||
|               core.warning(res.stderr.trim()); | ||||
|             } | ||||
|           }); | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     if (!stateHelper.cleanup) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const inputs: context.Inputs = await context.getInputs(); | ||||
|     const dockerConfigHome: string = process.env.DOCKER_CONFIG || path.join(os.homedir(), '.docker'); | ||||
|  | ||||
|     if (!(await buildx.isAvailable()) || inputs.version) { | ||||
|       core.startGroup(`👉 Installing Buildx`); | ||||
|       await buildx.install(inputs.version || 'latest', dockerConfigHome); | ||||
|       core.endGroup(); | ||||
|     } | ||||
|  | ||||
|     const buildxVersion = await buildx.getVersion(); | ||||
|     core.info(`📣 Buildx version: ${buildxVersion}`); | ||||
|  | ||||
|     const builderName: string = | ||||
|       inputs.driver == 'docker' ? 'default' : `builder-${process.env.GITHUB_JOB}-${(await buildx.countBuilders()) + 1}`; | ||||
|     core.setOutput('name', builderName); | ||||
|     stateHelper.setBuilderName(builderName); | ||||
|  | ||||
|     if (inputs.driver !== 'docker') { | ||||
|       core.startGroup(`🔨 Creating a new builder instance`); | ||||
|       let createArgs: Array<string> = ['buildx', 'create', '--name', builderName, '--driver', inputs.driver]; | ||||
|       if (semver.satisfies(buildxVersion, '>=0.3.0')) { | ||||
|         let hasImageDriverOpt: boolean = false; | ||||
|         await context.asyncForEach(inputs.driverOpts, async driverOpt => { | ||||
|           if (driverOpt.startsWith('image=')) { | ||||
|             hasImageDriverOpt = true; | ||||
|           } | ||||
|           createArgs.push('--driver-opt', driverOpt); | ||||
|         }); | ||||
|         if (!hasImageDriverOpt) { | ||||
|           //FIXME: Temporary fix (docker/build-push-action#154, docker/build-push-action#162) | ||||
|           createArgs.push('--driver-opt', 'image=moby/buildkit:v0.8-beta'); | ||||
|     if (stateHelper.builderDriver != 'docker' && stateHelper.builderName.length > 0) { | ||||
|       await core.group(`Removing builder`, async () => { | ||||
|         const buildx = new Buildx({standalone: stateHelper.standalone}); | ||||
|         const builder = new Builder({buildx: buildx}); | ||||
|         if (await builder.exists(stateHelper.builderName)) { | ||||
|           const rmCmd = await buildx.getCommand(['rm', stateHelper.builderName]); | ||||
|           await exec | ||||
|             .getExecOutput(rmCmd.command, rmCmd.args, { | ||||
|               ignoreReturnCode: true | ||||
|             }) | ||||
|             .then(res => { | ||||
|               if (res.stderr.length > 0 && res.exitCode != 0) { | ||||
|                 core.warning(res.stderr.trim()); | ||||
|               } | ||||
|             }); | ||||
|         } else { | ||||
|           core.info(`${stateHelper.builderName} does not exist`); | ||||
|         } | ||||
|         if (inputs.buildkitdFlags) { | ||||
|           createArgs.push('--buildkitd-flags', inputs.buildkitdFlags); | ||||
|         } | ||||
|       } | ||||
|       if (inputs.use) { | ||||
|         createArgs.push('--use'); | ||||
|       } | ||||
|       if (inputs.endpoint) { | ||||
|         createArgs.push(inputs.endpoint); | ||||
|       } | ||||
|       await exec.exec('docker', createArgs); | ||||
|       core.endGroup(); | ||||
|  | ||||
|       core.startGroup(`🏃 Booting builder`); | ||||
|       await exec.exec('docker', ['buildx', 'inspect', '--bootstrap']); | ||||
|       core.endGroup(); | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     if (inputs.install) { | ||||
|       core.startGroup(`🤝 Setting buildx as default builder`); | ||||
|       await exec.exec('docker', ['buildx', 'install']); | ||||
|       core.endGroup(); | ||||
|     if (stateHelper.certsDir.length > 0 && fs.existsSync(stateHelper.certsDir)) { | ||||
|       await core.group(`Cleaning up certificates`, async () => { | ||||
|         fs.rmSync(stateHelper.certsDir, {recursive: true}); | ||||
|       }); | ||||
|     } | ||||
|  | ||||
|     core.startGroup(`🛒 Extracting available platforms`); | ||||
|     const platforms = await buildx.platforms(); | ||||
|     core.info(`${platforms}`); | ||||
|     core.setOutput('platforms', platforms); | ||||
|     core.endGroup(); | ||||
|   } catch (error) { | ||||
|     core.setFailed(error.message); | ||||
|   } | ||||
| } | ||||
|  | ||||
| async function cleanup(): Promise<void> { | ||||
|   if (stateHelper.builderName.length == 0) { | ||||
|     return; | ||||
|   } | ||||
|   await mexec.exec('docker', ['buildx', 'rm', `${stateHelper.builderName}`], false).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       core.warning(res.stderr); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
|  | ||||
| if (!stateHelper.IsPost) { | ||||
|   run(); | ||||
| } else { | ||||
|   cleanup(); | ||||
| } | ||||
| ); | ||||
|   | ||||
| @@ -1,12 +1,37 @@ | ||||
| import * as core from '@actions/core'; | ||||
|  | ||||
| export const IsPost = !!process.env['STATE_isPost']; | ||||
| export const IsDebug = !!process.env['STATE_isDebug']; | ||||
| export const standalone = /true/i.test(process.env['STATE_standalone'] || ''); | ||||
| export const builderName = process.env['STATE_builderName'] || ''; | ||||
| export const builderDriver = process.env['STATE_builderDriver'] || ''; | ||||
| export const containerName = process.env['STATE_containerName'] || ''; | ||||
| export const certsDir = process.env['STATE_certsDir'] || ''; | ||||
| export const cleanup = /true/i.test(process.env['STATE_cleanup'] || ''); | ||||
|  | ||||
| export function setDebug(debug: string) { | ||||
|   core.saveState('isDebug', debug); | ||||
| } | ||||
|  | ||||
| export function setStandalone(standalone: boolean) { | ||||
|   core.saveState('standalone', standalone); | ||||
| } | ||||
|  | ||||
| export function setBuilderName(builderName: string) { | ||||
|   core.saveState('builderName', builderName); | ||||
| } | ||||
|  | ||||
| if (!IsPost) { | ||||
|   core.saveState('isPost', 'true'); | ||||
| export function setBuilderDriver(builderDriver: string) { | ||||
|   core.saveState('builderDriver', builderDriver); | ||||
| } | ||||
|  | ||||
| export function setContainerName(containerName: string) { | ||||
|   core.saveState('containerName', containerName); | ||||
| } | ||||
|  | ||||
| export function setCertsDir(certsDir: string) { | ||||
|   core.saveState('certsDir', certsDir); | ||||
| } | ||||
|  | ||||
| export function setCleanup(cleanup: boolean) { | ||||
|   core.saveState('cleanup', cleanup); | ||||
| } | ||||
|   | ||||
| @@ -1,18 +1,21 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     "esModuleInterop": true, | ||||
|     "target": "es6", | ||||
|     "module": "commonjs", | ||||
|     "lib": [ | ||||
|       "es6", | ||||
|       "dom" | ||||
|     ], | ||||
|     "strict": true, | ||||
|     "newLine": "lf", | ||||
|     "outDir": "./lib", | ||||
|     "rootDir": "./src", | ||||
|     "strict": true, | ||||
|     "forceConsistentCasingInFileNames": true, | ||||
|     "noImplicitAny": false, | ||||
|     "esModuleInterop": true, | ||||
|     "sourceMap": true | ||||
|     "resolveJsonModule": true, | ||||
|     "useUnknownInCatchVariables": false, | ||||
|   }, | ||||
|   "exclude": ["node_modules", "**/*.test.ts"] | ||||
|   "exclude": [ | ||||
|     "./__tests__/**/*", | ||||
|     "./lib/**/*", | ||||
|     "node_modules", | ||||
|     "jest.config.ts" | ||||
|   ] | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user