mirror of
				https://github.com/docker/login-action.git
				synced 2025-10-31 10:10:09 +08:00 
			
		
		
		
	add retries logic
Signed-off-by: Fedor Dikarev <fedor.dikarev@gmail.com>
This commit is contained in:
		
							parent
							
								
									2bc89718bc
								
							
						
					
					
						commit
						b909aa9ffe
					
				| @ -3,12 +3,24 @@ 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, http_errors_to_retry: string[], max_attempts: number, retry_timeout: number): Promise<void> { | ||||
|   let succeeded: boolean = false; | ||||
|   for (let attempt = 1; (attempt <= max_attempts) && (!succeeded); attempt++) { | ||||
|     try { | ||||
|       if (/true/i.test(ecr) || (ecr == 'auto' && aws.isECR(registry))) { | ||||
|         await loginECR(registry, username, password); | ||||
|       } else { | ||||
|         await loginStandard(registry, username, password); | ||||
|       } | ||||
|     } catch (error) { | ||||
|       if ((attempt < max_attempts) && (isRetriableError(error, http_errors_to_retry))) { | ||||
|         core.info("Attempt ", attempt, "out of ", max_attempts, "failed, retrying after ", retry_timeout, "seconds"); | ||||
|         await new Promise(r => setTimeout(r, retry_timeout * 1000)); | ||||
|       } else { | ||||
|         throw new Error(error); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export async function logout(registry: string): Promise<void> { | ||||
| @ -21,6 +33,16 @@ export async function logout(registry: string): Promise<void> { | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| function isRetriableError(stderr: string, http_errors_to_retry: string[]): boolean { | ||||
|   const trimmedError = stderr.trim(); | ||||
|   for (const err_code in http_errors_to_retry) { | ||||
|     if (trimmedError.includes("failed with status: " + err_code)) { | ||||
|       return true; | ||||
|     } | ||||
|   } | ||||
|   return false; | ||||
| } | ||||
| 
 | ||||
| export async function loginStandard(registry: string, username: string, password: string): Promise<void> { | ||||
|   if (!username && !password) { | ||||
|     throw new Error('Username and password required'); | ||||
|  | ||||
| @ -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.http_errors_to_retry, input.max_attempts, input.retry_timeout); | ||||
| } | ||||
| 
 | ||||
| async function post(): Promise<void> { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Fedor Dikarev
						Fedor Dikarev