Add --push-ignore-immutable-tag-errors boolean CLI option (#2774)
This commit is contained in:
		
							parent
							
								
									47d7f7e92b
								
							
						
					
					
						commit
						8bbd69d8a1
					
				
							
								
								
									
										10
									
								
								README.md
								
								
								
								
							
							
						
						
									
										10
									
								
								README.md
								
								
								
								
							|  | @ -962,6 +962,16 @@ _Note: Depending on the built image, the media type of the image manifest might | ||||||
| be either `application/vnd.oci.image.manifest.v1+json` or | be either `application/vnd.oci.image.manifest.v1+json` or | ||||||
| `application/vnd.docker.distribution.manifest.v2+json`._ | `application/vnd.docker.distribution.manifest.v2+json`._ | ||||||
| 
 | 
 | ||||||
|  | #### Flag `--push-ignore-immutable-tag-errors` | ||||||
|  | 
 | ||||||
|  | Set this boolean flag to `true` if you want the Kaniko process to exit with | ||||||
|  | success when a push error related to tag immutability occurs. | ||||||
|  | 
 | ||||||
|  | This is useful for example if you have parallel builds pushing the same tag | ||||||
|  | and do not care which one actually succeeds. | ||||||
|  | 
 | ||||||
|  | Defaults to `false`. | ||||||
|  | 
 | ||||||
| #### Flag `--push-retry` | #### Flag `--push-retry` | ||||||
| 
 | 
 | ||||||
| Set this flag to the number of retries that should happen for the push of an | Set this flag to the number of retries that should happen for the push of an | ||||||
|  |  | ||||||
|  | @ -237,6 +237,7 @@ func addKanikoOptionsFlags() { | ||||||
| 	RootCmd.PersistentFlags().BoolVarP(&opts.InsecurePull, "insecure-pull", "", false, "Pull from insecure registry using plain HTTP") | 	RootCmd.PersistentFlags().BoolVarP(&opts.InsecurePull, "insecure-pull", "", false, "Pull from insecure registry using plain HTTP") | ||||||
| 	RootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerifyPull, "skip-tls-verify-pull", "", false, "Pull from insecure registry ignoring TLS verify") | 	RootCmd.PersistentFlags().BoolVarP(&opts.SkipTLSVerifyPull, "skip-tls-verify-pull", "", false, "Pull from insecure registry ignoring TLS verify") | ||||||
| 	RootCmd.PersistentFlags().IntVar(&opts.PushRetry, "push-retry", 0, "Number of retries for the push operation") | 	RootCmd.PersistentFlags().IntVar(&opts.PushRetry, "push-retry", 0, "Number of retries for the push operation") | ||||||
|  | 	RootCmd.PersistentFlags().BoolVar(&opts.PushIgnoreImmutableTagErrors, "push-ignore-immutable-tag-errors", false, "If true, known tag immutability errors are ignored and the push finishes with success.") | ||||||
| 	RootCmd.PersistentFlags().IntVar(&opts.ImageFSExtractRetry, "image-fs-extract-retry", 0, "Number of retries for image FS extraction") | 	RootCmd.PersistentFlags().IntVar(&opts.ImageFSExtractRetry, "image-fs-extract-retry", 0, "Number of retries for image FS extraction") | ||||||
| 	RootCmd.PersistentFlags().IntVar(&opts.ImageDownloadRetry, "image-download-retry", 0, "Number of retries for downloading the remote image") | 	RootCmd.PersistentFlags().IntVar(&opts.ImageDownloadRetry, "image-download-retry", 0, "Number of retries for downloading the remote image") | ||||||
| 	RootCmd.PersistentFlags().StringVarP(&opts.KanikoDir, "kaniko-dir", "", constants.DefaultKanikoPath, "Path to the kaniko directory, this takes precedence over the KANIKO_DIR environment variable.") | 	RootCmd.PersistentFlags().StringVarP(&opts.KanikoDir, "kaniko-dir", "", constants.DefaultKanikoPath, "Path to the kaniko directory, this takes precedence over the KANIKO_DIR environment variable.") | ||||||
|  |  | ||||||
|  | @ -43,6 +43,7 @@ type RegistryOptions struct { | ||||||
| 	SkipTLSVerify                bool | 	SkipTLSVerify                bool | ||||||
| 	InsecurePull                 bool | 	InsecurePull                 bool | ||||||
| 	SkipTLSVerifyPull            bool | 	SkipTLSVerifyPull            bool | ||||||
|  | 	PushIgnoreImmutableTagErrors bool | ||||||
| 	PushRetry                    int | 	PushRetry                    int | ||||||
| 	ImageDownloadRetry           int | 	ImageDownloadRetry           int | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -62,6 +62,14 @@ const ( | ||||||
| 	DummyDestination    = "docker.io/unset-repo/unset-image-name" | 	DummyDestination    = "docker.io/unset-repo/unset-image-name" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var ( | ||||||
|  | 	// known tag immutability errors
 | ||||||
|  | 	errTagImmutable = []string{ | ||||||
|  | 		// https://cloud.google.com/artifact-registry/docs/docker/troubleshoot#push
 | ||||||
|  | 		"The repository has enabled tag immutability", | ||||||
|  | 	} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| func (w *withUserAgent) RoundTrip(r *http.Request) (*http.Response, error) { | func (w *withUserAgent) RoundTrip(r *http.Request) (*http.Response, error) { | ||||||
| 	ua := []string{fmt.Sprintf("kaniko/%s", version.Version())} | 	ua := []string{fmt.Sprintf("kaniko/%s", version.Version())} | ||||||
| 	if upstream := os.Getenv(UpstreamClientUaKey); upstream != "" { | 	if upstream := os.Getenv(UpstreamClientUaKey); upstream != "" { | ||||||
|  | @ -280,10 +288,23 @@ func DoPush(image v1.Image, opts *config.KanikoOptions) error { | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
|  | 			digest := destRef.Context().Digest(dig.String()) | ||||||
| 			if err := remote.Write(destRef, image, remote.WithAuth(pushAuth), remote.WithTransport(rt)); err != nil { | 			if err := remote.Write(destRef, image, remote.WithAuth(pushAuth), remote.WithTransport(rt)); err != nil { | ||||||
|  | 				if !opts.PushIgnoreImmutableTagErrors { | ||||||
| 					return err | 					return err | ||||||
| 				} | 				} | ||||||
| 			logrus.Infof("Pushed %s", destRef.Context().Digest(dig.String())) | 
 | ||||||
|  | 				// check for known "tag immutable" errors
 | ||||||
|  | 				errStr := err.Error() | ||||||
|  | 				for _, candidate := range errTagImmutable { | ||||||
|  | 					if strings.Contains(errStr, candidate) { | ||||||
|  | 						logrus.Infof("Immutable tag error ignored for %s", digest) | ||||||
|  | 						return nil | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			logrus.Infof("Pushed %s", digest) | ||||||
| 			return nil | 			return nil | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue