forked from TrueCloudLab/distribution
Merge pull request #4009 from thaJeztah/2.8_backport_enable_build_tags
[release/2.8 backport] Enable Go build tags
This commit is contained in:
commit
27206bcd3b
9 changed files with 42 additions and 34 deletions
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
@ -9,7 +9,7 @@ jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
DOCKER_BUILDTAGS: "include_oss include_gcs"
|
BUILDTAGS: "include_oss,include_gcs"
|
||||||
CGO_ENABLED: 1
|
CGO_ENABLED: 1
|
||||||
GO111MODULE: "auto"
|
GO111MODULE: "auto"
|
||||||
GOPATH: ${{ github.workspace }}
|
GOPATH: ${{ github.workspace }}
|
||||||
|
|
|
@ -114,4 +114,4 @@ the registry binary generated in the "./bin" directory:
|
||||||
### Optional build tags
|
### Optional build tags
|
||||||
|
|
||||||
Optional [build tags](http://golang.org/pkg/go/build/) can be provided using
|
Optional [build tags](http://golang.org/pkg/go/build/) can be provided using
|
||||||
the environment variable `DOCKER_BUILDTAGS`.
|
the environment variable `BUILDTAGS`.
|
||||||
|
|
|
@ -22,12 +22,12 @@ RUN --mount=target=. \
|
||||||
FROM base AS build
|
FROM base AS build
|
||||||
ARG TARGETPLATFORM
|
ARG TARGETPLATFORM
|
||||||
ARG LDFLAGS="-s -w"
|
ARG LDFLAGS="-s -w"
|
||||||
ARG BUILDTAGS="include_oss include_gcs"
|
ARG BUILDTAGS="include_oss,include_gcs"
|
||||||
RUN --mount=type=bind,target=/go/src/github.com/docker/distribution,rw \
|
RUN --mount=type=bind,target=/go/src/github.com/docker/distribution,rw \
|
||||||
--mount=type=cache,target=/root/.cache/go-build \
|
--mount=type=cache,target=/root/.cache/go-build \
|
||||||
--mount=target=/go/pkg/mod,type=cache \
|
--mount=target=/go/pkg/mod,type=cache \
|
||||||
--mount=type=bind,source=/tmp/.ldflags,target=/tmp/.ldflags,from=version \
|
--mount=type=bind,source=/tmp/.ldflags,target=/tmp/.ldflags,from=version \
|
||||||
set -x ; xx-go build -trimpath -ldflags "$(cat /tmp/.ldflags) ${LDFLAGS}" -tags="${BUILDTAGS}" -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
|
&& xx-verify --static /usr/bin/registry
|
||||||
|
|
||||||
FROM scratch AS binary
|
FROM scratch AS binary
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -50,7 +50,7 @@ version/version.go:
|
||||||
|
|
||||||
check: ## run all linters (TODO: enable "unused", "varcheck", "ineffassign", "unconvert", "staticheck", "goimports", "structcheck")
|
check: ## run all linters (TODO: enable "unused", "varcheck", "ineffassign", "unconvert", "staticheck", "goimports", "structcheck")
|
||||||
@echo "$(WHALE) $@"
|
@echo "$(WHALE) $@"
|
||||||
@GO111MODULE=off golangci-lint run
|
@GO111MODULE=off golangci-lint --build-tags "${BUILDTAGS}" run
|
||||||
|
|
||||||
test: ## run tests, except integration test with test.short
|
test: ## run tests, except integration test with test.short
|
||||||
@echo "$(WHALE) $@"
|
@echo "$(WHALE) $@"
|
||||||
|
|
|
@ -1,18 +1,17 @@
|
||||||
|
//go:build include_gcs
|
||||||
|
// +build include_gcs
|
||||||
|
|
||||||
// Package gcs provides a storagedriver.StorageDriver implementation to
|
// Package gcs provides a storagedriver.StorageDriver implementation to
|
||||||
// store blobs in Google cloud storage.
|
// store blobs in Google cloud storage.
|
||||||
//
|
//
|
||||||
// This package leverages the google.golang.org/cloud/storage client library
|
// This package leverages the google.golang.org/cloud/storage client library
|
||||||
//for interfacing with gcs.
|
// for interfacing with gcs.
|
||||||
//
|
//
|
||||||
// Because gcs is a key, value store the Stat call does not support last modification
|
// Because gcs is a key, value store the Stat call does not support last modification
|
||||||
// time for directories (directories are an abstraction for key, value stores)
|
// time for directories (directories are an abstraction for key, value stores)
|
||||||
//
|
//
|
||||||
// Note that the contents of incomplete uploads are not accessible even though
|
// Note that the contents of incomplete uploads are not accessible even though
|
||||||
// Stat returns their length
|
// Stat returns their length
|
||||||
//
|
|
||||||
//go:build include_gcs
|
|
||||||
// +build include_gcs
|
|
||||||
|
|
||||||
package gcs
|
package gcs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -62,7 +61,6 @@ var rangeHeader = regexp.MustCompile(`^bytes=([0-9])+-([0-9]+)$`)
|
||||||
// driverParameters is a struct that encapsulates all of the driver parameters after all values have been set
|
// driverParameters is a struct that encapsulates all of the driver parameters after all values have been set
|
||||||
type driverParameters struct {
|
type driverParameters struct {
|
||||||
bucket string
|
bucket string
|
||||||
config *jwt.Config
|
|
||||||
email string
|
email string
|
||||||
privateKey []byte
|
privateKey []byte
|
||||||
client *http.Client
|
client *http.Client
|
||||||
|
@ -88,6 +86,8 @@ func (factory *gcsDriverFactory) Create(parameters map[string]interface{}) (stor
|
||||||
return FromParameters(parameters)
|
return FromParameters(parameters)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ storagedriver.StorageDriver = &driver{}
|
||||||
|
|
||||||
// driver is a storagedriver.StorageDriver implementation backed by GCS
|
// driver is a storagedriver.StorageDriver implementation backed by GCS
|
||||||
// Objects are stored at absolute keys in the provided bucket.
|
// Objects are stored at absolute keys in the provided bucket.
|
||||||
type driver struct {
|
type driver struct {
|
||||||
|
@ -298,7 +298,7 @@ func (d *driver) Reader(context context.Context, path string, offset int64) (io.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if offset == int64(obj.Size) {
|
if offset == obj.Size {
|
||||||
return ioutil.NopCloser(bytes.NewReader([]byte{})), nil
|
return ioutil.NopCloser(bytes.NewReader([]byte{})), nil
|
||||||
}
|
}
|
||||||
return nil, storagedriver.InvalidOffsetError{Path: path, Offset: offset}
|
return nil, storagedriver.InvalidOffsetError{Path: path, Offset: offset}
|
||||||
|
@ -434,7 +434,6 @@ func putContentsClose(wc *storage.Writer, contents []byte) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
wc.CloseWithError(err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return wc.Close()
|
return wc.Close()
|
||||||
|
@ -614,10 +613,10 @@ func (d *driver) Stat(context context.Context, path string) (storagedriver.FileI
|
||||||
//try to get as folder
|
//try to get as folder
|
||||||
dirpath := d.pathToDirKey(path)
|
dirpath := d.pathToDirKey(path)
|
||||||
|
|
||||||
var query *storage.Query
|
query := &storage.Query{
|
||||||
query = &storage.Query{}
|
Prefix: dirpath,
|
||||||
query.Prefix = dirpath
|
MaxResults: 1,
|
||||||
query.MaxResults = 1
|
}
|
||||||
|
|
||||||
objects, err := storageListObjects(gcsContext, d.bucket, query)
|
objects, err := storageListObjects(gcsContext, d.bucket, query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -639,12 +638,12 @@ func (d *driver) Stat(context context.Context, path string) (storagedriver.FileI
|
||||||
}
|
}
|
||||||
|
|
||||||
// List returns a list of the objects that are direct descendants of the
|
// List returns a list of the objects that are direct descendants of the
|
||||||
//given path.
|
// given path.
|
||||||
func (d *driver) List(context context.Context, path string) ([]string, error) {
|
func (d *driver) List(context context.Context, path string) ([]string, error) {
|
||||||
var query *storage.Query
|
query := &storage.Query{
|
||||||
query = &storage.Query{}
|
Delimiter: "/",
|
||||||
query.Delimiter = "/"
|
Prefix: d.pathToDirKey(path),
|
||||||
query.Prefix = d.pathToDirKey(path)
|
}
|
||||||
list := make([]string, 0, 64)
|
list := make([]string, 0, 64)
|
||||||
for {
|
for {
|
||||||
objects, err := storageListObjects(d.context(context), d.bucket, query)
|
objects, err := storageListObjects(d.context(context), d.bucket, query)
|
||||||
|
|
|
@ -59,7 +59,7 @@ func init() {
|
||||||
panic(fmt.Sprintf("Error reading JWT config : %s", err))
|
panic(fmt.Sprintf("Error reading JWT config : %s", err))
|
||||||
}
|
}
|
||||||
email = jwtConfig.Email
|
email = jwtConfig.Email
|
||||||
privateKey = []byte(jwtConfig.PrivateKey)
|
privateKey = jwtConfig.PrivateKey
|
||||||
if len(privateKey) == 0 {
|
if len(privateKey) == 0 {
|
||||||
panic("Error reading JWT config : missing private_key property")
|
panic("Error reading JWT config : missing private_key property")
|
||||||
}
|
}
|
||||||
|
@ -260,6 +260,9 @@ func TestEmptyRootList(t *testing.T) {
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
keys, err := emptyRootDriver.List(ctx, "/")
|
keys, err := emptyRootDriver.List(ctx, "/")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected error listing empty root content: %v", err)
|
||||||
|
}
|
||||||
for _, path := range keys {
|
for _, path := range keys {
|
||||||
if !storagedriver.PathRegexp.MatchString(path) {
|
if !storagedriver.PathRegexp.MatchString(path) {
|
||||||
t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp)
|
t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp)
|
||||||
|
@ -267,6 +270,9 @@ func TestEmptyRootList(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
keys, err = slashRootDriver.List(ctx, "/")
|
keys, err = slashRootDriver.List(ctx, "/")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected error listing slash root content: %v", err)
|
||||||
|
}
|
||||||
for _, path := range keys {
|
for _, path := range keys {
|
||||||
if !storagedriver.PathRegexp.MatchString(path) {
|
if !storagedriver.PathRegexp.MatchString(path) {
|
||||||
t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp)
|
t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp)
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//go:build include_oss
|
||||||
|
// +build include_oss
|
||||||
|
|
||||||
// Package oss provides a storagedriver.StorageDriver implementation to
|
// Package oss provides a storagedriver.StorageDriver implementation to
|
||||||
// store blobs in Aliyun OSS cloud storage.
|
// 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
|
// 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)
|
// time for directories (directories are an abstraction for key, value stores)
|
||||||
//
|
|
||||||
//go:build include_oss
|
|
||||||
// +build include_oss
|
|
||||||
|
|
||||||
package oss
|
package oss
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -38,12 +37,11 @@ const driverName = "oss"
|
||||||
const minChunkSize = 5 << 20
|
const minChunkSize = 5 << 20
|
||||||
|
|
||||||
const defaultChunkSize = 2 * minChunkSize
|
const defaultChunkSize = 2 * minChunkSize
|
||||||
const defaultTimeout = 2 * time.Minute // 2 minute timeout per chunk
|
|
||||||
|
|
||||||
// listMax is the largest amount of objects you can request from OSS in a list call
|
// listMax is the largest amount of objects you can request from OSS in a list call
|
||||||
const listMax = 1000
|
const listMax = 1000
|
||||||
|
|
||||||
//DriverParameters A struct that encapsulates all of the driver parameters after all values have been set
|
// DriverParameters A struct that encapsulates all of the driver parameters after all values have been set
|
||||||
type DriverParameters struct {
|
type DriverParameters struct {
|
||||||
AccessKeyID string
|
AccessKeyID string
|
||||||
AccessKeySecret string
|
AccessKeySecret string
|
||||||
|
@ -68,6 +66,8 @@ func (factory *ossDriverFactory) Create(parameters map[string]interface{}) (stor
|
||||||
return FromParameters(parameters)
|
return FromParameters(parameters)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ storagedriver.StorageDriver = &driver{}
|
||||||
|
|
||||||
type driver struct {
|
type driver struct {
|
||||||
Client *oss.Client
|
Client *oss.Client
|
||||||
Bucket *oss.Bucket
|
Bucket *oss.Bucket
|
||||||
|
@ -498,11 +498,6 @@ func parseError(path string, err error) error {
|
||||||
return err
|
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 {
|
func (d *driver) getOptions() oss.Options {
|
||||||
return oss.Options{ServerSideEncryption: d.Encrypt}
|
return oss.Options{ServerSideEncryption: d.Encrypt}
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,6 +128,9 @@ func TestEmptyRootList(t *testing.T) {
|
||||||
defer rootedDriver.Delete(ctx, filename)
|
defer rootedDriver.Delete(ctx, filename)
|
||||||
|
|
||||||
keys, err := emptyRootDriver.List(ctx, "/")
|
keys, err := emptyRootDriver.List(ctx, "/")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected error listing empty root content: %v", err)
|
||||||
|
}
|
||||||
for _, path := range keys {
|
for _, path := range keys {
|
||||||
if !storagedriver.PathRegexp.MatchString(path) {
|
if !storagedriver.PathRegexp.MatchString(path) {
|
||||||
t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp)
|
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, "/")
|
keys, err = slashRootDriver.List(ctx, "/")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected error listing slash root content: %v", err)
|
||||||
|
}
|
||||||
for _, path := range keys {
|
for _, path := range keys {
|
||||||
if !storagedriver.PathRegexp.MatchString(path) {
|
if !storagedriver.PathRegexp.MatchString(path) {
|
||||||
t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp)
|
t.Fatalf("unexpected string in path: %q != %q", path, storagedriver.PathRegexp)
|
||||||
|
|
|
@ -137,6 +137,8 @@ func (factory *s3DriverFactory) Create(parameters map[string]interface{}) (stora
|
||||||
return FromParameters(parameters)
|
return FromParameters(parameters)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ storagedriver.StorageDriver = &driver{}
|
||||||
|
|
||||||
type driver struct {
|
type driver struct {
|
||||||
S3 *s3.S3
|
S3 *s3.S3
|
||||||
Bucket string
|
Bucket string
|
||||||
|
|
Loading…
Reference in a new issue