Compare commits
	
		
			47 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 74a5d14239 | ||
|   | 2f4f00e4c6 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 67c184546c | ||
|   | 3d4cc89e85 | ||
|   | 6cc823a6c4 | ||
|   | d94e792124 | ||
|   | 033db0da30 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 09c2ae9716 | ||
|   | ba56f006fc | ||
|   | 75bf9a79af | ||
|   | ed2698b25f | ||
|   | 52ad1d2e01 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | f18ea97ee4 | ||
|   | 07d7ee0dc6 | ||
|   | 327cd5a69d | ||
|   | e217ef3a2d | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 407f438d11 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 28e19ee314 | ||
|   | 7ca345011a | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 02b671aa02 | ||
|   | 06895751d1 | ||
|   | 02c9ff3be2 | ||
|   | 5d8785b43a | ||
|   | 7a65d3de5d | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | bd2f40996a | ||
|   | 9fd0581bf0 | ||
|   | eefb7e8744 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | cb13d66af0 | ||
|   | 1f36f5b7a2 | ||
|   | bcb47c2c49 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 8165a5b270 | ||
|   | 29df2a9f8c | ||
|   | 2b0e0e02ba | ||
|   | fe7fd06c5d | ||
|   | 3b8fed7e4b | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 90de1764cc | ||
|   | 9780b0c442 | ||
|   | 2fa130caf4 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 5e87b2aca7 | ||
|   | e0394952ce | ||
|   | 9af18aa7d8 | ||
|   | 668190adc5 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | be5150d9fe | ||
|   | e80ebcad71 | ||
|   | 75ee3eaf53 | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 793c19c8fc | ||
| ![dependabot[bot]](/assets/img/avatar_default.png)  | 30f019fb76 | 
							
								
								
									
										21
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								.github/workflows/publish.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| name: publish | ||||
|  | ||||
| on: | ||||
|   release: | ||||
|     types: | ||||
|       - published | ||||
|  | ||||
| jobs: | ||||
|   publish: | ||||
|     runs-on: ubuntu-latest | ||||
|     permissions: | ||||
|       contents: read | ||||
|       id-token: write | ||||
|       packages: write | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|       - | ||||
|         name: Publish | ||||
|         uses: actions/publish-immutable-action@v0.0.4 | ||||
							
								
								
									
										9
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @@ -15,17 +15,14 @@ jobs: | ||||
|   test: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|       - | ||||
|         name: Test | ||||
|         uses: docker/bake-action@v4 | ||||
|         uses: docker/bake-action@v6 | ||||
|         with: | ||||
|           targets: test | ||||
|       - | ||||
|         name: Upload coverage | ||||
|         uses: codecov/codecov-action@v4 | ||||
|         uses: codecov/codecov-action@v5 | ||||
|         with: | ||||
|           file: ./coverage/clover.xml | ||||
|           files: ./coverage/clover.xml | ||||
|           token: ${{ secrets.CODECOV_TOKEN }} | ||||
|   | ||||
							
								
								
									
										16
									
								
								.github/workflows/validate.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.github/workflows/validate.yml
									
									
									
									
										vendored
									
									
								
							| @@ -15,16 +15,17 @@ jobs: | ||||
|   prepare: | ||||
|     runs-on: ubuntu-latest | ||||
|     outputs: | ||||
|       targets: ${{ steps.targets.outputs.matrix }} | ||||
|       targets: ${{ steps.generate.outputs.targets }} | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|       - | ||||
|         name: Targets matrix | ||||
|         id: targets | ||||
|         run: | | ||||
|           echo "matrix=$(docker buildx bake validate --print | jq -cr '.group.validate.targets')" >> $GITHUB_OUTPUT | ||||
|         name: List targets | ||||
|         id: generate | ||||
|         uses: docker/bake-action/subaction/list-targets@v6 | ||||
|         with: | ||||
|           target: validate | ||||
|  | ||||
|   validate: | ||||
|     runs-on: ubuntu-latest | ||||
| @@ -35,11 +36,8 @@ jobs: | ||||
|       matrix: | ||||
|         target: ${{ fromJson(needs.prepare.outputs.targets) }} | ||||
|     steps: | ||||
|       - | ||||
|         name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|       - | ||||
|         name: Validate | ||||
|         uses: docker/bake-action@v4 | ||||
|         uses: docker/bake-action@v6 | ||||
|         with: | ||||
|           targets: ${{ matrix.target }} | ||||
|   | ||||
							
								
								
									
										25
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								README.md
									
									
									
									
									
								
							| @@ -51,7 +51,7 @@ jobs: | ||||
