Expose Git secret token if default context used
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
		
							
								
								
									
										258
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										258
									
								
								README.md
									
									
									
									
									
								
							| @@ -45,10 +45,7 @@ build-secrets, remote cache, etc. and different builder deployment/namespacing o | ||||
|  | ||||
| The default behavior of this action is to use the [Git context invoked by your workflow](https://github.com/docker/build-push-action/blob/master/src/context.ts#L35). | ||||
|  | ||||
| <details> | ||||
|   <summary><b>Show workflow</b></summary> | ||||
|    | ||||
|   ```yaml | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
| on: | ||||
| @@ -81,11 +78,10 @@ jobs: | ||||
|       - | ||||
|         name: Image digest | ||||
|         run: echo ${{ steps.docker_build.outputs.digest }} | ||||
|   ``` | ||||
| </details> | ||||
| ``` | ||||
|  | ||||
| If you use this action in a private repository, you have to pass the [GitHub Token](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token) | ||||
| as a secret named `GIT_AUTH_TOKEN` to be able to authenticate against it with buildx: | ||||
| If you want to authenticate against a private repository, you have to use a secret named `GIT_AUTH_TOKEN` to be able | ||||
| to authenticate against it with buildx: | ||||
|  | ||||
| ```yaml | ||||
|       - | ||||
| @@ -96,7 +92,7 @@ as a secret named `GIT_AUTH_TOKEN` to be able to authenticate against it with bu | ||||
|           push: true | ||||
|           tags: user/app:latest | ||||
|           secrets: | | ||||
|             GIT_AUTH_TOKEN=${{ github.token }} | ||||
|             GIT_AUTH_TOKEN=${{ secrets.MYTOKEN }} | ||||
| ``` | ||||
|  | ||||
| > :warning: Subdir for Git context is [not yet supported](https://github.com/docker/build-push-action/issues/120). | ||||
| @@ -106,140 +102,128 @@ as a secret named `GIT_AUTH_TOKEN` to be able to authenticate against it with bu | ||||
|  | ||||
| You can also use the `PATH` context alongside the [`actions/checkout`](https://github.com/actions/checkout/) action. | ||||
|  | ||||
| <details> | ||||
|   <summary><b>Show workflow</b></summary> | ||||
|    | ||||
|   ```yaml | ||||
|   name: ci | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
|   on: | ||||
|     push: | ||||
|       branches: master | ||||
| on: | ||||
|   push: | ||||
|     branches: master | ||||
|  | ||||
|   jobs: | ||||
|     path-context: | ||||
|       runs-on: ubuntu-latest | ||||
|       steps: | ||||
|         - | ||||
|           name: Checkout | ||||
|           uses: actions/checkout@v2 | ||||
|         - | ||||
|           name: Set up QEMU | ||||
|           uses: docker/setup-qemu-action@v1 | ||||
|         - | ||||
|           name: Set up Docker Buildx | ||||
|           uses: docker/setup-buildx-action@v1 | ||||
|         - | ||||
|           name: Login to DockerHub | ||||
|           uses: docker/login-action@v1 | ||||
|           with: | ||||
|             username: ${{ secrets.DOCKERHUB_USERNAME }} | ||||
|             password: ${{ secrets.DOCKERHUB_TOKEN }} | ||||
|         - | ||||
|           name: Build and push | ||||
|           uses: docker/build-push-action@v2 | ||||
|           with: | ||||
|             context: . | ||||
|             file: ./Dockerfile | ||||
|             platforms: linux/amd64,linux/arm64,linux/386 | ||||
|             push: true | ||||
|             tags: user/app:latest | ||||
|   ``` | ||||
| </details> | ||||
| jobs: | ||||
|   path-context: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v1 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: docker/setup-buildx-action@v1 | ||||
|       - | ||||
|         name: Login to DockerHub | ||||
|         uses: docker/login-action@v1 | ||||
|         with: | ||||
|           username: ${{ secrets.DOCKERHUB_USERNAME }} | ||||
|           password: ${{ secrets.DOCKERHUB_TOKEN }} | ||||
|       - | ||||
|         name: Build and push | ||||
|         uses: docker/build-push-action@v2 | ||||
|         with: | ||||
|           context: . | ||||
|           file: ./Dockerfile | ||||
|           platforms: linux/amd64,linux/arm64,linux/386 | ||||
|           push: true | ||||
|           tags: user/app:latest | ||||
| ``` | ||||
|  | ||||
| ### Isolated builders | ||||
|  | ||||
| <details> | ||||
|   <summary><b>Show workflow</b></summary> | ||||
|    | ||||
|   ```yaml | ||||
|   name: ci | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
|   on: | ||||
|     push: | ||||
|       branches: master | ||||
| on: | ||||
|   push: | ||||
|     branches: master | ||||
|  | ||||
|   jobs: | ||||
|     multi-builders: | ||||
|       runs-on: ubuntu-latest | ||||
|       steps: | ||||
|         - | ||||
|           uses: docker/setup-buildx-action@v1 | ||||
|           id: builder1 | ||||
|         - | ||||
|           uses: docker/setup-buildx-action@v1 | ||||
|           id: builder2 | ||||
|         - | ||||
|           name: Builder 1 name | ||||
|           run: echo ${{ steps.builder1.outputs.name }} | ||||
|         - | ||||
|           name: Builder 2 name | ||||
|           run: echo ${{ steps.builder2.outputs.name }} | ||||
|         - | ||||
|           name: Build against builder1 | ||||
|           uses: docker/build-push-action@v2 | ||||
|           with: | ||||
|             builder: ${{ steps.builder1.outputs.name }} | ||||
|             target: mytarget1 | ||||
|         - | ||||
|           name: Build against builder2 | ||||
|           uses: docker/build-push-action@v2 | ||||
|           with: | ||||
|             builder: ${{ steps.builder2.outputs.name }} | ||||
|             target: mytarget2 | ||||
|   ``` | ||||
| </details> | ||||
| jobs: | ||||
|   multi-builders: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         uses: docker/setup-buildx-action@v1 | ||||
|         id: builder1 | ||||
|       - | ||||
|         uses: docker/setup-buildx-action@v1 | ||||
|         id: builder2 | ||||
|       - | ||||
|         name: Builder 1 name | ||||
|         run: echo ${{ steps.builder1.outputs.name }} | ||||
|       - | ||||
|         name: Builder 2 name | ||||
|         run: echo ${{ steps.builder2.outputs.name }} | ||||
|       - | ||||
|         name: Build against builder1 | ||||
|         uses: docker/build-push-action@v2 | ||||
|         with: | ||||
|           builder: ${{ steps.builder1.outputs.name }} | ||||
|           target: mytarget1 | ||||
|       - | ||||
|         name: Build against builder2 | ||||
|         uses: docker/build-push-action@v2 | ||||
|         with: | ||||
|           builder: ${{ steps.builder2.outputs.name }} | ||||
|           target: mytarget2 | ||||
| ``` | ||||
|  | ||||
| ### Multi-platform image | ||||
|  | ||||
| <details> | ||||
|   <summary><b>Show workflow</b></summary> | ||||
|    | ||||
|   ```yaml | ||||
|   name: ci | ||||
| ```yaml | ||||
| name: ci | ||||
|  | ||||
|   on: | ||||
|     push: | ||||
|       branches: master | ||||
| on: | ||||
|   push: | ||||
|     branches: master | ||||
|  | ||||
|   jobs: | ||||
|     multi: | ||||
|       runs-on: ubuntu-latest | ||||
|       steps: | ||||
|         - | ||||
|           name: Checkout | ||||
|           uses: actions/checkout@v2 | ||||
|         - | ||||
|           name: Set up QEMU | ||||
|           uses: docker/setup-qemu-action@v1 | ||||
|         - | ||||
|           name: Set up Docker Buildx | ||||
|           uses: docker/setup-buildx-action@v1 | ||||
|         - | ||||
|           name: Login to DockerHub | ||||
|           uses: docker/login-action@v1  | ||||
|           with: | ||||
|             username: ${{ secrets.DOCKERHUB_USERNAME }} | ||||
|             password: ${{ secrets.DOCKERHUB_TOKEN }} | ||||
|         - | ||||
|           name: Build and push | ||||
|           uses: docker/build-push-action@v2 | ||||
|           with: | ||||
|             context: . | ||||
|             file: ./Dockerfile | ||||
|             platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x | ||||
|             push: true | ||||
|             tags: | | ||||
|               user/app:latest | ||||
|               user/app:1.0.0 | ||||
|   ``` | ||||
| </details> | ||||
| jobs: | ||||
|   multi: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
|       - | ||||
|         name: Set up QEMU | ||||
|         uses: docker/setup-qemu-action@v1 | ||||
|       - | ||||
|         name: Set up Docker Buildx | ||||
|         uses: docker/setup-buildx-action@v1 | ||||
|       - | ||||
|         name: Login to DockerHub | ||||
|         uses: docker/login-action@v1  | ||||
|         with: | ||||
|           username: ${{ secrets.DOCKERHUB_USERNAME }} | ||||
|           password: ${{ secrets.DOCKERHUB_TOKEN }} | ||||
|       - | ||||
|         name: Build and push | ||||
|         uses: docker/build-push-action@v2 | ||||
|         with: | ||||
|           context: . | ||||
|           file: ./Dockerfile | ||||
|           platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64,linux/ppc64le,linux/s390x | ||||
|           push: true | ||||
|           tags: | | ||||
|             user/app:latest | ||||
|             user/app:1.0.0 | ||||
| ``` | ||||
|  | ||||
| ## Advanced usage | ||||
|  | ||||
| ### Local registry | ||||
|  | ||||
| For testing purposes you may need to create a [local registry](https://hub.docker.com/_/registry) to push images into. | ||||
| For testing purposes you may need to create a [local registry](https://hub.docker.com/_/registry) to push images into: | ||||
|  | ||||
| <details> | ||||
|   <summary><b>Show workflow</b></summary> | ||||
| @@ -284,7 +268,7 @@ For testing purposes you may need to create a [local registry](https://hub.docke | ||||
| ### Leverage GitHub cache | ||||
|  | ||||
| You can leverage [GitHub cache](https://docs.github.com/en/actions/configuring-and-managing-workflows/caching-dependencies-to-speed-up-workflows) | ||||
| using [actions/cache](https://github.com/actions/cache) with this action. | ||||
| using [actions/cache](https://github.com/actions/cache) with this action: | ||||
|  | ||||
| <details> | ||||
|   <summary><b>Show workflow</b></summary> | ||||
| @@ -338,15 +322,6 @@ The following workflow with the `Prepare` step will generate some [outputs](http | ||||
| to handle tags and labels based on GitHub actions events. This is just an example to show many cases that you | ||||
| might want to use: | ||||
|  | ||||
| | Event           | Ref                           | Commit SHA | Docker Tag                         | Pushed | | ||||
| |-----------------|-------------------------------|------------|------------------------------------|--------| | ||||
| | `schedule`      |                               |            | `nightly`                          | Yes    | | ||||
| | `pull_request`  | `refs/pull/2/merge`           | `a123b57`  | `pr-2`                             | No     | | ||||
| | `push`          | `refs/heads/<default_branch>` | `676cae2`  | `sha-676cae2`, `edge`              | Yes    | | ||||
| | `push`          | `refs/heads/dev`              | `cf20257`  | `sha-cf20257`, `dev`               | Yes    | | ||||
| | `push`          | `refs/heads/my/branch`        | `a5df687`  | `sha-a5df687`, `my-branch`         | Yes    | | ||||
| | `push tag`      | `refs/tags/v1.2.3`            |            | `v1.2.3`, `v1.2`, `v1`, `latest`   | Yes    | | ||||
|  | ||||
| <details> | ||||
|   <summary><b>Show workflow</b></summary> | ||||
|    | ||||
| @@ -434,11 +409,20 @@ might want to use: | ||||
|   ``` | ||||
| </details> | ||||
|  | ||||
| | Event           | Ref                           | Commit SHA | Docker Tag                         | Pushed | | ||||
| |-----------------|-------------------------------|------------|------------------------------------|--------| | ||||
| | `schedule`      |                               |            | `nightly`                          | Yes    | | ||||
| | `pull_request`  | `refs/pull/2/merge`           | `a123b57`  | `pr-2`                             | No     | | ||||
| | `push`          | `refs/heads/<default_branch>` | `676cae2`  | `sha-676cae2`, `edge`              | Yes    | | ||||
| | `push`          | `refs/heads/dev`              | `cf20257`  | `sha-cf20257`, `dev`               | Yes    | | ||||
| | `push`          | `refs/heads/my/branch`        | `a5df687`  | `sha-a5df687`, `my-branch`         | Yes    | | ||||
| | `push tag`      | `refs/tags/v1.2.3`            |            | `v1.2.3`, `v1.2`, `v1`, `latest`   | Yes    | | ||||
|  | ||||
| ### Update DockerHub repo description | ||||
|  | ||||
| You can update the [Docker Hub repository description](https://docs.docker.com/docker-hub/repos/) using | ||||
| a third-party action called [Docker Hub Description](https://github.com/peter-evans/dockerhub-description) | ||||
| with this action. | ||||
| with this action: | ||||
|  | ||||
| <details> | ||||
|   <summary><b>Show workflow</b></summary> | ||||
|   | ||||
| @@ -64,6 +64,10 @@ inputs: | ||||
|   secrets: | ||||
|     description: "List of secrets to expose to the build (eg. key=value, GIT_AUTH_TOKEN=mytoken)" | ||||
|     required: false | ||||
|   github-token: | ||||
|     description: "GitHub Token used to authenticate against a repository for Git context" | ||||
|     default: ${{ github.token }} | ||||
|     required: false | ||||
|  | ||||
| outputs: | ||||
|   digest: | ||||
|   | ||||
							
								
								
									
										25
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -7955,6 +7955,12 @@ function convertBody(buffer, headers) { | ||||
| 	// html4 | ||||
| 	if (!res && str) { | ||||
| 		res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str); | ||||
| 		if (!res) { | ||||
| 			res = /<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(str); | ||||
| 			if (res) { | ||||
| 				res.pop(); // drop last quote | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (res) { | ||||
| 			res = /charset=(.*)/i.exec(res.pop()); | ||||
| @@ -8962,7 +8968,7 @@ function fetch(url, opts) { | ||||
| 				// HTTP fetch step 5.5 | ||||
| 				switch (request.redirect) { | ||||
| 					case 'error': | ||||
| 						reject(new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect')); | ||||
| 						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect')); | ||||
| 						finalize(); | ||||
| 						return; | ||||
| 					case 'manual': | ||||
| @@ -9001,7 +9007,8 @@ function fetch(url, opts) { | ||||
| 							method: request.method, | ||||
| 							body: request.body, | ||||
| 							signal: request.signal, | ||||
| 							timeout: request.timeout | ||||
| 							timeout: request.timeout, | ||||
| 							size: request.size | ||||
| 						}; | ||||
|  | ||||
| 						// HTTP-redirect fetch step 9 | ||||
| @@ -13640,11 +13647,11 @@ const buildx = __importStar(__webpack_require__(295)); | ||||
| const core = __importStar(__webpack_require__(186)); | ||||
| const github = __importStar(__webpack_require__(438)); | ||||
| exports.tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-build-push-')); | ||||
| const defaultContext = `https://github.com/${github.context.repo.owner}/${github.context.repo.repo}#${github.context.ref}`; | ||||
| function getInputs() { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         return { | ||||
|             context: core.getInput('context') || | ||||
|                 `https://github.com/${github.context.repo.owner}/${github.context.repo.repo}#${github.context.ref}`, | ||||
|             context: core.getInput('context') || defaultContext, | ||||
|             file: core.getInput('file') || 'Dockerfile', | ||||
|             buildArgs: yield getInputList('build-args'), | ||||
|             labels: yield getInputList('labels'), | ||||
| @@ -13660,7 +13667,8 @@ function getInputs() { | ||||
|             outputs: yield getInputList('outputs', true), | ||||
|             cacheFrom: yield getInputList('cache-from', true), | ||||
|             cacheTo: yield getInputList('cache-to', true), | ||||
|             secrets: yield getInputList('secrets', true) | ||||
|             secrets: yield getInputList('secrets', true), | ||||
|             githubToken: core.getInput('github-token') | ||||
|         }; | ||||
|     }); | ||||
| } | ||||
| @@ -13708,9 +13716,16 @@ function getBuildArgs(inputs, buildxVersion) { | ||||
|         yield exports.asyncForEach(inputs.cacheTo, (cacheTo) => __awaiter(this, void 0, void 0, function* () { | ||||
|             args.push('--cache-to', cacheTo); | ||||
|         })); | ||||
|         let hasGitAuthToken = false; | ||||
|         yield exports.asyncForEach(inputs.secrets, (secret) => __awaiter(this, void 0, void 0, function* () { | ||||
|             if (secret.startsWith('GIT_AUTH_TOKEN=')) { | ||||
|                 hasGitAuthToken = true; | ||||
|             } | ||||
|             args.push('--secret', yield buildx.getSecret(secret)); | ||||
|         })); | ||||
|         if (inputs.githubToken && !hasGitAuthToken && inputs.context == defaultContext) { | ||||
|             args.push('--secret', yield buildx.getSecret(`GIT_AUTH_TOKEN=${inputs.githubToken}`)); | ||||
|         } | ||||
|         if (inputs.file) { | ||||
|             args.push('--file', inputs.file); | ||||
|         } | ||||
|   | ||||
| @@ -6,7 +6,8 @@ import * as buildx from './buildx'; | ||||
| import * as core from '@actions/core'; | ||||
| import * as github from '@actions/github'; | ||||
|  | ||||
| export const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-build-push-')); | ||||
| export const tmpDir: string = fs.mkdtempSync(path.join(os.tmpdir(), 'docker-build-push-')); | ||||
| const defaultContext: string = `https://github.com/${github.context.repo.owner}/${github.context.repo.repo}#${github.context.ref}`; | ||||
|  | ||||
| export interface Inputs { | ||||
|   context: string; | ||||
| @@ -26,13 +27,12 @@ export interface Inputs { | ||||
|   cacheFrom: string[]; | ||||
|   cacheTo: string[]; | ||||
|   secrets: string[]; | ||||
|   githubToken: string; | ||||
| } | ||||
|  | ||||
| export async function getInputs(): Promise<Inputs> { | ||||
|   return { | ||||
|     context: | ||||
|       core.getInput('context') || | ||||
|       `https://github.com/${github.context.repo.owner}/${github.context.repo.repo}#${github.context.ref}`, | ||||
|     context: core.getInput('context') || defaultContext, | ||||
|     file: core.getInput('file') || 'Dockerfile', | ||||
|     buildArgs: await getInputList('build-args'), | ||||
|     labels: await getInputList('labels'), | ||||
| @@ -48,7 +48,8 @@ export async function getInputs(): Promise<Inputs> { | ||||
|     outputs: await getInputList('outputs', true), | ||||
|     cacheFrom: await getInputList('cache-from', true), | ||||
|     cacheTo: await getInputList('cache-to', true), | ||||
|     secrets: await getInputList('secrets', true) | ||||
|     secrets: await getInputList('secrets', true), | ||||
|     githubToken: core.getInput('github-token') | ||||
|   }; | ||||
| } | ||||
|  | ||||
| @@ -92,9 +93,16 @@ async function getBuildArgs(inputs: Inputs, buildxVersion: string): Promise<Arra | ||||
|   await asyncForEach(inputs.cacheTo, async cacheTo => { | ||||
|     args.push('--cache-to', cacheTo); | ||||
|   }); | ||||
|   let hasGitAuthToken: boolean = false; | ||||
|   await asyncForEach(inputs.secrets, async secret => { | ||||
|     if (secret.startsWith('GIT_AUTH_TOKEN=')) { | ||||
|       hasGitAuthToken = true; | ||||
|     } | ||||
|     args.push('--secret', await buildx.getSecret(secret)); | ||||
|   }); | ||||
|   if (inputs.githubToken && !hasGitAuthToken && inputs.context == defaultContext) { | ||||
|     args.push('--secret', await buildx.getSecret(`GIT_AUTH_TOKEN=${inputs.githubToken}`)); | ||||
|   } | ||||
|   if (inputs.file) { | ||||
|     args.push('--file', inputs.file); | ||||
|   } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 CrazyMax
					CrazyMax