Compare commits
	
		
			56 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 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 | ||
|   | 07b1484797 | ||
|   | 2ec180e24a | ||
|   | 8c8d171420 | ||
|   | 7b1571268a | ||
|   | f9814f80df | ||
|   | 6635284beb | ||
|   | 3e60c35816 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | f5f60fa737 | ||
|   | 43c79af50b | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 0c969bab1f | ||
|   | dc5191ec77 | ||
|   | f9ddc94e27 | ||
|   | 55b445ecbc | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 19625e207e | ||
|   | ba442a71c2 | ||
|   | bd58e36ac7 | 
							
								
								
									
										2
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| /coverage | ||||
| /node_modules | ||||
							
								
								
									
										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. | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								.github/buildkit-container-logs.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								.github/buildkit-container-logs.png
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 13 KiB | 
							
								
								
									
										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: 13 KiB After Width: | Height: | Size: 5.1 KiB | 
							
								
								
									
										166
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										166
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,18 +1,18 @@ | ||||
| name: ci | ||||
|  | ||||
| on: | ||||
|   schedule: | ||||
|     - cron: '0 10 * * *' # everyday at 10am | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/v* | ||||
|     paths-ignore: | ||||
|       - "**.md" | ||||
|       - 'master' | ||||
|       - 'releases/v*' | ||||
|     tags: | ||||
|       - 'v*' | ||||
|   pull_request: | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/v* | ||||
|     paths-ignore: | ||||
|       - "**.md" | ||||
|       - 'master' | ||||
|       - 'releases/v*' | ||||
|  | ||||
| jobs: | ||||
|   main: | ||||
| @@ -22,12 +22,12 @@ jobs: | ||||
|       matrix: | ||||
|         buildx-version: | ||||
|           - latest | ||||
|           - v0.2.2 | ||||
|           - v0.4.1 | ||||
|           - "" | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.3 | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
| @@ -35,11 +35,13 @@ 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: Inspect builder | ||||
|         run: | | ||||
|           echo "Name:      ${{ steps.buildx.outputs.name }}" | ||||
|           echo "Endpoint:  ${{ steps.buildx.outputs.endpoint }}" | ||||
|           echo "Status:    ${{ steps.buildx.outputs.status }}" | ||||
|           echo "Flags:     ${{ steps.buildx.outputs.flags }}" | ||||
|           echo "Platforms: ${{ steps.buildx.outputs.platforms }}" | ||||
|       - | ||||
|         name: Dump context | ||||
|         uses: crazy-max/ghaction-dump-context@v1 | ||||
| @@ -49,28 +51,94 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.3 | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Set up Docker Buildx 1 | ||||
|         id: buildx1 | ||||
|         uses: ./ | ||||
|       - | ||||
|         name: Builder 1 instance name | ||||
|         run: echo ${{ steps.buildx1.outputs.name }} | ||||
|         name: Inspect builder 1 | ||||
|         run: | | ||||
|           echo "Name:      ${{ steps.buildx1.outputs.name }}" | ||||
|           echo "Endpoint:  ${{ steps.buildx1.outputs.endpoint }}" | ||||
|           echo "Status:    ${{ steps.buildx1.outputs.status }}" | ||||
|           echo "Flags:     ${{ steps.buildx1.outputs.flags }}" | ||||
|           echo "Platforms: ${{ steps.buildx1.outputs.platforms }}" | ||||
|       - | ||||
|         name: Set up Docker Buildx 2 | ||||
|         id: buildx2 | ||||
|         uses: ./ | ||||
|       - | ||||
|         name: Builder 2 instance name | ||||
|         run: echo ${{ steps.buildx2.outputs.name }} | ||||
|         name: Inspect builder 2 | ||||
|         run: | | ||||
|           echo "Name:      ${{ steps.buildx2.outputs.name }}" | ||||
|           echo "Endpoint:  ${{ steps.buildx2.outputs.endpoint }}" | ||||
|           echo "Status:    ${{ steps.buildx2.outputs.status }}" | ||||
|           echo "Flags:     ${{ steps.buildx2.outputs.flags }}" | ||||
|           echo "Platforms: ${{ steps.buildx2.outputs.platforms }}" | ||||
|  | ||||
|   error: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Stop docker | ||||
|         run: | | ||||
|           sudo systemctl stop docker | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
|         continue-on-error: true | ||||
|         uses: ./ | ||||
|       - | ||||
|         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@v1 | ||||
|  | ||||
|   debug: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Create Dockerfile | ||||
|         run: | | ||||
|           cat > ./Dockerfile <<EOL | ||||
|           FROM alpine | ||||
|           RUN uname -a | ||||
|           EOL | ||||
|       - | ||||
|         name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v1 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|         with: | ||||
|           buildkitd-flags: --debug | ||||
|       - | ||||
|         name: Build | ||||
|         uses: docker/build-push-action@v2 | ||||
|         with: | ||||
|           context: . | ||||
|           platforms: linux/amd64,linux/arm64,linux/ppc64le | ||||
|  | ||||
|   install: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.3 | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
| @@ -92,7 +160,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.3 | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
| @@ -115,7 +183,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.3 | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
| @@ -128,7 +196,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.3 | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
| @@ -161,7 +229,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.3 | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Create context | ||||
|         run: | | ||||
| @@ -176,6 +244,38 @@ jobs: | ||||
|         with: | ||||
|           endpoint: mycontext | ||||
|  | ||||
|   config: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         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@v2 | ||||
|         with: | ||||
|           context: . | ||||
|  | ||||
|   with-qemu: | ||||
|     runs-on: ubuntu-latest | ||||
|     strategy: | ||||
| @@ -183,7 +283,7 @@ jobs: | ||||
|       matrix: | ||||
|         buildx-version: | ||||
|           - latest | ||||
|           - v0.2.2 | ||||
|           - v0.4.1 | ||||
|           - "" | ||||
|         qemu-platforms: | ||||
|           - all | ||||
| @@ -191,7 +291,7 @@ jobs: | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.3 | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v1 | ||||
| @@ -204,8 +304,10 @@ jobs: | ||||
|         with: | ||||
|           version: ${{ matrix.buildx-version }} | ||||
|       - | ||||
|         name: Available platforms | ||||
|         run: echo ${{ steps.buildx.outputs.platforms }} | ||||
|       - | ||||
|         name: Builder instance name | ||||
|         run: echo ${{ steps.buildx.outputs.name }} | ||||
|         name: Inspect builder | ||||
|         run: | | ||||
|           echo "Name:      ${{ steps.buildx.outputs.name }}" | ||||
|           echo "Endpoint:  ${{ steps.buildx.outputs.endpoint }}" | ||||
|           echo "Status:    ${{ steps.buildx.outputs.status }}" | ||||
|           echo "Flags:     ${{ steps.buildx.outputs.flags }}" | ||||
|           echo "Platforms: ${{ steps.buildx.outputs.platforms }}" | ||||
|   | ||||
							
								
								
									
										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.3.3 | ||||
