mirror of
				https://github.com/docker/login-action.git
				synced 2025-10-31 10:10:09 +08:00 
			
		
		
		
	add retries for 502
Signed-off-by: Fedor Dikarev <fedor.dikarev@gmail.com>
This commit is contained in:
		
							parent
							
								
									06895751d1
								
							
						
					
					
						commit
						8479e9040e
					
				| @ -6,6 +6,7 @@ export interface Inputs { | ||||
|   password: string; | ||||
|   ecr: string; | ||||
|   logout: boolean; | ||||
|   attempts: number; | ||||
| } | ||||
| 
 | ||||
| export function getInputs(): Inputs { | ||||
| @ -14,6 +15,7 @@ export function getInputs(): Inputs { | ||||
|     username: core.getInput('username'), | ||||
|     password: core.getInput('password'), | ||||
|     ecr: core.getInput('ecr'), | ||||
|     logout: core.getBooleanInput('logout') | ||||
|     logout: core.getBooleanInput('logout'), | ||||
|     attempts: Number.parseInt(core.getInput('attempts')) | ||||
|   }; | ||||
| } | ||||
|  | ||||
| @ -3,11 +3,11 @@ import * as core from '@actions/core'; | ||||
| 
 | ||||
| import {Docker} from '@docker/actions-toolkit/lib/docker/docker'; | ||||
| 
 | ||||
| export async function login(registry: string, username: string, password: string, ecr: string): Promise<void> { | ||||
| export async function login(registry: string, username: string, password: string, ecr: string, attempts: number): Promise<void> { | ||||
|   if (/true/i.test(ecr) || (ecr == 'auto' && aws.isECR(registry))) { | ||||
|     await loginECR(registry, username, password); | ||||
|   } else { | ||||
|     await loginStandard(registry, username, password); | ||||
|     await loginStandard(registry, username, password, attempts); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @ -21,7 +21,7 @@ export async function logout(registry: string): Promise<void> { | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| export async function loginStandard(registry: string, username: string, password: string): Promise<void> { | ||||
| export async function loginStandard(registry: string, username: string, password: string, attempts: number): Promise<void> { | ||||
|   if (!username && !password) { | ||||
|     throw new Error('Username and password required'); | ||||
|   } | ||||
| @ -41,16 +41,29 @@ export async function loginStandard(registry: string, username: string, password | ||||
|   } else { | ||||
|     core.info(`Logging into Docker Hub...`); | ||||
|   } | ||||
|   await Docker.getExecOutput(loginArgs, { | ||||
|     ignoreReturnCode: true, | ||||
|     silent: true, | ||||
|     input: Buffer.from(password) | ||||
|   }).then(res => { | ||||
|     if (res.stderr.length > 0 && res.exitCode != 0) { | ||||
|       throw new Error(res.stderr.trim()); | ||||
|   let attempt: number = 1 | ||||
|   let succeeded: boolean = false | ||||
|   for (let attempt = 1; (attempt <= attempts) && (!succeeded); attempt++) { | ||||
|     await Docker.getExecOutput(loginArgs, { | ||||
|       ignoreReturnCode: true, | ||||
|       silent: true, | ||||
|       input: Buffer.from(password) | ||||
|     }).then(res => { | ||||
|       if (res.stderr.length > 0 && res.exitCode != 0) { | ||||
|         let isRetriable: boolean | ||||
|         isRetriable = res.stderr.endsWith("502 Bad Gateway") | ||||
|         if (!isRetriable || (attempt >= attempts) { | ||||
|           throw new Error(res.stderr.trim()); | ||||
|         } | ||||
|       } else { | ||||
|         core.info(`Login Succeeded!`); | ||||
|         succeeded = true; | ||||
|       } | ||||
|     }); | ||||
|     if ((attempt < attempts) && !succeeded) { | ||||
|       await new Promise(r => setTimeout(r, 10000)) | ||||
|     } | ||||
|     core.info(`Login Succeeded!`); | ||||
|   }); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export async function loginECR(registry: string, username: string, password: string): Promise<void> { | ||||
|  | ||||
| @ -8,7 +8,7 @@ export async function main(): Promise<void> { | ||||
|   const input: context.Inputs = context.getInputs(); | ||||
|   stateHelper.setRegistry(input.registry); | ||||
|   stateHelper.setLogout(input.logout); | ||||
|   await docker.login(input.registry, input.username, input.password, input.ecr); | ||||
|   await docker.login(input.registry, input.username, input.password, input.ecr, input.attempts); | ||||
| } | ||||
| 
 | ||||
| async function post(): Promise<void> { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Fedor Dikarev
						Fedor Dikarev