diff --git a/BUILDING.md b/BUILDING.md index 1fe2269b..4b405309 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -97,7 +97,7 @@ Run `make validate` to run the validators, including the linter and vendor valid ### Optional build tags Optional [build tags](http://golang.org/pkg/go/build/) can be provided using -the environment variable `DOCKER_BUILDTAGS`. +the environment variable `BUILDTAGS`.
noresumabledigest
diff --git a/Dockerfile b/Dockerfile index c6ebb789..85fa1335 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,12 +22,12 @@ RUN --mount=target=. \ FROM base AS build ARG TARGETPLATFORM ARG LDFLAGS="-s -w" -ARG BUILDTAGS="include_oss include_gcs" +ARG BUILDTAGS="include_oss,include_gcs" RUN --mount=type=bind,target=/src,rw \ --mount=type=cache,target=/root/.cache/go-build \ --mount=target=/go/pkg/mod,type=cache \ --mount=type=bind,source=/tmp/.ldflags,target=/tmp/.ldflags,from=version \ - set -x ; xx-go build -trimpath -ldflags "$(cat /tmp/.ldflags) ${LDFLAGS}" -o /usr/bin/registry ./cmd/registry \ + set -x ; xx-go build -tags "${BUILDTAGS}" -trimpath -ldflags "$(cat /tmp/.ldflags) ${LDFLAGS}" -o /usr/bin/registry ./cmd/registry \ && xx-verify --static /usr/bin/registry FROM scratch AS binary diff --git a/dockerfiles/lint.Dockerfile b/dockerfiles/lint.Dockerfile index a9743c16..69453ba3 100644 --- a/dockerfiles/lint.Dockerfile +++ b/dockerfiles/lint.Dockerfile @@ -3,6 +3,7 @@ ARG GO_VERSION=1.19.9 ARG ALPINE_VERSION=3.16 ARG GOLANGCI_LINT_VERSION=v1.52 +ARG BUILDTAGS="include_oss,include_gcs" FROM golangci/golangci-lint:${GOLANGCI_LINT_VERSION}-alpine AS golangci-lint @@ -15,4 +16,4 @@ ENV GOFLAGS="-buildvcs=false" RUN --mount=type=bind,target=. \ --mount=type=cache,target=/root/.cache \ --mount=from=golangci-lint,source=/usr/bin/golangci-lint,target=/usr/bin/golangci-lint \ - golangci-lint run + golangci-lint --build-tags "${BUILDTAGS}" run diff --git a/registry/storage/driver/gcs/gcs.go b/registry/storage/driver/gcs/gcs.go index d47db2e1..eb1d636b 100644 --- a/registry/storage/driver/gcs/gcs.go +++ b/registry/storage/driver/gcs/gcs.go @@ -1,3 +1,6 @@ +//go:build include_gcs +// +build include_gcs + // Package gcs provides a storagedriver.StorageDriver implementation to // store blobs in Google cloud storage. // @@ -9,10 +12,6 @@ // // Note that the contents of incomplete uploads are not accessible even though // Stat returns their length -// -//go:build include_gcs -// +build include_gcs - package gcs import ( @@ -66,7 +65,6 @@ var _ storagedriver.FileWriter = &writer{} // driverParameters is a struct that encapsulates all of the driver parameters after all values have been set type driverParameters struct { bucket string - config *jwt.Config email string privateKey []byte client *http.Client @@ -93,6 +91,8 @@ func (factory *gcsDriverFactory) Create(parameters map[string]interface{}) (stor return FromParameters(parameters) } +var _ storagedriver.StorageDriver = &driver{} + // driver is a storagedriver.StorageDriver implementation backed by GCS // Objects are stored at absolute keys in the provided bucket. type driver struct { @@ -289,6 +289,8 @@ func (d *driver) GetContent(ctx context.Context, path string) ([]byte, error) { // PutContent stores the []byte content at a location designated by "path". // This should primarily be used for small objects. func (d *driver) PutContent(ctx context.Context, path string, contents []byte) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() wc := d.gcs.Bucket(d.bucket).Object(d.pathToKey(path)).NewWriter(ctx) wc.ContentType = "application/octet-stream" return putContentsClose(wc, contents) @@ -312,7 +314,7 @@ func (d *driver) Reader(ctx context.Context, path string, offset int64) (io.Read if err != nil { return nil, err } - if offset == int64(obj.Size) { + if offset == obj.Size { return io.NopCloser(bytes.NewReader([]byte{})), nil } return nil, storagedriver.InvalidOffsetError{Path: path, Offset: offset} @@ -450,7 +452,6 @@ func putContentsClose(wc *storage.Writer, contents []byte) error { } } if err != nil { - wc.CloseWithError(err) return err } return wc.Close() @@ -630,9 +631,9 @@ func (d *driver) Stat(ctx context.Context, path string) (storagedriver.FileInfo, // try to get as folder dirpath := d.pathToDirKey(path) - var query *storage.Query - query = &storage.Query{} - query.Prefix = dirpath + query := &storage.Query{ + Prefix: dirpath, + } objects, err := storageListObjects(ctx, d.bucket, query, d.gcs) if err != nil { @@ -656,10 +657,10 @@ func (d *driver) Stat(ctx context.Context, path string) (storagedriver.FileInfo, // List returns a list of the objects that are direct descendants of the // given path. func (d *driver) List(ctx context.Context, path string) ([]string, error) { - var query *storage.Query - query = &storage.Query{} - query.Delimiter = "/" - query.Prefix = d.pathToDirKey(path) + query := &storage.Query{ + Delimiter: "/", + Prefix: d.pathToDirKey(path), + } list := make([]string, 0, 64) objects, err := storageListObjects(ctx, d.bucket, query, d.gcs) if err != nil { @@ -690,7 +691,7 @@ func (d *driver) List(ctx context.Context, path string) ([]string, error) { // Move moves an object stored at sourcePath to destPath, removing the // original object. func (d *driver) Move(ctx context.Context, sourcePath string, destPath string) error { - _, err := storageCopyObject(ctx, d.bucket, d.pathToKey(sourcePath), d.bucket, d.pathToKey(destPath), nil, d.gcs) + _, err := storageCopyObject(ctx, d.bucket, d.pathToKey(sourcePath), d.bucket, d.pathToKey(destPath), d.gcs) if err != nil { if status, ok := err.(*googleapi.Error); ok { if status.Code == http.StatusNotFound { @@ -794,7 +795,7 @@ func storageListObjects(ctx context.Context, bucket string, q *storage.Query, gc return objs, nil } -func storageCopyObject(ctx context.Context, srcBucket, srcName string, destBucket, destName string, attrs *storage.ObjectAttrs, gcs *storage.Client) (*storage.ObjectAttrs, error) { +func storageCopyObject(ctx context.Context, srcBucket, srcName string, destBucket, destName string, gcs *storage.Client) (*storage.ObjectAttrs, error) { src := gcs.Bucket(srcBucket).Object(srcName) dst := gcs.Bucket(destBucket).Object(destName) attrs, err := dst.CopierFrom(src).Run(ctx) diff --git a/registry/storage/driver/gcs/gcs_test.go b/registry/storage/driver/gcs/gcs_test.go index 74c590f3..d9f0da3e 100644 --- a/registry/storage/driver/gcs/gcs_test.go +++ b/registry/storage/driver/gcs/gcs_test.go @@ -66,7 +66,7 @@ func init() { panic(fmt.Sprintf("Error reading JWT config : %s", err)) } email = jwtConfig.Email - privateKey = []byte(jwtConfig.PrivateKey) + privateKey = jwtConfig.PrivateKey if len(privateKey) == 0 { panic("Error reading JWT config : missing private_key property") } @@ -262,6 +262,9 @@ func TestEmptyRootList(t *testing.T) { } }() keys, err := emptyRootDriver.List(ctx, "/") + if err != nil { + t.Fatalf("unexpected error listing empty root content: %v", err) + } for _, path := range keys { if !storagedriver.PathRegexp.MatchString(path) { t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) @@ -269,6 +272,9 @@ func TestEmptyRootList(t *testing.T) { } keys, err = slashRootDriver.List(ctx, "/") + if err != nil { + t.Fatalf("unexpected error listing slash root content: %v", err) + } for _, path := range keys { if !storagedriver.PathRegexp.MatchString(path) { t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) diff --git a/registry/storage/driver/oss/oss.go b/registry/storage/driver/oss/oss.go index 6d42af95..aa3f0893 100644 --- a/registry/storage/driver/oss/oss.go +++ b/registry/storage/driver/oss/oss.go @@ -1,3 +1,6 @@ +//go:build include_oss +// +build include_oss + // Package oss provides a storagedriver.StorageDriver implementation to // store blobs in Aliyun OSS cloud storage. // @@ -6,10 +9,6 @@ // // Because OSS is a key, value store the Stat call does not support last modification // time for directories (directories are an abstraction for key, value stores) -// -//go:build include_oss -// +build include_oss - package oss import ( @@ -70,6 +69,8 @@ func (factory *ossDriverFactory) Create(parameters map[string]interface{}) (stor return FromParameters(parameters) } +var _ storagedriver.StorageDriver = &driver{} + type driver struct { Client *oss.Client Bucket *oss.Bucket @@ -507,11 +508,6 @@ func parseError(path string, err error) error { return err } -func hasCode(err error, code string) bool { - ossErr, ok := err.(*oss.Error) - return ok && ossErr.Code == code -} - func (d *driver) getOptions() oss.Options { return oss.Options{ ServerSideEncryption: d.Encrypt, diff --git a/registry/storage/driver/oss/oss_test.go b/registry/storage/driver/oss/oss_test.go index a23e166a..f1518424 100644 --- a/registry/storage/driver/oss/oss_test.go +++ b/registry/storage/driver/oss/oss_test.go @@ -128,6 +128,9 @@ func TestEmptyRootList(t *testing.T) { defer rootedDriver.Delete(ctx, filename) keys, err := emptyRootDriver.List(ctx, "/") + if err != nil { + t.Fatalf("unexpected error listing empty root content: %v", err) + } for _, path := range keys { if !storagedriver.PathRegexp.MatchString(path) { t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp) @@ -135,6 +138,9 @@ func TestEmptyRootList(t *testing.T) { } keys, err = slashRootDriver.List(ctx, "/") + if err != nil { + t.Fatalf("unexpected error listing slash root content: %v", err) + } for _, path := range keys { if !storagedriver.PathRegexp.MatchString(path) { t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp)