[VOL-5026] - Build and (pre-) deploy repo:voltha-go
Makefile
--------
o Refactor test and mod-* targets per voltha-openolt-adatpter/Makefile.
o Logic moved into makefiles/analysis/{coverage,sca}.mk
o Inline ( set -euo pipefail && cmd | tee log) in test-coverage.
o Improve error handling, "cmd | tee" will silently mask shell exit status.
o make test failing locally (docker image: cpu profile acces denied).
o Local problem, send a job through jenkins for accurate status.
makefiles/
----------
o Copy in library makefiles
o Esp docker/include.mk
compose/*/*.yaml
----------------
o Update copyright notice
db/*/*.go
rw_core/*/*.go
--------------
o Run gofmt -s -w on source to fix latent linting problmes that fail jobs.
Change-Id: If7cd349822edd0e604ac4daf27d315f528c6bcf6
diff --git a/Makefile b/Makefile
index 4141898..88cc745 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
# -*- makefile -*-
# -----------------------------------------------------------------------#
# Copyright 2016-2023 Open Networking Foundation (ONF) and the ONF Contributors
-
+#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
@@ -15,6 +15,8 @@
# limitations under the License.
# -----------------------------------------------------------------------
+$(if $(DEBUG),$(warning ENTER))
+
.DEFAULT_GOAL := help
$(if $(VERBOSE),$(eval export VERBOSE=$(VERBOSE))) # visible to include(s)
@@ -63,15 +65,6 @@
DOCKER_BUILD_ARGS_LOCAL ?= ${DOCKER_BUILD_ARGS} \
--build-arg LOCAL_PROTOS=${LOCAL_PROTOS}
-# tool containers
-VOLTHA_TOOLS_VERSION ?= 2.4.0
-
-GO = docker run --rm --user $$(id -u):$$(id -g) -v ${CURDIR}:/app $(shell test -t 0 && echo "-it") -v gocache:/.cache -v gocache-${VOLTHA_TOOLS_VERSION}:/go/pkg voltha/voltha-ci-tools:${VOLTHA_TOOLS_VERSION}-golang go
-GO_JUNIT_REPORT = docker run --rm --user $$(id -u):$$(id -g) -v ${CURDIR}:/app -i voltha/voltha-ci-tools:${VOLTHA_TOOLS_VERSION}-go-junit-report go-junit-report
-GOCOVER_COBERTURA = docker run --rm --user $$(id -u):$$(id -g) -v ${CURDIR}:/app/src/github.com/opencord/voltha-go -i voltha/voltha-ci-tools:${VOLTHA_TOOLS_VERSION}-gocover-cobertura gocover-cobertura
-GOLANGCI_LINT = docker run --rm --user $$(id -u):$$(id -g) -v ${CURDIR}:/app $(shell test -t 0 && echo "-it") -v gocache:/.cache -v gocache-${VOLTHA_TOOLS_VERSION}:/go/pkg voltha/voltha-ci-tools:${VOLTHA_TOOLS_VERSION}-golangci-lint golangci-lint
-HADOLINT = docker run --rm --user $$(id -u):$$(id -g) -v ${CURDIR}:/app $(shell test -t 0 && echo "-it") voltha/voltha-ci-tools:${VOLTHA_TOOLS_VERSION}-hadolint hadolint
-
.PHONY: docker-build local-protos local-lib-go help
.DEFAULT_GOAL := help
@@ -79,7 +72,7 @@
## Local Development Helpers
local-protos: ## Copies a local version of the voltha-protos dependency into the vendor directory
ifdef LOCAL_PROTOS
- rm -rf vendor/github.com/opencord/voltha-protos/v5/go
+ $(RM) -r vendor/github.com/opencord/voltha-protos/v5/go
mkdir -p vendor/github.com/opencord/voltha-protos/v5/go
cp -r ${LOCAL_PROTOS}/go/* vendor/github.com/opencord/voltha-protos/v5/go
endif
@@ -87,7 +80,7 @@
## Local Development Helpers
local-lib-go: ## Copies a local version of the voltha-lib-go dependency into the vendor directory
ifdef LOCAL_LIB_GO
- rm -rf vendor/github.com/opencord/voltha-lib-go/v7/pkg
+ $(RM) -r vendor/github.com/opencord/voltha-lib-go/v7/pkg
mkdir -p vendor/github.com/opencord/voltha-lib-go/v7/pkg
cp -r ${LOCAL_LIB_GO}/pkg/* vendor/github.com/opencord/voltha-lib-go/v7/pkg/
endif
@@ -102,10 +95,9 @@
docker-build-args := $(null)# comment line for debug mode
docker-build: local-protos local-lib-go ## Build core docker image (set BUILD_PROFILED=true to also build the profiled image)
- @echo "======================================================================="
- @echo " ** TARGET: $@"
- @echo "======================================================================="
- $(MAKE) --no-print-directory init-test-results
+
+ $(call banner-enter,$@)
+ $(MAKE) --no-print-directory test-coverage-init
docker $(docker-build-args) build $(DOCKER_BUILD_ARGS) -t ${RWCORE_IMAGENAME}:${DOCKER_TAG} --target ${DOCKER_TARGET} -f docker/Dockerfile.rw_core .
ifdef BUILD_PROFILED
@@ -117,11 +109,16 @@
docker build $(DOCKER_BUILD_ARGS) --target dev --build-arg GOLANG_IMAGE=golang:1.13.8-buster --build-arg CGO_PARAMETER="CGO_ENABLED=1" --build-arg DEPLOY_IMAGE=debian:buster-slim --build-arg EXTRA_GO_BUILD_TAGS="--race" -t ${RWCORE_IMAGENAME}:${DOCKER_TAG}-rd -f docker/Dockerfile.rw_core .
endif
+ $(call banner-leave,$@)
+
## -----------------------------------------------------------------------
## Intent:
## -----------------------------------------------------------------------
docker-push: ## Push the docker images to an external repository
- docker push ${RWCORE_IMAGENAME}:${DOCKER_TAG}
+
+ $(call banner-enter,$@)
+
+docker push ${RWCORE_IMAGENAME}:${DOCKER_TAG}
ifdef BUILD_PROFILED
docker push ${RWCORE_IMAGENAME}:${DOCKER_TAG}-profile
endif
@@ -132,7 +129,14 @@
@if [ "`kind get clusters | grep voltha-$(TYPE)`" = '' ]; then echo "no voltha-$(TYPE) cluster found" && exit 1; fi
kind load docker-image ${RWCORE_IMAGENAME}:${DOCKER_TAG} --name=voltha-$(TYPE) --nodes $(shell kubectl get nodes --template='{{range .items}}{{.metadata.name}},{{end}}' | rev | cut -c 2- | rev)
+ $(call banner-leave,$@)
+
+## -----------------------------------------------------------------------
## lint and unit tests
+## -----------------------------------------------------------------------
+
+# [TODO]
+# o Merge lint-* targets with repo:openolt-adapter/Makefile
lint-dockerfile: ## Perform static analysis on Dockerfile
@echo "Running Dockerfile lint check..."
@@ -146,10 +150,8 @@
@git status > /dev/null
@git diff-index --quiet HEAD -- go.mod go.sum vendor || (echo "ERROR: Staged or modified files must be committed before running this test" && git status -- go.mod go.sum vendor && exit 1)
@[[ `git ls-files --exclude-standard --others go.mod go.sum vendor` == "" ]] || (echo "ERROR: Untracked files must be cleaned up before running this test" && git status -- go.mod go.sum vendor && exit 1)
- ${GO} mod tidy
- # This command is destructive, vendor/ removed
- ${GO} mod vendor
+ $(MAKE) mod-update
@git status > /dev/null
@git diff-index --quiet HEAD -- go.mod go.sum vendor || (echo "ERROR: Modified files detected after running go mod tidy / go mod vendor" && git status -- go.mod go.sum vendor && git checkout -- go.mod go.sum vendor && exit 1)
@@ -160,47 +162,63 @@
## -----------------------------------------------------------------------
lint: lint-mod lint-dockerfile ## Run all lint targets
-sca: ## Runs static code analysis with the golangci-lint tool
- @$(RM) -r ./sca-report
- @mkdir -p ./sca-report
- @echo "Running static code analysis..."
- @${GOLANGCI_LINT} run --deadline=6m --out-format junit-xml ./... \
- | tee ./sca-report/sca-report.xml
- @echo ""
- @echo "Static code analysis OK"
+include $(MAKEDIR)/analysis/include.mk
## -----------------------------------------------------------------------
## -----------------------------------------------------------------------
tests-dir := ./tests/results
tests-coverage := $(tests-dir)/go-test-coverage
tests-results := $(tests-dir)/go-test-results
-test: local-lib-go ## Run unit tests
- $(MAKE) --no-print-directory init-test-results
- $(HIDE)${GO} test -mod=vendor -v -coverprofile $(tests-coverage).out -covermode count ./... 2>&1 | tee $(tests-results).out ;\
- RETURN=$$? ;\
- ${GO_JUNIT_REPORT} < $(tests-results).out > $(tests-results).xml ;\
- ${GOCOVER_COBERTURA} < $(tests-coverage).out > $(tests-coverage).xml ;\
- exit $$RETURN
+
+test :: test-coverage ## Run unit tests
+test-coverage : local-lib-go
clean :: distclean ## Removes any local filesystem artifacts generated by a build
distclean sterile :: ## Removes any local filesystem artifacts generated by a build or test run
$(RM) -r ./sca-report
-mod-update: ## Update go mod files
- ${GO} mod tidy
- ${GO} mod vendor
-
fmt: ## Formats the soure code to go best practice style
+# gofmt -s -w $(PACKAGES)
@go fmt ${PACKAGES}
-## ---------------------------------------------------------------------------
-## Intent: Prep work, test -coverprofile fails w/o a file on disk ?!?
-## ---------------------------------------------------------------------------
-init-test-results:
- @$(RM) -r tests/results
- @mkdir -p tests/results
- @touch $(tests-coverage).out
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: mod-update
+mod-update: mod-tidy mod-vendor
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+.PHONY: mod-tidy
+mod-tidy:
+ $(call banner-enter,$@)
+ ${GO} mod tidy
+ $(call banner-leave,$@)
+
+## -----------------------------------------------------------------------
+## Intent: Refresh vendor/ directory package source
+## -----------------------------------------------------------------------
+## Note: This target is destructive, vendor/ directory will be removed.
+## Todo: Update logic to checkout version on demand VS checkin a static
+## copy of vendor/ sources then augment. Logically removal of
+## files under revision control is strange.
+## -----------------------------------------------------------------------
+.PHONY: mod-vendor
+mod-vendor:
+ $(call banner-enter,$@)
+ @$(if $(LOCAL_FIX_PERMS),chmod 777 .)
+ ${GO} mod vendor
+ @$(if $(LOCAL_FIX_PERMS),chmod 755 .)
+ $(call banner-leave,$@)
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+help ::
+ @echo '[MOD UPDATE]'
+ @echo ' mod-update'
+ @echo ' LOCAL_FIX_PERMS=1 Hack to fix docker filesystem access problems'
+ @echo ' mod-tidy'
+ @echo ' mod-vendor'
## ---------------------------------------------------------------------------
# For each makefile target, add ## <description> on the target line and it will be listed by 'make help'
@@ -212,11 +230,12 @@
@echo " versions Display version-by-tool used while building"
ifdef VERBOSE
@echo
- @echo " init-test-results Massage tests/results to fix coverage reporting"
endif
@echo
@grep --no-filename '^[[:alpha:]_-]*:.* ##' $(MAKEFILE_LIST) \
| sort \
| awk 'BEGIN {FS=":.* ## "}; {printf "%-25s : %s\n", $$1, $$2};'
+$(if $(DEBUG),$(warning LEAVE))
+
# [EOF]