|       - | ||||
|         name: Run Labeler | ||||
|         uses: crazy-max/ghaction-github-labeler@v3.1.0 | ||||
							
								
								
									
										43
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @@ -3,44 +3,35 @@ name: test | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - master | ||||
|       - releases/v* | ||||
|     paths-ignore: | ||||
|       - "**.md" | ||||
|       - 'master' | ||||
|       - 'releases/v*' | ||||
|   pull_request: | ||||
|     paths-ignore: | ||||
|       - "**.md" | ||||
|     branches: | ||||
|       - 'master' | ||||
|       - 'releases/v*' | ||||
|  | ||||
| jobs: | ||||
|   test-containerized: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2.3.3 | ||||
|       - | ||||
|         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.3.3 | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Install | ||||
|         run: yarn install | ||||
|         name: Validate | ||||
|         uses: docker/bake-action@v1 | ||||
|         with: | ||||
|           targets: validate | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: ./ | ||||
|       - | ||||
|         name: Test | ||||
|         run: yarn run test | ||||
|         uses: docker/bake-action@v1 | ||||
|         with: | ||||
|           targets: test | ||||
|       - | ||||
|         name: Upload coverage | ||||
|         uses: codecov/codecov-action@v1.0.13 | ||||
|         if: success() | ||||
|         uses: codecov/codecov-action@v1 | ||||
|         with: | ||||
|           token: ${{ secrets.CODECOV_TOKEN }} | ||||
|           file: ./coverage/clover.xml | ||||
|   | ||||
							
								
								
									
										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"] | ||||
							
								
								
									
										67
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										67
									
								
								README.md
									
									
									
									
									
								
							| @@ -8,10 +8,10 @@ | ||||
