storage: strip env specific data during archive
This ensures the checksum is predictable, and not influenced by e.g. different runtime configuration settings, or FS specific data. Signed-off-by: Hidde Beydals <hello@hidde.co>
This commit is contained in:
		
							parent
							
								
									2ca0b47fea
								
							
						
					
					
						commit
						e34f79203d
					
				|  | @ -577,7 +577,7 @@ func TestGitRepositoryReconciler_reconcileArtifact(t *testing.T) { | |||
| 			}, | ||||
| 			afterFunc: func(t *WithT, obj *sourcev1.GitRepository, artifact sourcev1.Artifact) { | ||||
| 				t.Expect(obj.GetArtifact()).ToNot(BeNil()) | ||||
| 				t.Expect(obj.GetArtifact().Checksum).To(Equal("f9955588f6aeed7be9b1ef15cd2ddac47bb53291")) | ||||
| 				t.Expect(obj.GetArtifact().Checksum).To(Equal("b1fab897a1a0fb8094ce3ae0e9743a4b72bd7268")) | ||||
| 			}, | ||||
| 			want: ctrl.Result{RequeueAfter: interval}, | ||||
| 			assertConditions: []metav1.Condition{ | ||||
|  | @ -593,7 +593,7 @@ func TestGitRepositoryReconciler_reconcileArtifact(t *testing.T) { | |||
| 			}, | ||||
| 			afterFunc: func(t *WithT, obj *sourcev1.GitRepository, artifact sourcev1.Artifact) { | ||||
| 				t.Expect(obj.GetArtifact()).ToNot(BeNil()) | ||||
| 				t.Expect(obj.GetArtifact().Checksum).To(Equal("542a8ad0171118a3249e8c531c598b898defd742")) | ||||
| 				t.Expect(obj.GetArtifact().Checksum).To(Equal("a71f8c076db814bc21c16cecc960c4fcaf970ac5")) | ||||
| 			}, | ||||
| 			want: ctrl.Result{RequeueAfter: interval}, | ||||
| 			assertConditions: []metav1.Condition{ | ||||
|  |  | |||
|  | @ -165,7 +165,8 @@ func SourceIgnoreFilter(ps []gitignore.Pattern, domain []string) ArchiveFileFilt | |||
| } | ||||
| 
 | ||||
| // Archive atomically archives the given directory as a tarball to the given v1beta1.Artifact path, excluding
 | ||||
| // directories and any ArchiveFileFilter matches.
 | ||||
| // directories and any ArchiveFileFilter matches. While archiving, any environment specific data (for example,
 | ||||
| // the user and group name) is stripped from file headers.
 | ||||
| // If successful, it sets the checksum and last update time on the artifact.
 | ||||
| func (s *Storage) Archive(artifact *sourcev1.Artifact, dir string, filter ArchiveFileFilter) (err error) { | ||||
| 	if f, err := os.Stat(dir); os.IsNotExist(err) || !f.IsDir() { | ||||
|  | @ -220,6 +221,16 @@ func (s *Storage) Archive(artifact *sourcev1.Artifact, dir string, filter Archiv | |||
| 		} | ||||
| 		header.Name = relFilePath | ||||
| 
 | ||||
| 		// We want to remove any environment specific data as well, this
 | ||||
| 		// ensures the checksum is purely content based.
 | ||||
| 		header.Gid = 0 | ||||
| 		header.Uid = 0 | ||||
| 		header.Uname = "" | ||||
| 		header.Gname = "" | ||||
| 		header.ModTime = time.Time{} | ||||
| 		header.AccessTime = time.Time{} | ||||
| 		header.ChangeTime = time.Time{} | ||||
| 
 | ||||
| 		if err := tw.WriteHeader(header); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue