You've already forked goreleaser
							
							
				mirror of
				https://github.com/goreleaser/goreleaser.git
				synced 2025-10-30 23:58:09 +02:00 
			
		
		
		
	refactor: artifact checksum (#771)
This commit is contained in:
		
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							02b70e1e9b
						
					
				
				
					commit
					6217d1e90d
				
			
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -28,7 +28,7 @@ check: | ||||
|  | ||||
| # Run all the tests | ||||
| test: | ||||
| 	go test $(TEST_OPTIONS) -v -failfast -race -coverpkg=./... -covermode=atomic -coverprofile=coverage.txt $(SOURCE_FILES) -run $(TEST_PATTERN) -timeout=2m | ||||
| 	go test $(TEST_OPTIONS) -failfast -race -coverpkg=./... -covermode=atomic -coverprofile=coverage.txt $(SOURCE_FILES) -run $(TEST_PATTERN) -timeout=2m | ||||
| .PHONY: test | ||||
|  | ||||
| # Run all the tests and opens the coverage report | ||||
|   | ||||
| @@ -2,6 +2,10 @@ | ||||
| package artifact | ||||
|  | ||||
| import ( | ||||
| 	"crypto/sha256" | ||||
| 	"encoding/hex" | ||||
| 	"io" | ||||
| 	"os" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/apex/log" | ||||
| @@ -39,6 +43,22 @@ type Artifact struct { | ||||
| 	Extra  map[string]string | ||||
| } | ||||
|  | ||||
| // Checksum calculates the SHA256 checksum of the artifact. | ||||
| func (a Artifact) Checksum() (string, error) { | ||||
| 	log.Debugf("calculating sha256sum for %s", a.Path) | ||||
| 	file, err := os.Open(a.Path) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	defer file.Close() // nolint: errcheck | ||||
| 	var hash = sha256.New() | ||||
| 	_, err = io.Copy(hash, file) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return hex.EncodeToString(hash.Sum(nil)), nil | ||||
| } | ||||
|  | ||||
| // Artifacts is a list of artifacts | ||||
| type Artifacts struct { | ||||
| 	items []Artifact | ||||
|   | ||||
| @@ -2,9 +2,12 @@ package artifact | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"path/filepath" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| 	"github.com/stretchr/testify/require" | ||||
| 	"golang.org/x/sync/errgroup" | ||||
| ) | ||||
|  | ||||
| @@ -135,3 +138,27 @@ func TestGroupByPlatform(t *testing.T) { | ||||
| 	assert.Len(t, groups["linuxamd64"], 2) | ||||
| 	assert.Len(t, groups["linuxarm6"], 1) | ||||
| } | ||||
|  | ||||
| func TestChecksum(t *testing.T) { | ||||
| 	folder, err := ioutil.TempDir("", "goreleasertest") | ||||
| 	require.NoError(t, err) | ||||
| 	var file = filepath.Join(folder, "subject") | ||||
| 	require.NoError(t, ioutil.WriteFile(file, []byte("lorem ipsum"), 0644)) | ||||
|  | ||||
| 	var artifact = Artifact{ | ||||
| 		Path: file, | ||||
| 	} | ||||
|  | ||||
| 	sum, err := artifact.Checksum() | ||||
| 	require.NoError(t, err) | ||||
| 	require.Equal(t, "5e2bf57d3f40c4b6df69daf1936cb766f832374b4fc0259a7cbff06e2f70f269", sum) | ||||
| } | ||||
|  | ||||
| func TestChecksumFileDoesntExist(t *testing.T) { | ||||
| 	var artifact = Artifact{ | ||||
| 		Path: "/tmp/adasdasdas/asdasd/asdas", | ||||
| 	} | ||||
| 	sum, err := artifact.Checksum() | ||||
| 	require.EqualError(t, err, `open /tmp/adasdasdas/asdasd/asdas: no such file or directory`) | ||||
| 	require.Empty(t, sum) | ||||
| } | ||||
|   | ||||
| @@ -1,33 +0,0 @@ | ||||
| // Package checksum contain algorithms to checksum files | ||||
| package checksum | ||||
|  | ||||
| import ( | ||||
| 	"crypto/sha256" | ||||
| 	"encoding/hex" | ||||
| 	"hash" | ||||
| 	"io" | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| // SHA256 sum of the given file | ||||
| func SHA256(path string) (string, error) { | ||||
| 	return calculate(sha256.New(), path) | ||||
| } | ||||
|  | ||||
| func calculate(hash hash.Hash, path string) (string, error) { | ||||
| 	file, err := os.Open(path) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	defer file.Close() // nolint: errcheck | ||||
|  | ||||
| 	return doCalculate(hash, file) | ||||
| } | ||||
|  | ||||
| func doCalculate(hash hash.Hash, file io.Reader) (string, error) { | ||||
| 	_, err := io.Copy(hash, file) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return hex.EncodeToString(hash.Sum(nil)), nil | ||||
| } | ||||
| @@ -1,38 +0,0 @@ | ||||
| package checksum | ||||
|  | ||||
| import ( | ||||
| 	"crypto/sha256" | ||||
| 	"io/ioutil" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestChecksums(t *testing.T) { | ||||
| 	folder, err := ioutil.TempDir("", "goreleasertest") | ||||
| 	assert.NoError(t, err) | ||||
| 	var file = filepath.Join(folder, "subject") | ||||
| 	assert.NoError(t, ioutil.WriteFile(file, []byte("lorem ipsum"), 0644)) | ||||
| 	sum, err := SHA256(file) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.Equal(t, "5e2bf57d3f40c4b6df69daf1936cb766f832374b4fc0259a7cbff06e2f70f269", sum) | ||||
| } | ||||
|  | ||||
| func TestOpenFailure(t *testing.T) { | ||||
| 	sum, err := SHA256("/tmp/this-file-wont-exist-I-hope") | ||||
| 	assert.Empty(t, sum) | ||||
| 	assert.Error(t, err) | ||||
| } | ||||
|  | ||||
| func TestFileDoesntExist(t *testing.T) { | ||||
| 	folder, err := ioutil.TempDir("", "goreleasertest") | ||||
| 	assert.NoError(t, err) | ||||
| 	var path = filepath.Join(folder, "subject") | ||||
| 	file, err := os.Create(path) | ||||
| 	assert.NoError(t, err) | ||||
| 	assert.NoError(t, file.Close()) | ||||
| 	_, err = doCalculate(sha256.New(), file) | ||||
| 	assert.Error(t, err) | ||||
| } | ||||
| @@ -52,7 +52,6 @@ func (Pipe) Default(ctx *context.Context) error { | ||||
| // | ||||
| // Docs: https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-Example-DeployinganArtifact | ||||
| func (Pipe) Run(ctx *context.Context) error { | ||||
|  | ||||
| 	if len(ctx.Config.Artifactories) == 0 { | ||||
| 		return pipeline.Skip("artifactory section is not configured") | ||||
| 	} | ||||
|   | ||||
| @@ -12,7 +12,6 @@ import ( | ||||
| 	"github.com/apex/log" | ||||
|  | ||||
| 	"github.com/goreleaser/goreleaser/internal/artifact" | ||||
| 	"github.com/goreleaser/goreleaser/internal/checksum" | ||||
| 	"github.com/goreleaser/goreleaser/internal/client" | ||||
| 	"github.com/goreleaser/goreleaser/internal/pipeline" | ||||
| 	"github.com/goreleaser/goreleaser/internal/tmpl" | ||||
| @@ -169,7 +168,7 @@ func doBuildFormula(data templateData) (out bytes.Buffer, err error) { | ||||
| } | ||||
|  | ||||
| func dataFor(ctx *context.Context, artifact artifact.Artifact) (result templateData, err error) { | ||||
| 	sum, err := checksum.SHA256(artifact.Path) | ||||
| 	sum, err := artifact.Checksum() | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|   | ||||
| @@ -10,7 +10,6 @@ import ( | ||||
| 	"github.com/apex/log" | ||||
|  | ||||
| 	"github.com/goreleaser/goreleaser/internal/artifact" | ||||
| 	"github.com/goreleaser/goreleaser/internal/checksum" | ||||
| 	"github.com/goreleaser/goreleaser/internal/semerrgroup" | ||||
| 	"github.com/goreleaser/goreleaser/internal/tmpl" | ||||
| 	"github.com/goreleaser/goreleaser/pkg/context" | ||||
| @@ -70,7 +69,7 @@ func (Pipe) Run(ctx *context.Context) (err error) { | ||||
|  | ||||
| func checksums(file *os.File, artifact artifact.Artifact) error { | ||||
| 	log.WithField("file", artifact.Name).Info("checksumming") | ||||
| 	sha, err := checksum.SHA256(artifact.Path) | ||||
| 	sha, err := artifact.Checksum() | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user