2019-06-20 18:36:40 -05:00
export GO111MODULE = on
2019-07-20 19:30:58 -05:00
TOP_LEVEL = $( shell git rev-parse --show-toplevel)
2019-09-16 13:01:59 -05:00
COMMIT_HASH = $( shell git describe --always --tags --long)
2021-10-15 10:05:00 -05:00
GO_VERSION = $( shell go version | awk '{print $$3}' )
2021-12-15 17:47:53 -05:00
COMMIT ?= $( if $( shell git status --porcelain --untracked-files= no) ,$( COMMIT_HASH) -dirty,$( COMMIT_HASH) )
2019-08-14 14:35:51 -05:00
CONTAINER_RUNTIME := $( shell command -v podman 2> /dev/null || echo docker)
2020-07-09 02:10:11 -05:00
TMPDIR := $( shell mktemp -d)
2022-03-22 17:13:10 -05:00
TOOLSDIR := $( shell pwd ) /hack/tools
PATH := bin:$( TOOLSDIR) /bin:$( PATH)
2020-11-05 20:57:06 -05:00
STACKER := $( shell which stacker)
2021-12-13 14:23:31 -05:00
GOLINTER := $( TOOLSDIR) /bin/golangci-lint
2022-05-18 15:19:39 -05:00
GOLINTER_VERSION := v1.46.2
2021-12-07 08:07:22 -05:00
NOTATION := $( TOOLSDIR) /bin/notation
2022-03-22 17:13:10 -05:00
BATS := $( TOOLSDIR) /bin/bats
2022-03-15 09:34:39 -05:00
TESTDATA := $( TOP_LEVEL) /test/data
2021-12-03 12:42:03 -05:00
OS ?= linux
ARCH ?= amd64
2022-01-13 17:06:35 -05:00
BENCH_OUTPUT ?= stdout
2022-04-27 01:00:20 -05:00
EXTENSIONS ?= sync,search,scrub,metrics,ui_base
comma := ,
hyphen := -
extended-name :=
2019-06-20 18:36:40 -05:00
.PHONY : all
2022-03-15 09:34:39 -05:00
all : modcheck swagger binary binary -minimal binary -debug cli bench exporter -minimal verify -config test covhtml check
2022-03-02 16:20:35 -05:00
.PHONY : modcheck
modcheck :
go mod tidy
2022-01-24 00:19:01 -05:00
2022-04-27 01:00:20 -05:00
.PHONY : create -name
create-name :
i f d e f E X T E N S I O N S
$( eval extended-name= -$( subst $( comma) ,$( hyphen) ,$( EXTENSIONS) ) )
e n d i f
2022-07-07 06:11:01 -05:00
.PHONY : build -metadata
build-metadata :
echo "Imports: \n"
go list -tags $( EXTENSIONS) -f '{{ join .Imports "\n" }}' ./... | sort -u
echo "\n Files: \n"
go list -tags $( EXTENSIONS) -f '{{ join .GoFiles "\n" }}' ./... | sort -u
2022-04-27 01:00:20 -05:00
.PHONY : binary
2022-07-07 06:11:01 -05:00
binary : modcheck swagger create -name build -metadata
2022-04-27 01:00:20 -05:00
env CGO_ENABLED = 0 GOOS = $( OS) GOARCH = $( ARCH) go build -o bin/zot-$( OS) -$( ARCH) -buildmode= pie -tags $( EXTENSIONS) ,containers_image_openpgp -v -trimpath -ldflags " -X zotregistry.io/zot/pkg/api/config.Commit= ${ COMMIT } -X zotregistry.io/zot/pkg/api/config.BinaryType= $( extended-name) -X zotregistry.io/zot/pkg/api/config.GoVersion= ${ GO_VERSION } -s -w " ./cmd/zot
2022-01-24 00:19:01 -05:00
.PHONY : binary -debug
2022-07-07 06:11:01 -05:00
binary-debug : modcheck swagger create -name build -metadata
2022-04-27 01:00:20 -05:00
env CGO_ENABLED = 0 GOOS = $( OS) GOARCH = $( ARCH) go build -o bin/zot-$( OS) -$( ARCH) -debug -buildmode= pie -tags $( EXTENSIONS) ,containers_image_openpgp -v -gcflags all = '-N -l' -ldflags " -X zotregistry.io/zot/pkg/api/config.Commit= ${ COMMIT } -X zotregistry.io/zot/pkg/api/config.BinaryType= $( extended-name) -X zotregistry.io/zot/pkg/api/config.GoVersion= ${ GO_VERSION } " ./cmd/zot
2020-10-14 16:47:20 -05:00
.PHONY : binary -minimal
2022-07-07 06:11:01 -05:00
binary-minimal : EXTENSIONS =minimal # tag doesn't exist, but we need it to overwrite default value and indicate that we have no extension in build-metadata
binary-minimal : modcheck swagger build -metadata
2022-04-27 01:00:20 -05:00
env CGO_ENABLED = 0 GOOS = $( OS) GOARCH = $( ARCH) go build -o bin/zot-$( OS) -$( ARCH) -minimal -buildmode= pie -tags containers_image_openpgp -v -trimpath -ldflags " -X zotregistry.io/zot/pkg/api/config.Commit= ${ COMMIT } -X zotregistry.io/zot/pkg/api/config.BinaryType=minimal -X zotregistry.io/zot/pkg/api/config.GoVersion= ${ GO_VERSION } -s -w " ./cmd/zot
2021-12-15 17:14:53 -05:00
2022-01-10 20:15:35 -05:00
.PHONY : cli
2022-07-07 06:11:01 -05:00
cli : modcheck create -name build -metadata
2022-04-27 01:00:20 -05:00
env CGO_ENABLED = 0 GOOS = $( OS) GOARCH = $( ARCH) go build -o bin/zli-$( OS) -$( ARCH) -buildmode= pie -tags $( EXTENSIONS) ,ui_base,containers_image_openpgp -v -trimpath -ldflags " -X zotregistry.io/zot/pkg/api/config.Commit= ${ COMMIT } -X zotregistry.io/zot/pkg/api/config.BinaryType= $( extended-name) -X zotregistry.io/zot/pkg/api/config.GoVersion= ${ GO_VERSION } -s -w " ./cmd/zli
2022-01-10 20:15:35 -05:00
2021-12-10 17:27:40 -05:00
.PHONY : bench
2022-07-07 06:11:01 -05:00
bench : modcheck create -name build -metadata
2022-04-27 01:00:20 -05:00
env CGO_ENABLED = 0 GOOS = $( OS) GOARCH = $( ARCH) go build -o bin/zb-$( OS) -$( ARCH) -buildmode= pie -tags $( EXTENSIONS) ,containers_image_openpgp -v -trimpath -ldflags " -X zotregistry.io/zot/pkg/api/config.Commit= ${ COMMIT } -X zotregistry.io/zot/pkg/api/config.BinaryType= $( extended-name) -X zotregistry.io/zot/pkg/api/config.GoVersion= ${ GO_VERSION } -s -w " ./cmd/zb
2021-12-10 17:27:40 -05:00
2021-10-15 10:05:00 -05:00
.PHONY : exporter -minimal
2022-07-07 06:11:01 -05:00
exporter-minimal : EXTENSIONS =minimal # tag doesn't exist, but we need it to overwrite default value and indicate that we have no extension in build-metadata
exporter-minimal : modcheck build -metadata
2022-04-27 01:00:20 -05:00
env CGO_ENABLED = 0 GOOS = $( OS) GOARCH = $( ARCH) go build -o bin/zxp-$( OS) -$( ARCH) -buildmode= pie -tags containers_image_openpgp -v -trimpath ./cmd/zxp
2019-06-20 18:36:40 -05:00
.PHONY : test
2022-03-15 09:34:39 -05:00
test : check -skopeo $( TESTDATA ) $( NOTATION )
2022-04-27 01:00:20 -05:00
go test -failfast -tags $( EXTENSIONS) ,containers_image_openpgp -v -trimpath -race -timeout 15m -cover -coverpkg ./... -coverprofile= coverage-extended.txt -covermode= atomic ./...
go test -failfast -tags containers_image_openpgp -v -trimpath -race -cover -coverpkg ./... -coverprofile= coverage-minimal.txt -covermode= atomic ./...
2021-12-20 23:18:13 -05:00
# development-mode unit tests possibly using failure injection
2022-04-27 01:00:20 -05:00
go test -failfast -tags dev,$( EXTENSIONS) ,containers_image_openpgp -v -trimpath -race -timeout 15m -cover -coverpkg ./... -coverprofile= coverage-dev-extended.txt -covermode= atomic ./pkg/test/... ./pkg/api/... ./pkg/storage/... ./pkg/extensions/sync/... -run ^TestInject
go test -failfast -tags dev,containers_image_openpgp -v -trimpath -race -cover -coverpkg ./... -coverprofile= coverage-dev-minimal.txt -covermode= atomic ./pkg/test/... ./pkg/storage/... ./pkg/extensions/sync/... -run ^TestInject
go test -failfast -tags stress,$( EXTENSIONS) ,containers_image_openpgp -v -trimpath -race -timeout 15m ./pkg/cli/stress_test.go
2019-06-20 18:36:40 -05:00
2022-03-15 09:34:39 -05:00
.PHONY : privileged -test
privileged-test : check -skopeo $( TESTDATA ) $( NOTATION )
2022-04-27 01:00:20 -05:00
go test -failfast -tags needprivileges,$( EXTENSIONS) ,containers_image_openpgp -v -trimpath -race -timeout 15m -cover -coverpkg ./... -coverprofile= coverage-dev-needprivileges.txt -covermode= atomic ./pkg/storage/... ./pkg/cli/... -run ^TestElevatedPrivileges
2022-03-15 09:34:39 -05:00
$(TESTDATA) : check -skopeo
$( shell mkdir -p ${ TESTDATA } ; cd ${ TESTDATA } ; ../scripts/gen_certs.sh; cd ${ TOP_LEVEL } ; skopeo --insecure-policy copy -q docker://public.ecr.aws/t0x7q1g8/centos:7 oci:${ TESTDATA } /zot-test:0.0.1; skopeo --insecure-policy copy -q docker://public.ecr.aws/t0x7q1g8/centos:8 oci:${ TESTDATA } /zot-cve-test:0.0.1)
$( shell chmod -R a = rwx ${ TESTDATA } )
2022-01-13 17:06:35 -05:00
.PHONY : run -bench
run-bench : binary bench
2022-03-24 12:52:39 -05:00
bin/zot-$( OS) -$( ARCH) serve examples/config-bench.json &
2022-01-13 17:06:35 -05:00
sleep 5
2022-01-24 00:19:01 -05:00
bin/zb-$( OS) -$( ARCH) -c 10 -n 100 -o $( BENCH_OUTPUT) http://localhost:8080
killall -r zot-*
2022-01-13 17:06:35 -05:00
2021-12-07 08:07:22 -05:00
.PHONY : check -skopeo
check-skopeo :
skopeo -v || ( echo "You need skopeo to be installed in order to run tests" ; exit 1)
$(NOTATION) :
mkdir -p $( TOOLSDIR) /bin
curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v0.7.1-alpha.1/notation_0.7.1-alpha.1_linux_amd64.tar.gz
tar xvzf notation.tar.gz -C $( TOOLSDIR) /bin notation
rm notation.tar.gz
2020-01-24 16:32:38 -05:00
.PHONY : covhtml
covhtml :
2021-12-20 23:18:13 -05:00
go install github.com/wadey/gocovmerge@latest
2022-03-15 09:34:39 -05:00
gocovmerge coverage*.txt > coverage.txt
2020-01-24 16:32:38 -05:00
go tool cover -html= coverage.txt -o coverage.html
2021-12-13 14:23:31 -05:00
$(GOLINTER) :
mkdir -p $( TOOLSDIR) /bin
2022-03-21 12:37:23 -05:00
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $( TOOLSDIR) /bin $( GOLINTER_VERSION)
2021-12-13 14:23:31 -05:00
$( GOLINTER) version
2019-06-20 18:36:40 -05:00
.PHONY : check
2021-12-13 14:23:31 -05:00
check : ./golangcilint .yaml $( GOLINTER )
2022-04-27 01:00:20 -05:00
$( GOLINTER) --config ./golangcilint.yaml run --enable-all --out-format= colored-line-number --build-tags containers_image_openpgp ./...
$( GOLINTER) --config ./golangcilint.yaml run --enable-all --out-format= colored-line-number --build-tags $( EXTENSIONS) ,containers_image_openpgp ./...
$( GOLINTER) --config ./golangcilint.yaml run --enable-all --out-format= colored-line-number --build-tags dev,containers_image_openpgp ./...
$( GOLINTER) --config ./golangcilint.yaml run --enable-all --out-format= colored-line-number --build-tags dev,$( EXTENSIONS) ,containers_image_openpgp ./...
$( GOLINTER) --config ./golangcilint.yaml run --enable-all --out-format= colored-line-number --build-tags stress,$( EXTENSIONS) ,containers_image_openpgp ./...
2019-06-20 18:36:40 -05:00
2021-10-20 16:01:06 -05:00
swagger/docs.go :
2022-02-24 15:31:36 -05:00
swag -v || go install github.com/swaggo/swag/cmd/swag@1.6.3
2021-10-20 16:01:06 -05:00
swag init -o swagger -g pkg/api/routes.go
2019-06-20 18:36:40 -05:00
2021-10-20 16:01:06 -05:00
.PHONY : swagger
2022-02-24 15:31:36 -05:00
swagger : swagger /docs .go pkg /api /routes .go
2019-08-28 17:58:00 -05:00
2020-12-03 14:33:38 -05:00
.PHONY : update -licenses
update-licenses :
2022-01-24 12:31:39 -05:00
@echo "Detecting and updating licenses ... please be patient!"
go install github.com/google/go-licenses@latest
$( shell echo "Module | License URL | License" > THIRD-PARTY-LICENSES.md; echo "---|---|---" >> THIRD-PARTY-LICENSES.md; for i in $$ ( go list -m all | awk '{print $$1}' ) ; do l = $$ ( go-licenses csv $$ i 2>/dev/null) ; if [ $$ ? -ne 0 ] ; then continue ; fi ; echo $$ l | tr \, \| | tr ' ' '\n' ; done | sort -u >> THIRD-PARTY-LICENSES.md)
.PHONY : check -licenses
check-licenses :
go install github.com/google/go-licenses@latest
2022-04-27 01:00:20 -05:00
@for tag in " $( EXTENSIONS) ,containers_image_openpgp " " $( EXTENSIONS) ,containers_image_openpgp " ; do \
2022-01-24 12:31:39 -05:00
echo Evaluating tag: $$ tag; \
for mod in $$ ( go list -m -f '{{if not (or .Indirect .Main)}}{{.Path}}{{end}}' all) ; do \
while [ x$$ mod != x ] ; do \
echo -n " Checking $$ mod ... " ; \
result = $$ ( GOFLAGS = " -tags= $$ {tag} " go-licenses check $$ mod 2>& 1) ; \
if [ $$ ? -eq 0 ] ; then \
echo OK; \
break; \
fi ; \
echo " $$ {result} " | grep -q "Forbidden" ; \
if [ $$ ? -eq 0 ] ; then \
echo FAIL; \
exit 1; \
fi ; \
echo " $$ {result} " | egrep -q "missing go.sum entry|no required module provides package|build constraints exclude all|updates to go.mod needed" ; \
if [ $$ ? -eq 0 ] ; then \
echo UNKNOWN; \
break; \
fi ; \
done ; \
done ; \
done
2020-12-03 14:33:38 -05:00
2019-06-20 18:36:40 -05:00
.PHONY : clean
clean :
2021-12-10 17:27:40 -05:00
rm -f bin/z*
2021-12-13 14:23:31 -05:00
rm -rf hack
2022-05-10 03:28:26 -05:00
rm -rf test/data/zot-test
rm -rf test/data/zot-cve-test
2019-06-20 18:36:40 -05:00
.PHONY : run
run : binary test
2022-01-24 00:19:01 -05:00
./bin/zot-$( OS) -$( ARCH) serve examples/config-test.json
2019-08-14 14:35:51 -05:00
2022-01-07 07:58:02 -05:00
.PHONY : verify -config
2022-03-30 08:02:03 -05:00
verify-config : _verify -config verify -config -warnings verify -config -commited
.PHONY : _verify -config
_verify-config : binary
rm -f output.txt
$( foreach file, $( wildcard examples/config-*) , ./bin/zot-$( OS) -$( ARCH) verify $( file) 2>& 1 | tee -a output.txt || exit 1; )
.PHONY : verify -config -warnings
verify-config-warnings : _verify -config
$( eval WARNINGS = $( shell cat output.txt | grep -c '"warn"' ) )
$( eval ERRORS = $( shell cat output.txt | grep -c '"error"' ) )
@if [ $( WARNINGS) != 0 ] || [ $( ERRORS) != 0 ] ; then \
echo "verify-config-warnings: warnings or errors found while verifying configs" ; \
rm output.txt; \
exit 1; \
fi
rm -f output.txt
.PHONY : verify -config -commited
verify-config-commited : _verify -config
$( eval UNCOMMITED_FILES = $( shell git status --porcelain | grep -c examples/config-) )
@if [ $( UNCOMMITED_FILES) != 0 ] ; then \
echo "Uncommited config files, make sure all config files are commited. Verify might have changed a config file." ; \
exit 1; \
fi ; \
2022-01-07 07:58:02 -05:00
2022-07-15 06:10:51 -05:00
.PHONY : gqlgen
gqlgen :
cd pkg/extensions/search; \
go run github.com/99designs/gqlgen version; \
go run github.com/99designs/gqlgen generate
.PHONY : verify -gql -committed
verify-gql-committed :
$( eval UNCOMMITED_FILES = $( shell git status --porcelain | grep -c extensions/search) )
@if [ $( UNCOMMITED_FILES) != 0 ] ; then \
echo "Updated gql files uncommitted, make sure all gql files are committed:" ; \
git status; \
exit 1; \
fi ; \
2019-08-14 14:35:51 -05:00
.PHONY : binary -container
binary-container :
2020-11-05 20:39:14 -05:00
${ CONTAINER_RUNTIME } build ${ BUILD_ARGS } -f Dockerfile -t zot-build:latest .
.PHONY : run -container
run-container :
2021-12-03 22:50:58 -05:00
${ CONTAINER_RUNTIME } run --rm --security-opt label = disable -v $$ ( pwd ) :/go/src/github.com/project-zot/zot \
2020-11-05 20:39:14 -05:00
zot-build:latest
2019-08-14 18:26:25 -05:00
.PHONY : binary -stacker
binary-stacker :
2020-11-05 20:57:06 -05:00
sudo ${ STACKER } build --substitute PWD = $$ PWD
2020-01-24 12:54:38 -05:00
.PHONY : image
image :
${ CONTAINER_RUNTIME } build ${ BUILD_ARGS } -f Dockerfile -t zot:latest .
2022-03-22 17:13:10 -05:00
$(BATS) :
rm -rf bats-core; \
git clone https://github.com/bats-core/bats-core.git; \
cd bats-core; ./install.sh $( TOOLSDIR) ; cd ..; \
rm -rf bats-core
.PHONY : push -pull
push-pull : binary check -skopeo $( BATS )
2022-04-27 01:00:20 -05:00
$( BATS) --trace --print-output-on-failure test/blackbox/pushpull.bats
2022-03-22 17:13:10 -05:00
.PHONY : push -pull -verbose
push-pull-verbose : binary check -skopeo $( BATS )
2022-04-27 01:00:20 -05:00
$( BATS) --trace --verbose-run --print-output-on-failure --show-output-of-passing-tests test/blackbox/pushpull.bats
.PHONY : bats -sync
bats-sync : EXTENSIONS =sync
bats-sync : binary binary -minimal check -skopeo $( BATS )
$( BATS) --trace --print-output-on-failure test/blackbox/sync.bats
.PHONY : bats -sync -verbose
bats-sync-verbose : EXTENSIONS =sync
bats-sync-verbose : binary binary -minimal check -skopeo $( BATS )
$( BATS) --trace -t -x -p --verbose-run --print-output-on-failure --show-output-of-passing-tests test/blackbox/sync.bats
.PHONY : bats -cve
bats-cve : EXTENSIONS =ui_base
bats-cve : binary cli check -skopeo $( BATS )
$( BATS) --trace --print-output-on-failure test/blackbox/cve.bats
.PHONY : bats -cve -verbose
bats-cve-verbose : EXTENSIONS =ui_base
bats-cve-verbose : binary cli check -skopeo $( BATS )
$( BATS) --trace -t -x -p --verbose-run --print-output-on-failure --show-output-of-passing-tests test/blackbox/cve.bats
.PHONY : bats -scrub
bats-scrub : EXTENSIONS =scrub
bats-scrub : binary check -skopeo $( BATS )
$( BATS) --trace --print-output-on-failure test/blackbox/scrub.bats
.PHONY : bats -scrub -verbose
bats-scrub-verbose : EXTENSIONS =scrub
bats-scrub-verbose : binary check -skopeo $( BATS )
$( BATS) --trace -p --verbose-run --print-output-on-failure --show-output-of-passing-tests test/blackbox/scrub.bats
.PHONY : bats -metrics
bats-metrics : EXTENSIONS =metrics
bats-metrics : binary check -skopeo $( BATS )
$( BATS) --trace --print-output-on-failure test/blackbox/metrics.bats
.PHONY : bats -metrics -verbose
bats-metrics-verbose : EXTENSIONS =metrics
bats-metrics-verbose : binary check -skopeo $( BATS )
$( BATS) --trace -p --verbose-run --print-output-on-failure --show-output-of-passing-tests test/blackbox/metrics.bats