|  | ||||
| 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](https://github.com/docker/buildx). By default, the `docker-container` [builder driver](https://github.com/docker/buildx/blob/master/docs/reference/buildx_create.md#driver) | ||||
| will be used to be able to build multi-platform images and export cache thanks to the [BuildKit](https://github.com/moby/buildkit) | ||||
| container. | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -25,8 +25,9 @@ ___ | ||||
|   * [inputs](#inputs) | ||||
|   * [outputs](#outputs) | ||||
|   * [environment variables](#environment-variables) | ||||
| * [Notes](#notes) | ||||
|   * [BuildKit container logs](#buildkit-container-logs) | ||||
| * [Keep up-to-date with GitHub Dependabot](#keep-up-to-date-with-github-dependabot) | ||||
| * [Limitation](#limitation) | ||||
|  | ||||
| ## Usage | ||||
|  | ||||
| @@ -49,14 +50,14 @@ jobs: | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
|         uses: docker/setup-buildx-action@v1 | ||||
|         with: | ||||
|           version: latest | ||||
|       - | ||||
|         name: Builder instance name | ||||
|         run: echo ${{ steps.buildx.outputs.name }} | ||||
|       - | ||||
|         name: Available platforms | ||||
|         run: echo ${{ steps.buildx.outputs.platforms }} | ||||
|         name: Inspect builder | ||||
|         run: | | ||||
|           echo "Name:      ${{ steps.buildx.outputs.name }}" | ||||
|           echo "Endpoint:  ${{ steps.buildx.outputs.endpoint }}" | ||||
|           echo "Status:    ${{ steps.buildx.outputs.status }}" | ||||
|           echo "Flags:     ${{ steps.buildx.outputs.flags }}" | ||||
|           echo "Platforms: ${{ steps.buildx.outputs.platforms }}" | ||||
| ``` | ||||
|  | ||||
| ### With QEMU | ||||
| @@ -79,14 +80,10 @@ jobs: | ||||
|       - | ||||
|         name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v1 | ||||
|         with: | ||||
|           platforms: all | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         id: buildx | ||||
|         uses: docker/setup-buildx-action@v1 | ||||
|         with: | ||||
|           version: latest | ||||
|       - | ||||
|         name: Available platforms | ||||
|         run: echo ${{ steps.buildx.outputs.platforms }} | ||||
| @@ -129,12 +126,13 @@ 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`) | | ||||
| | `driver`           | String  | Sets the [builder driver](https://github.com/docker/buildx/blob/master/docs/reference/buildx_create.md#driver) to be used (default `docker-container`) | | ||||
| | `driver-opts`      | CSV     | List of additional [driver-specific options](https://github.com/docker/buildx/blob/master/docs/reference/buildx_create.md#driver-opt) (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` | | ||||
| | `endpoint`         | String  | [Optional address for docker socket](https://github.com/docker/buildx/blob/master/docs/reference/buildx_create.md#description) or context from `docker context ls` | | ||||
| | `config`           | String  | [BuildKit config file](https://github.com/docker/buildx/blob/master/docs/reference/buildx_create.md#config) | | ||||
|  | ||||
| > `CSV` type must be a newline-delimited string | ||||
| > ```yaml | ||||
| @@ -152,8 +150,12 @@ Following outputs are available | ||||
|  | ||||
| | Name          | Type    | Description                           | | ||||
| |---------------|---------|---------------------------------------| | ||||
| | `name`        | String  | Builder instance name | | ||||
| | `platforms`   | String  | Available platforms (comma separated) | | ||||
| | `name`        | String  | Builder name | | ||||
| | `driver`      | String  | Builder driver | | ||||
| | `endpoint`    | String  | Builder node endpoint | | ||||
| | `status`      | String  | Builder node status | | ||||
| | `flags`       | String  | Builder node flags (if applicable) | | ||||
| | `platforms`   | String  | Builder node platforms available (comma separated) | | ||||
|  | ||||
| ### environment variables | ||||
|  | ||||
| @@ -163,6 +165,25 @@ The following [official docker environment variables](https://docs.docker.com/en | ||||
| |-----------------|---------|-------------|-------------------------------------------------| | ||||
| | `DOCKER_CONFIG` | String  | `~/.docker` | The location of your client configuration files | | ||||
|  | ||||
| ## Notes | ||||
|  | ||||
| ### BuildKit container logs | ||||
|  | ||||
| To display BuildKit container logs (when `docker-container` driver is used) you have to [enable step debug logging](https://docs.github.com/en/actions/managing-workflow-runs/enabling-debug-logging#enabling-step-debug-logging) | ||||
| or you can also enable debugging in the [setup-buildx action step](https://github.com/docker/setup-buildx-action): | ||||
|  | ||||
| ```yaml | ||||
|   - | ||||
|     name: Set up Docker Buildx | ||||
|     uses: docker/setup-buildx-action@v1 | ||||
|     with: | ||||
|       buildkitd-flags: --debug | ||||
| ``` | ||||
|  | ||||
| Logs will be available at the end of a job: | ||||
|  | ||||
|  | ||||
|  | ||||
| ## Keep up-to-date with GitHub Dependabot | ||||
|  | ||||
| Since [Dependabot](https://docs.github.com/en/github/administering-a-repository/keeping-your-actions-up-to-date-with-github-dependabot) | ||||
| @@ -178,7 +199,3 @@ updates: | ||||
|     schedule: | ||||
|       interval: "daily" | ||||
| ``` | ||||
|  | ||||
| ## Limitation | ||||
|  | ||||
| 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). | ||||
|   | ||||
| @@ -25,34 +25,28 @@ describe('parseVersion', () => { | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| describe('platforms', () => { | ||||
| describe('inspect', () => { | ||||
|   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(''); | ||||
|       const builder = await buildx.inspect(''); | ||||
|       console.log('builder', builder); | ||||
|       expect(builder).not.toBeUndefined(); | ||||
|       expect(builder.name).not.toEqual(''); | ||||
|       expect(builder.driver).not.toEqual(''); | ||||
|       expect(builder.node_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); | ||||
|   it('acquires v0.4.1 version of buildx', async () => { | ||||
|     const buildxBin = await buildx.install('v0.4.1', tmpDir); | ||||
|     console.log(buildxBin); | ||||
|     expect(fs.existsSync(buildxBin)).toBe(true); | ||||
|   }, 100000); | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| import * as os from 'os'; | ||||
| import * as context from '../src/context'; | ||||
|  | ||||
| describe('getInputList', () => { | ||||
| @@ -78,6 +79,27 @@ describe('asyncForEach', () => { | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| describe('setOutput', () => { | ||||
|   beforeEach(() => { | ||||
|     process.stdout.write = jest.fn(); | ||||
|   }); | ||||
|  | ||||
|   it('setOutput produces the correct command', () => { | ||||
|     context.setOutput('some output', 'some value'); | ||||
|     assertWriteCalls([`::set-output name=some output::some value${os.EOL}`]); | ||||
|   }); | ||||
|  | ||||
|   it('setOutput handles bools', () => { | ||||
|     context.setOutput('some output', false); | ||||
|     assertWriteCalls([`::set-output name=some output::false${os.EOL}`]); | ||||
|   }); | ||||
|  | ||||
|   it('setOutput handles numbers', () => { | ||||
|     context.setOutput('some output', 1.01); | ||||
|     assertWriteCalls([`::set-output name=some output::1.01${os.EOL}`]); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| // See: https://github.com/actions/toolkit/blob/master/packages/core/src/core.ts#L67 | ||||
| function getInputName(name: string): string { | ||||
|   return `INPUT_${name.replace(/ /g, '_').toUpperCase()}`; | ||||
| @@ -86,3 +108,11 @@ function getInputName(name: string): string { | ||||
| function setInput(name: string, value: string): void { | ||||
|   process.env[getInputName(name)] = value; | ||||
| } | ||||
|  | ||||
| // Assert that process.stdout.write calls called only with the given arguments. | ||||
| function assertWriteCalls(calls: string[]): void { | ||||
|   expect(process.stdout.write).toHaveBeenCalledTimes(calls.length); | ||||
|   for (let i = 0; i < calls.length; i++) { | ||||
|     expect(process.stdout.write).toHaveBeenNthCalledWith(i + 1, calls[i]); | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										15
									
								
								action.yml
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								action.yml
									
									
									
									
									
								
							| @@ -32,12 +32,23 @@ inputs: | ||||
|   endpoint: | ||||
|     description: 'Optional address for docker socket or context from `docker context ls`' | ||||
|     required: false | ||||
|   config: | ||||
|     description: 'BuildKit config file' | ||||
|     required: false | ||||
|  | ||||
| outputs: | ||||
|   name: | ||||
|     description: 'Builder instance name' | ||||
|     description: 'Builder name' | ||||
|   driver: | ||||
|     description: 'Builder driver' | ||||
|   endpoint: | ||||
|     description: 'Builder node endpoint' | ||||
|   status: | ||||
|     description: 'Builder node status' | ||||
|   flags: | ||||
|     description: 'Builder node flags (if applicable)' | ||||
|   platforms: | ||||
|     description: 'Available platforms (comma separated)' | ||||
|     description: 'Builder node platforms available (comma separated)' | ||||
|  | ||||
| runs: | ||||
|   using: 'node12' | ||||
|   | ||||
							
								
								
									
										2022
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2022
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,42 +1,67 @@ | ||||
| variable "NODE_VERSION" { | ||||
|   default = "12" | ||||
| } | ||||
|  | ||||
| target "node-version" { | ||||
|   args = { | ||||
|     NODE_VERSION = NODE_VERSION | ||||
|   } | ||||
| } | ||||
|  | ||||
| group "default" { | ||||
|   targets = ["build"] | ||||
| } | ||||
|  | ||||
| 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 = ["format-validate", "build-validate", "vendor-validate"] | ||||
| } | ||||
|  | ||||
| target "build" { | ||||
|   target = "dist" | ||||
|   inherits = ["node-version"] | ||||
|   dockerfile = "./hack/build.Dockerfile" | ||||
|   target = "build-update" | ||||
|   output = ["."] | ||||
| } | ||||
|  | ||||
| target "test" { | ||||
|   target = "test" | ||||
| target "build-validate" { | ||||
|   inherits = ["node-version"] | ||||
|   dockerfile = "./hack/build.Dockerfile" | ||||
|   target = "build-validate" | ||||
| } | ||||
|  | ||||
| target "format" { | ||||
|   target = "format" | ||||
|   inherits = ["node-version"] | ||||
|   dockerfile = "./hack/build.Dockerfile" | ||||
|   target = "format-update" | ||||
|   output = ["."] | ||||
| } | ||||
|  | ||||
| target "validate-format" { | ||||
|   target = "validate-format" | ||||
| target "format-validate" { | ||||
|   inherits = ["node-version"] | ||||
|   dockerfile = "./hack/build.Dockerfile" | ||||
|   target = "format-validate" | ||||
| } | ||||
|  | ||||
| target "validate-build" { | ||||
|   target = "validate-build" | ||||
| target "vendor-update" { | ||||
|   inherits = ["node-version"] | ||||
|   dockerfile = "./hack/vendor.Dockerfile" | ||||
|   target = "update" | ||||
|   output = ["."] | ||||
| } | ||||
|  | ||||
| target "validate-yarn" { | ||||
| 	target = "validate-yarn" | ||||
| } | ||||
| target "vendor-validate" { | ||||
|   inherits = ["node-version"] | ||||
|   dockerfile = "./hack/vendor.Dockerfile" | ||||
|   target = "validate" | ||||
| } | ||||
|  | ||||
| target "test" { | ||||
|   inherits = ["node-version"] | ||||
|   dockerfile = "./hack/test.Dockerfile" | ||||
|   target = "test-coverage" | ||||
|   output = ["./coverage"] | ||||
| } | ||||
|   | ||||
							
								
								
									
										42
									
								
								hack/build.Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								hack/build.Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| # syntax=docker/dockerfile:1.2 | ||||
| ARG NODE_VERSION | ||||
|  | ||||
| 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 | ||||
|  | ||||
| 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 \ | ||||
|   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 | ||||
|  | ||||
| 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 format-validate | ||||
| RUN --mount=type=bind,target=.,rw \ | ||||
|   --mount=type=cache,target=/src/node_modules \ | ||||
|   yarn run format-check \ | ||||
| @@ -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) | ||||
							
								
								
									
										23
									
								
								hack/test.Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								hack/test.Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| # syntax=docker/dockerfile:1.2 | ||||
| ARG NODE_VERSION | ||||
|  | ||||
| FROM node:${NODE_VERSION}-alpine AS base | ||||
| RUN apk add --no-cache git | ||||
| WORKDIR /src | ||||
|  | ||||
| FROM base AS deps | ||||
| RUN --mount=type=bind,target=.,rw \ | ||||
|   --mount=type=cache,target=/src/node_modules \ | ||||
|   yarn install | ||||
|  | ||||
| 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=crazymax/docker,source=/usr/libexec/docker/cli-plugins/docker-buildx,target=/usr/libexec/docker/cli-plugins/docker-buildx \ | ||||
|   --mount=type=bind,from=crazymax/docker,source=/usr/local/bin/docker,target=/usr/bin/docker \ | ||||
|   yarn run test --coverageDirectory=/tmp/coverage | ||||
|  | ||||
| FROM scratch AS test-coverage | ||||
| COPY --from=test /tmp/coverage / | ||||
							
								
								
									
										23
									
								
								hack/vendor.Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								hack/vendor.Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| # syntax=docker/dockerfile:1.2 | ||||
| ARG NODE_VERSION | ||||
|  | ||||
| FROM node:${NODE_VERSION}-alpine AS base | ||||
| RUN apk add --no-cache git | ||||
| WORKDIR /src | ||||
|  | ||||
| FROM base AS vendored | ||||
| RUN --mount=type=bind,target=.,rw \ | ||||
|   --mount=type=cache,target=/src/node_modules \ | ||||
|   yarn install && mkdir /out && cp yarn.lock /out | ||||
|  | ||||
| FROM scratch AS update | ||||
| COPY --from=vendored /out / | ||||
|  | ||||
| FROM vendored AS validate | ||||
| RUN --mount=type=bind,target=.,rw \ | ||||
|   git add -A && cp -rf /out/* .; \ | ||||
|   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 | ||||
| @@ -27,11 +27,12 @@ | ||||
|   ], | ||||
|   "license": "Apache-2.0", | ||||
|   "dependencies": { | ||||
|     "@actions/core": "^1.2.6", | ||||
|     "@actions/core": "^1.2.7", | ||||
|     "@actions/exec": "^1.0.4", | ||||
|     "@actions/http-client": "^1.0.8", | ||||
|     "@actions/tool-cache": "^1.5.5", | ||||
|     "semver": "^7.3.2" | ||||
|     "@actions/http-client": "^1.0.11", | ||||
|     "@actions/tool-cache": "^1.6.1", | ||||
|     "semver": "^7.3.5", | ||||
|     "uuid": "^8.3.2" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/jest": "^26.0.3", | ||||
|   | ||||
| @@ -8,6 +8,16 @@ import * as github from './github'; | ||||
| import * as core from '@actions/core'; | ||||
| import * as tc from '@actions/tool-cache'; | ||||
|  | ||||
| export type Builder = { | ||||
|   name?: string; | ||||
|   driver?: string; | ||||
|   node_name?: string; | ||||
|   node_endpoint?: string; | ||||
|   node_status?: string; | ||||
|   node_flags?: string; | ||||
|   node_platforms?: string; | ||||
| }; | ||||
|  | ||||
| export async function getVersion(): Promise<string> { | ||||
|   return await exec.exec(`docker`, ['buildx', 'version'], true).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
| @@ -34,25 +44,50 @@ export async function isAvailable(): Promise<Boolean> { | ||||
|   }); | ||||
| } | ||||
|  | ||||
| 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 => { | ||||
| export async function inspect(name: string): Promise<Builder> { | ||||
|   return await exec.exec(`docker`, ['buildx', 'inspect', name], 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(); | ||||
|     const builder: Builder = {}; | ||||
|     itlines: for (const line of res.stdout.trim().split(`\n`)) { | ||||
|       const [key, ...rest] = line.split(':'); | ||||
|       const value = rest.map(v => v.trim()).join(':'); | ||||
|       if (key.length == 0 || value.length == 0) { | ||||
|         continue; | ||||
|       } | ||||
|       switch (key) { | ||||
|         case 'Name': { | ||||
|           if (builder.name == undefined) { | ||||
|             builder.name = value; | ||||
|           } else { | ||||
|             builder.node_name = value; | ||||
|           } | ||||
|           break; | ||||
|         } | ||||
|         case 'Driver': { | ||||
|           builder.driver = value; | ||||
|           break; | ||||
|         } | ||||
|         case 'Endpoint': { | ||||
|           builder.node_endpoint = value; | ||||
|           break; | ||||
|         } | ||||
|         case 'Status': { | ||||
|           builder.node_status = value; | ||||
|           break; | ||||
|         } | ||||
|         case 'Flags': { | ||||
|           builder.node_flags = value; | ||||
|           break; | ||||
|         } | ||||
|         case 'Platforms': { | ||||
|           builder.node_platforms = value.replace(/\s/g, ''); | ||||
|           break itlines; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     return builder; | ||||
|   }); | ||||
| } | ||||
|  | ||||
| @@ -61,7 +96,7 @@ export async function install(inputVersion: string, dockerConfigHome: string): P | ||||
|   if (!release) { | ||||
|     throw new Error(`Cannot find buildx ${inputVersion} release`); | ||||
|   } | ||||
|   core.debug(`Release found: ${release.tag_name}`); | ||||
|   core.debug(`Release ${release.tag_name} found`); | ||||
|   const version = release.tag_name.replace(/^v+|v+$/g, ''); | ||||
|  | ||||
|   let toolPath: string; | ||||
| @@ -85,7 +120,7 @@ export async function install(inputVersion: string, dockerConfigHome: string): P | ||||
|   core.debug(`Plugin path is ${pluginPath}`); | ||||
|   fs.copyFileSync(path.join(toolPath, filename), pluginPath); | ||||
|  | ||||
|   core.info('🔨 Fixing perms...'); | ||||
|   core.info('Fixing perms'); | ||||
|   fs.chmodSync(pluginPath, '0755'); | ||||
|  | ||||
|   return pluginPath; | ||||
| @@ -101,7 +136,7 @@ async function download(version: string): Promise<string> { | ||||
|   let downloadPath: string; | ||||
|  | ||||
|   try { | ||||
|     core.info(`⬇️ Downloading ${downloadUrl}...`); | ||||
|     core.info(`Downloading ${downloadUrl}`); | ||||
|     downloadPath = await tc.downloadTool(downloadUrl); | ||||
|     core.debug(`Downloaded to ${downloadPath}`); | ||||
|   } catch (error) { | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| import * as os from 'os'; | ||||
| import * as core from '@actions/core'; | ||||
| import {issueCommand} from '@actions/core/lib/command'; | ||||
|  | ||||
| export const osPlat: string = os.platform(); | ||||
| export const osArch: string = os.arch(); | ||||
| @@ -12,6 +13,7 @@ export interface Inputs { | ||||
|   install: boolean; | ||||
|   use: boolean; | ||||
|   endpoint: string; | ||||
|   config: string; | ||||
| } | ||||
|  | ||||
| export async function getInputs(): Promise<Inputs> { | ||||
| @@ -24,7 +26,8 @@ export async function getInputs(): Promise<Inputs> { | ||||
|       '--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') | ||||
|     endpoint: core.getInput('endpoint'), | ||||
|     config: core.getInput('config') | ||||
|   }; | ||||
| } | ||||
|  | ||||
| @@ -47,3 +50,8 @@ export const asyncForEach = async (array, callback) => { | ||||
|     await callback(array[index], index, array); | ||||
|   } | ||||
| }; | ||||
|  | ||||
| // FIXME: Temp fix https://github.com/actions/toolkit/issues/777 | ||||
| export function setOutput(name: string, value: any): void { | ||||
|   issueCommand('set-output', {name}, value); | ||||
| } | ||||
|   | ||||
							
								
								
									
										88
									
								
								src/main.ts
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								src/main.ts
									
									
									
									
									
								
							| @@ -10,41 +10,34 @@ import * as stateHelper from './state-helper'; | ||||
|  | ||||
| async function run(): Promise<void> { | ||||
|   try { | ||||
|     if (os.platform() !== 'linux') { | ||||
|       core.setFailed('Only supported on linux platform'); | ||||
|       return; | ||||
|     } | ||||
|     core.startGroup(`Docker info`); | ||||
|     await exec.exec('docker', ['version']); | ||||
|     await exec.exec('docker', ['info']); | ||||
|     core.endGroup(); | ||||
|  | ||||
|     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}`); | ||||
|     core.info(`Using buildx ${buildxVersion}`); | ||||
|  | ||||
|     const builderName: string = | ||||
|       inputs.driver == 'docker' ? 'default' : `builder-${process.env.GITHUB_JOB}-${(await buildx.countBuilders()) + 1}`; | ||||
|     core.setOutput('name', builderName); | ||||
|     const builderName: string = inputs.driver == 'docker' ? 'default' : `builder-${require('uuid').v4()}`; | ||||
|     context.setOutput('name', builderName); | ||||
|     stateHelper.setBuilderName(builderName); | ||||
|  | ||||
|     if (inputs.driver !== 'docker') { | ||||
|       core.info('🔨 Creating a new builder instance...'); | ||||
|       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 (inputs.buildkitdFlags) { | ||||
|           createArgs.push('--buildkitd-flags', inputs.buildkitdFlags); | ||||
|         } | ||||
| @@ -55,35 +48,68 @@ async function run(): Promise<void> { | ||||
|       if (inputs.endpoint) { | ||||
|         createArgs.push(inputs.endpoint); | ||||
|       } | ||||
|       if (inputs.config) { | ||||
|         createArgs.push('--config', inputs.config); | ||||
|       } | ||||
|       await exec.exec('docker', createArgs); | ||||
|       core.endGroup(); | ||||
|  | ||||
|       core.info('🏃 Booting builder...'); | ||||
|       await exec.exec('docker', ['buildx', 'inspect', '--bootstrap']); | ||||
|       core.startGroup(`Booting builder`); | ||||
|       let bootstrapArgs: Array<string> = ['buildx', 'inspect', '--bootstrap']; | ||||
|       if (semver.satisfies(buildxVersion, '>=0.4.0')) { | ||||
|         bootstrapArgs.push('--builder', builderName); | ||||
|       } | ||||
|       await exec.exec('docker', bootstrapArgs); | ||||
|       core.endGroup(); | ||||
|     } | ||||
|  | ||||
|     if (inputs.install) { | ||||
|       core.info('🤝 Setting buildx as default builder...'); | ||||
|       core.startGroup(`Setting buildx as default builder`); | ||||
|       await exec.exec('docker', ['buildx', 'install']); | ||||
|       core.endGroup(); | ||||
|     } | ||||
|  | ||||
|     core.info('🛒 Extracting available platforms...'); | ||||
|     const platforms = await buildx.platforms(); | ||||
|     core.info(`${platforms}`); | ||||
|     core.setOutput('platforms', platforms); | ||||
|     core.startGroup(`Inspect builder`); | ||||
|     const builder = await buildx.inspect(builderName); | ||||
|     core.info(JSON.stringify(builder, undefined, 2)); | ||||
|     context.setOutput('driver', builder.driver); | ||||
|     context.setOutput('endpoint', builder.node_endpoint); | ||||
|     context.setOutput('status', builder.node_status); | ||||
|     context.setOutput('flags', builder.node_flags); | ||||
|     context.setOutput('platforms', builder.node_platforms); | ||||
|     core.endGroup(); | ||||
|  | ||||
|     if (inputs.driver == 'docker-container') { | ||||
|       stateHelper.setContainerName(`buildx_buildkit_${builder.node_name}`); | ||||
|     } | ||||
|     if (core.isDebug() || builder.node_flags?.includes('--debug')) { | ||||
|       stateHelper.setDebug('true'); | ||||
|     } | ||||
|   } catch (error) { | ||||
|     core.setFailed(error.message); | ||||
|   } | ||||
| } | ||||
|  | ||||
| async function cleanup(): Promise<void> { | ||||
|   if (stateHelper.builderName.length == 0) { | ||||
|     return; | ||||
|   if (stateHelper.IsDebug && stateHelper.containerName.length > 0) { | ||||
|     core.startGroup(`BuildKit container logs`); | ||||
|     await mexec.exec('docker', ['logs', `${stateHelper.containerName}`], false).then(res => { | ||||
|       if (res.stderr != '' && !res.success) { | ||||
|         core.warning(res.stderr); | ||||
|       } | ||||
|     }); | ||||
|     core.endGroup(); | ||||
|   } | ||||
|  | ||||
|   if (stateHelper.builderName.length > 0) { | ||||
|     core.startGroup(`Removing builder`); | ||||
|     await mexec.exec('docker', ['buildx', 'rm', `${stateHelper.builderName}`], false).then(res => { | ||||
|       if (res.stderr != '' && !res.success) { | ||||
|         core.warning(res.stderr); | ||||
|       } | ||||
|     }); | ||||
|     core.endGroup(); | ||||
|   } | ||||
|   await mexec.exec('docker', ['buildx', 'rm', `${stateHelper.builderName}`], false).then(res => { | ||||
|     if (res.stderr != '' && !res.success) { | ||||
|       core.warning(res.stderr); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
|  | ||||
| if (!stateHelper.IsPost) { | ||||
|   | ||||
| @@ -1,12 +1,22 @@ | ||||
| import * as core from '@actions/core'; | ||||
|  | ||||
| export const IsPost = !!process.env['STATE_isPost']; | ||||
| export const IsDebug = !!process.env['STATE_isDebug']; | ||||
| export const builderName = process.env['STATE_builderName'] || ''; | ||||
| export const containerName = process.env['STATE_containerName'] || ''; | ||||
|  | ||||
| export function setDebug(debug: string) { | ||||
|   core.saveState('isDebug', debug); | ||||
| } | ||||
|  | ||||
| export function setBuilderName(builderName: string) { | ||||
|   core.saveState('builderName', builderName); | ||||
| } | ||||
|  | ||||
| export function setContainerName(containerName: string) { | ||||
|   core.saveState('containerName', containerName); | ||||
| } | ||||
|  | ||||
| if (!IsPost) { | ||||
|   core.saveState('isPost', 'true'); | ||||
| } | ||||
|   | ||||
							
								
								
									
										53
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								yarn.lock
									
									
									
									
									
								
							| @@ -2,10 +2,10 @@ | ||||
| # yarn lockfile v1 | ||||
|  | ||||
|  | ||||
| "@actions/core@^1.2.3", "@actions/core@^1.2.6": | ||||
|   version "1.2.6" | ||||
|   resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.6.tgz#a78d49f41a4def18e88ce47c2cac615d5694bf09" | ||||
|   integrity sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA== | ||||
| "@actions/core@^1.2.6", "@actions/core@^1.2.7": | ||||
|   version "1.2.7" | ||||
|   resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.7.tgz#594f8c45b213f0146e4be7eda8ae5cf4e198e5ab" | ||||
|   integrity sha512-kzLFD5BgEvq6ubcxdgPbRKGD2Qrgya/5j+wh4LZzqT915I0V3rED+MvjH6NXghbvk1MXknpNNQ3uKjXSEN00Ig== | ||||
|  | ||||
| "@actions/exec@^1.0.0", "@actions/exec@^1.0.4": | ||||
|   version "1.0.4" | ||||
| @@ -14,10 +14,10 @@ | ||||
|   dependencies: | ||||
|     "@actions/io" "^1.0.1" | ||||
|  | ||||
| "@actions/http-client@^1.0.8": | ||||
|   version "1.0.8" | ||||
|   resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-1.0.8.tgz#8bd76e8eca89dc8bcf619aa128eba85f7a39af45" | ||||
|   integrity sha512-G4JjJ6f9Hb3Zvejj+ewLLKLf99ZC+9v+yCxoYf9vSyH+WkzPLB2LuUtRMGNkooMqdugGBFStIKXOuvH1W+EctA== | ||||
| "@actions/http-client@^1.0.11", "@actions/http-client@^1.0.8": | ||||
|   version "1.0.11" | ||||
|   resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-1.0.11.tgz#c58b12e9aa8b159ee39e7dd6cbd0e91d905633c0" | ||||
|   integrity sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg== | ||||
|   dependencies: | ||||
|     tunnel "0.0.6" | ||||
|  | ||||
| @@ -26,12 +26,12 @@ | ||||
|   resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.0.2.tgz#2f614b6e69ce14d191180451eb38e6576a6e6b27" | ||||
|   integrity sha512-J8KuFqVPr3p6U8W93DOXlXW6zFvrQAJANdS+vw0YhusLIq+bszW8zmK2Fh1C2kDPX8FMvwIl1OUcFgvJoXLbAg== | ||||
|  | ||||
| "@actions/tool-cache@^1.5.5": | ||||
|   version "1.6.0" | ||||
|   resolved "https://registry.yarnpkg.com/@actions/tool-cache/-/tool-cache-1.6.0.tgz#5b425db2d642df65dd0d6bcec0d84dcdbca3f80d" | ||||
|   integrity sha512-+fyEBImPD3m5I0o6DflCO0NHY180LPoX8Lo6y4Iez+V17kO8kfkH0VHxb8mUdmD6hn9dWA9Ch1JA20fXoIYUeQ== | ||||
| "@actions/tool-cache@^1.6.1": | ||||
|   version "1.6.1" | ||||
|   resolved "https://registry.yarnpkg.com/@actions/tool-cache/-/tool-cache-1.6.1.tgz#5e199f7bfd9863eb2b0d467cd70751ef8042ec40" | ||||
|   integrity sha512-F+vwEDwfqcHMKuSkj79pihOnsAMv23EkG76nMpc82UsnXwyQdyEsktGxrB0SNtm7pRqTXEIOoAPTgrSQclXYTg== | ||||
|   dependencies: | ||||
|     "@actions/core" "^1.2.3" | ||||
|     "@actions/core" "^1.2.6" | ||||
|     "@actions/exec" "^1.0.0" | ||||
|     "@actions/http-client" "^1.0.8" | ||||
|     "@actions/io" "^1.0.1" | ||||
| @@ -2490,6 +2490,13 @@ lru-cache@^4.1.5: | ||||
|     pseudomap "^1.0.2" | ||||
|     yallist "^2.1.2" | ||||
|  | ||||
| lru-cache@^6.0.0: | ||||
|   version "6.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" | ||||
|   integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== | ||||
|   dependencies: | ||||
|     yallist "^4.0.0" | ||||
|  | ||||
| make-dir@^3.0.0: | ||||
|   version "3.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" | ||||
| @@ -3107,10 +3114,12 @@ saxes@^5.0.0: | ||||
|   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" | ||||
|   integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== | ||||
|  | ||||
| semver@7.x, semver@^7.3.2: | ||||
|   version "7.3.2" | ||||
|   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" | ||||
|   integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== | ||||
| semver@7.x, semver@^7.3.2, semver@^7.3.5: | ||||
|   version "7.3.5" | ||||
|   resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" | ||||
|   integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== | ||||
|   dependencies: | ||||
|     lru-cache "^6.0.0" | ||||
|  | ||||
| semver@^6.0.0, semver@^6.1.0, semver@^6.3.0: | ||||
|   version "6.3.0" | ||||
| @@ -3602,6 +3611,11 @@ uuid@^8.2.0: | ||||
|   resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" | ||||
|   integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== | ||||
|  | ||||
| uuid@^8.3.2: | ||||
|   version "8.3.2" | ||||
|   resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" | ||||
|   integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== | ||||
|  | ||||
| v8-to-istanbul@^4.1.3: | ||||
|   version "4.1.4" | ||||
|   resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz#b97936f21c0e2d9996d4985e5c5156e9d4e49cd6" | ||||
| @@ -3753,6 +3767,11 @@ yallist@^2.1.2: | ||||
|   resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" | ||||
|   integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= | ||||
|  | ||||
| yallist@^4.0.0: | ||||
|   version "4.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" | ||||
|   integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== | ||||
|  | ||||
| yargs-parser@18.x, yargs-parser@^18.1.2: | ||||
|   version "18.1.3" | ||||
|   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user