|         name: Login to Docker Hub | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           username: ${{ secrets.DOCKERHUB_USERNAME }} | ||||
|           username: ${{ vars.DOCKERHUB_USERNAME }} | ||||
|           password: ${{ secrets.DOCKERHUB_TOKEN }} | ||||
| ``` | ||||
|  | ||||
| @@ -105,7 +105,7 @@ jobs: | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: registry.gitlab.com | ||||
|           username: ${{ secrets.GITLAB_USERNAME }} | ||||
|           username: ${{ vars.GITLAB_USERNAME }} | ||||
|           password: ${{ secrets.GITLAB_PASSWORD }} | ||||
| ``` | ||||
|  | ||||
| @@ -136,7 +136,7 @@ jobs: | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: <registry-name>.azurecr.io | ||||
|           username: ${{ secrets.AZURE_CLIENT_ID }} | ||||
|           username: ${{ vars.AZURE_CLIENT_ID }} | ||||
|           password: ${{ secrets.AZURE_CLIENT_SECRET }} | ||||
| ``` | ||||
|  | ||||
| @@ -199,8 +199,7 @@ jobs: | ||||
| Use a service account with permission to push to GCR and [configure access control](https://cloud.google.com/container-registry/docs/access-control). | ||||
| Download the key for the service account as a JSON file. Save the contents of | ||||
| the file [as a secret](https://docs.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets#creating-encrypted-secrets-for-a-repository) | ||||
| named `GCR_JSON_KEY` in your GitHub repository. Set the username to `_json_key`, | ||||
| or `_json_key_base64` if you use a base64-encoded key. | ||||
| named `GCR_JSON_KEY` in your GitHub repository. Set the username to `_json_key`. | ||||
|  | ||||
| ```yaml | ||||
| name: ci | ||||
| @@ -302,7 +301,7 @@ jobs: | ||||
|  | ||||
| ### AWS Elastic Container Registry (ECR) | ||||
|  | ||||
| Use an IAM user with the ability to [push to ECR with `AmazonEC2ContainerRegistryPowerUser` managed policy for example](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr_managed_policies.html#AmazonEC2ContainerRegistryPowerUser). | ||||
| Use an IAM user with the ability to [push to ECR with `AmazonEC2ContainerRegistryPowerUser` managed policy for example](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonEC2ContainerRegistryPowerUser). | ||||
| Download the access keys and save them as `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` [as secrets](https://docs.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets#creating-encrypted-secrets-for-a-repository) | ||||
| in your GitHub repo. | ||||
|  | ||||
| @@ -322,7 +321,7 @@ jobs: | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: <aws-account-number>.dkr.ecr.<region>.amazonaws.com | ||||
|           username: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||||
|           username: ${{ vars.AWS_ACCESS_KEY_ID }} | ||||
|           password: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||||
| ``` | ||||
|  | ||||
| @@ -345,7 +344,7 @@ jobs: | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: <aws-account-number>.dkr.ecr.<region>.amazonaws.com | ||||
|           username: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||||
|           username: ${{ vars.AWS_ACCESS_KEY_ID }} | ||||
|           password: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||||
|         env: | ||||
|           AWS_ACCOUNT_IDS: 012345678910,023456789012 | ||||
| @@ -371,7 +370,7 @@ jobs: | ||||
|         name: Configure AWS Credentials | ||||
|         uses: aws-actions/configure-aws-credentials@v4 | ||||
|         with: | ||||
|           aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||||
|           aws-access-key-id: ${{ vars.AWS_ACCESS_KEY_ID }} | ||||
|           aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||||
|           aws-region: <region> | ||||
|       - | ||||
| @@ -406,7 +405,7 @@ jobs: | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: public.ecr.aws | ||||
|           username: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||||
|           username: ${{ vars.AWS_ACCESS_KEY_ID }} | ||||
|           password: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||||
|         env: | ||||
|           AWS_REGION: <region> | ||||
| @@ -440,7 +439,7 @@ jobs: | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: <region>.ocir.io | ||||
|           username: ${{ secrets.OCI_USERNAME }} | ||||
|           username: ${{ vars.OCI_USERNAME }} | ||||
|           password: ${{ secrets.OCI_TOKEN }} | ||||
| ``` | ||||
|  | ||||
| @@ -467,7 +466,7 @@ jobs: | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: quay.io | ||||
|           username: ${{ secrets.QUAY_USERNAME }} | ||||
|           username: ${{ vars.QUAY_USERNAME }} | ||||
|           password: ${{ secrets.QUAY_ROBOT_TOKEN }} | ||||
| ``` | ||||
|  | ||||
| @@ -491,7 +490,7 @@ jobs: | ||||
|         uses: docker/login-action@v3 | ||||
|         with: | ||||
|           registry: registry.digitalocean.com | ||||
|           username: ${{ secrets.DIGITALOCEAN_USERNAME }} | ||||
|           username: ${{ vars.DIGITALOCEAN_USERNAME }} | ||||
|           password: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} | ||||
| ``` | ||||
|  | ||||
|   | ||||
| @@ -2,14 +2,15 @@ import {expect, jest, test} from '@jest/globals'; | ||||
| import * as path from 'path'; | ||||
|  | ||||
| import {loginStandard, logout} from '../src/docker'; | ||||
| import {Exec} from '@docker/actions-toolkit/lib/exec'; | ||||
|  | ||||
| import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; | ||||
|  | ||||
| process.env['RUNNER_TEMP'] = path.join(__dirname, 'runner'); | ||||
|  | ||||
| test('loginStandard calls exec', async () => { | ||||
|   // eslint-disable-next-line @typescript-eslint/ban-ts-comment | ||||
|   // @ts-ignore | ||||
|   const execSpy = jest.spyOn(Exec, 'getExecOutput').mockImplementation(async () => { | ||||
|   const execSpy = jest.spyOn(Docker, 'getExecOutput').mockImplementation(async () => { | ||||
|     return { | ||||
|       exitCode: expect.any(Number), | ||||
|       stdout: expect.any(Function), | ||||
| @@ -23,7 +24,13 @@ test('loginStandard calls exec', async () => { | ||||
|  | ||||
|   await loginStandard(registry, username, password); | ||||
|  | ||||
|   expect(execSpy).toHaveBeenCalledWith(`docker`, ['login', '--password-stdin', '--username', username, registry], { | ||||
|   expect(execSpy).toHaveBeenCalledTimes(1); | ||||
|   const callfunc = execSpy.mock.calls[0]; | ||||
|   if (callfunc && callfunc[1]) { | ||||
|     // we don't want to check env opt | ||||
|     callfunc[1].env = undefined; | ||||
|   } | ||||
|   expect(execSpy).toHaveBeenCalledWith(['login', '--password-stdin', '--username', username, registry], { | ||||
|     input: Buffer.from(password), | ||||
|     silent: true, | ||||
|     ignoreReturnCode: true | ||||
| @@ -33,7 +40,7 @@ test('loginStandard calls exec', async () => { | ||||
| test('logout calls exec', async () => { | ||||
|   // eslint-disable-next-line @typescript-eslint/ban-ts-comment | ||||
|   // @ts-ignore | ||||
|   const execSpy = jest.spyOn(Exec, 'getExecOutput').mockImplementation(async () => { | ||||
|   const execSpy = jest.spyOn(Docker, 'getExecOutput').mockImplementation(async () => { | ||||
|     return { | ||||
|       exitCode: expect.any(Number), | ||||
|       stdout: expect.any(Function), | ||||
| @@ -45,7 +52,13 @@ test('logout calls exec', async () => { | ||||
|  | ||||
|   await logout(registry); | ||||
|  | ||||
|   expect(execSpy).toHaveBeenCalledWith(`docker`, ['logout', registry], { | ||||
|   expect(execSpy).toHaveBeenCalledTimes(1); | ||||
|   const callfunc = execSpy.mock.calls[0]; | ||||
|   if (callfunc && callfunc[1]) { | ||||
|     // we don't want to check env opt | ||||
|     callfunc[1].env = undefined; | ||||
|   } | ||||
|   expect(execSpy).toHaveBeenCalledWith(['logout', registry], { | ||||
|     ignoreReturnCode: true | ||||
|   }); | ||||
| }); | ||||
|   | ||||
							
								
								
									
										97
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										97
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/index.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								dist/index.js.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2971
									
								
								dist/licenses.txt
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2971
									
								
								dist/licenses.txt
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,3 +1,9 @@ | ||||
| target "_common" { | ||||
|   args = { | ||||
|     BUILDKIT_CONTEXT_KEEP_GIT_DIR = 1 | ||||
|   } | ||||
| } | ||||
|  | ||||
| group "default" { | ||||
|   targets = ["build"] | ||||
| } | ||||
| @@ -11,42 +17,49 @@ group "validate" { | ||||
| } | ||||
|  | ||||
| target "build" { | ||||
|   inherits = ["_common"] | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "build-update" | ||||
|   output = ["."] | ||||
| } | ||||
|  | ||||
| target "build-validate" { | ||||
|   inherits = ["_common"] | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "build-validate" | ||||
|   output = ["type=cacheonly"] | ||||
| } | ||||
|  | ||||
| target "format" { | ||||
|   inherits = ["_common"] | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "format-update" | ||||
|   output = ["."] | ||||
| } | ||||
|  | ||||
| target "lint" { | ||||
|   inherits = ["_common"] | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "lint" | ||||
|   output = ["type=cacheonly"] | ||||
| } | ||||
|  | ||||
| target "vendor" { | ||||
|   inherits = ["_common"] | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "vendor-update" | ||||
|   output = ["."] | ||||
| } | ||||
|  | ||||
| target "vendor-validate" { | ||||
|   inherits = ["_common"] | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "vendor-validate" | ||||
|   output = ["type=cacheonly"] | ||||
| } | ||||
|  | ||||
| target "test" { | ||||
|   inherits = ["_common"] | ||||
|   dockerfile = "dev.Dockerfile" | ||||
|   target = "test-coverage" | ||||
|   output = ["./coverage"] | ||||
|   | ||||
							
								
								
									
										10
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								package.json
									
									
									
									
									
								
							| @@ -25,12 +25,12 @@ | ||||
|   "license": "Apache-2.0", | ||||
|   "packageManager": "yarn@3.6.3", | ||||
|   "dependencies": { | ||||
|     "@actions/core": "^1.10.1", | ||||
|     "@aws-sdk/client-ecr": "^3.583.0", | ||||
|     "@aws-sdk/client-ecr-public": "^3.583.0", | ||||
|     "@docker/actions-toolkit": "^0.24.0", | ||||
|     "@actions/core": "^1.11.1", | ||||
|     "@aws-sdk/client-ecr": "^3.766.0", | ||||
|     "@aws-sdk/client-ecr-public": "^3.758.0", | ||||
|     "@docker/actions-toolkit": "^0.57.0", | ||||
|     "http-proxy-agent": "^7.0.2", | ||||
|     "https-proxy-agent": "^7.0.4" | ||||
|     "https-proxy-agent": "^7.0.6" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/node": "^20.12.12", | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import * as aws from './aws'; | ||||
| import * as core from '@actions/core'; | ||||
| import {Exec} from '@docker/actions-toolkit/lib/exec'; | ||||
|  | ||||
| import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; | ||||
|  | ||||
| export async function login(registry: string, username: string, password: string, ecr: string): Promise<void> { | ||||
|   if (/true/i.test(ecr) || (ecr == 'auto' && aws.isECR(registry))) { | ||||
| @@ -11,7 +12,7 @@ export async function login(registry: string, username: string, password: string | ||||
| } | ||||
|  | ||||
| export async function logout(registry: string): Promise<void> { | ||||
|   await Exec.getExecOutput('docker', ['logout', registry], { | ||||
|   await Docker.getExecOutput(['logout', registry], { | ||||
|     ignoreReturnCode: true | ||||
|   }).then(res => { | ||||
|     if (res.stderr.length > 0 && res.exitCode != 0) { | ||||
| @@ -40,7 +41,7 @@ export async function loginStandard(registry: string, username: string, password | ||||
|   } else { | ||||
|     core.info(`Logging into Docker Hub...`); | ||||
|   } | ||||
|   await Exec.getExecOutput('docker', loginArgs, { | ||||
|   await Docker.getExecOutput(loginArgs, { | ||||
|     ignoreReturnCode: true, | ||||
|     silent: true, | ||||
|     input: Buffer.from(password) | ||||
| @@ -57,7 +58,7 @@ export async function loginECR(registry: string, username: string, password: str | ||||
|   const regDatas = await aws.getRegistriesData(registry, username, password); | ||||
|   for (const regData of regDatas) { | ||||
|     core.info(`Logging into ${regData.registry}...`); | ||||
|     await Exec.getExecOutput('docker', ['login', '--password-stdin', '--username', regData.username, regData.registry], { | ||||
|     await Docker.getExecOutput(['login', '--password-stdin', '--username', regData.username, regData.registry], { | ||||
|       ignoreReturnCode: true, | ||||
|       silent: true, | ||||
|       input: Buffer.from(regData.password) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user