github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/Makefile (about)

     1  # Copyright hechain All Rights Reserved.
     2  # Copyright London Stock Exchange Group All Rights Reserved.
     3  #
     4  # SPDX-License-Identifier: Apache-2.0
     5  #
     6  # -------------------------------------------------------------
     7  # This makefile defines the following targets
     8  #
     9  #   - all (default) - builds all targets and runs all non-integration tests/checks
    10  #   - basic-checks - performs basic checks like license, spelling, trailing spaces and linter
    11  #   - check-deps - check for vendored dependencies that are no longer used
    12  #   - checks - runs all non-integration tests/checks
    13  #   - clean-all - superset of 'clean' that also removes persistent state
    14  #   - clean - cleans the build area
    15  #   - configtxgen - builds a native configtxgen binary
    16  #   - configtxlator - builds a native configtxlator binary
    17  #   - cryptogen - builds a native cryptogen binary
    18  #   - desk-check - runs linters and verify to test changed packages
    19  #   - dist-clean - clean release packages for all target platforms
    20  #   - docker[-clean] - ensures all docker images are available[/cleaned]
    21  #   - docker-list - generates a list of docker images that 'make docker' produces
    22  #   - docker-tag-latest - re-tags the images made by 'make docker' with the :latest tag
    23  #   - docker-tag-stable - re-tags the images made by 'make docker' with the :stable tag
    24  #   - docker-thirdparty - pulls thirdparty images (kafka,zookeeper,couchdb)
    25  #   - docs - builds the documentation in html format
    26  #   - gotools - installs go tools like golint
    27  #   - help-docs - generate the command reference docs
    28  #   - integration-test-prereqs - setup prerequisites for integration tests
    29  #   - integration-test - runs the integration tests
    30  #   - ledgerutil - builds a native ledgerutil binary
    31  #   - license - checks go source files for Apache license header
    32  #   - linter - runs all code checks
    33  #   - native - ensures all native binaries are available
    34  #   - orderer - builds a native fabric orderer binary
    35  #   - orderer-docker[-clean] - ensures the orderer container is available[/cleaned]
    36  #   - osnadmin - builds a native fabric osnadmin binary
    37  #   - peer - builds a native fabric peer binary
    38  #   - peer-docker[-clean] - ensures the peer container is available[/cleaned]
    39  #   - profile - runs unit tests for all packages in coverprofile mode (slow)
    40  #   - protos - generate all protobuf artifacts based on .proto files
    41  #   - publish-images - publishes release docker images to nexus3 or docker hub.
    42  #   - release-all - builds release packages for all target platforms
    43  #   - release - builds release packages for the host platform
    44  #   - tools-docker[-clean] - ensures the tools container is available[/cleaned]
    45  #   - unit-test-clean - cleans unit test state (particularly from docker)
    46  #   - unit-test - runs the go-test based unit tests
    47  #   - verify - runs unit tests for only the changed package tree
    48  
    49  ALPINE_VER ?= 3.14
    50  BASE_VERSION = 2.4.3
    51  
    52  # 3rd party image version
    53  # These versions are also set in the runners in ./integration/runners/
    54  COUCHDB_VER ?= 3.1.1
    55  KAFKA_VER ?= 5.3.1
    56  ZOOKEEPER_VER ?= 5.3.1
    57  
    58  # Disable implicit rules
    59  .SUFFIXES:
    60  MAKEFLAGS += --no-builtin-rules
    61  
    62  BUILD_DIR ?= build
    63  
    64  EXTRA_VERSION ?= $(shell git rev-parse --short HEAD)
    65  PROJECT_VERSION=$(BASE_VERSION)-snapshot-$(EXTRA_VERSION)
    66  
    67  # TWO_DIGIT_VERSION is derived, e.g. "2.0", especially useful as a local tag
    68  # for two digit references to most recent baseos and ccenv patch releases
    69  TWO_DIGIT_VERSION = $(shell echo $(BASE_VERSION) | cut -d '.' -f 1,2)
    70  
    71  PKGNAME = github.com/hyperledger/fabric
    72  ARCH=$(shell go env GOARCH)
    73  MARCH=$(shell go env GOOS)-$(shell go env GOARCH)
    74  
    75  # defined in common/metadata/metadata.go
    76  METADATA_VAR = Version=$(BASE_VERSION)
    77  METADATA_VAR += CommitSHA=$(EXTRA_VERSION)
    78  METADATA_VAR += BaseDockerLabel=$(BASE_DOCKER_LABEL)
    79  METADATA_VAR += DockerNamespace=$(DOCKER_NS)
    80  
    81  GO_VER = 1.17.5
    82  GO_TAGS ?=
    83  
    84  RELEASE_EXES = orderer $(TOOLS_EXES)
    85  RELEASE_IMAGES = baseos ccenv orderer peer tools
    86  RELEASE_PLATFORMS = darwin-amd64 linux-amd64 windows-amd64
    87  TOOLS_EXES = configtxgen configtxlator cryptogen discover ledgerutil osnadmin peer
    88  
    89  pkgmap.configtxgen    := $(PKGNAME)/cmd/configtxgen
    90  pkgmap.configtxlator  := $(PKGNAME)/cmd/configtxlator
    91  pkgmap.cryptogen      := $(PKGNAME)/cmd/cryptogen
    92  pkgmap.discover       := $(PKGNAME)/cmd/discover
    93  pkgmap.ledgerutil     := $(PKGNAME)/cmd/ledgerutil
    94  pkgmap.orderer        := $(PKGNAME)/cmd/orderer
    95  pkgmap.osnadmin       := $(PKGNAME)/cmd/osnadmin
    96  pkgmap.peer           := $(PKGNAME)/cmd/peer
    97  
    98  .DEFAULT_GOAL := all
    99  
   100  include docker-env.mk
   101  include gotools.mk
   102  
   103  .PHONY: all
   104  all: check-go-version native docker checks
   105  
   106  .PHONY: checks
   107  checks: basic-checks unit-test integration-test
   108  
   109  .PHONY: basic-checks
   110  basic-checks: check-go-version license spelling references trailing-spaces linter check-help-docs check-metrics-doc filename-spaces check-swagger
   111  
   112  .PHONY: desk-checks
   113  desk-check: checks verify
   114  
   115  .PHONY: help-docs
   116  help-docs: native
   117  	@scripts/help_docs.sh
   118  
   119  .PHONY: check-help-docs
   120  check-help-docs: native
   121  	@scripts/help_docs.sh check
   122  
   123  .PHONY: spelling
   124  spelling: gotool.misspell
   125  	@scripts/check_spelling.sh
   126  
   127  .PHONY: references
   128  references:
   129  	@scripts/check_references.sh
   130  
   131  .PHONY: license
   132  license:
   133  	@scripts/check_license.sh
   134  
   135  .PHONY: trailing-spaces
   136  trailing-spaces:
   137  	@scripts/check_trailingspaces.sh
   138  
   139  .PHONY: gotools
   140  gotools: gotools-install
   141  
   142  .PHONY: check-go-version
   143  check-go-version:
   144  	@scripts/check_go_version.sh $(GO_VER)
   145  
   146  .PHONY: integration-test
   147  integration-test: integration-test-prereqs
   148  	./scripts/run-integration-tests.sh
   149  
   150  .PHONY: integration-test-prereqs
   151  integration-test-prereqs: gotool.ginkgo baseos-docker ccenv-docker docker-thirdparty ccaasbuilder
   152  
   153  .PHONY: unit-test
   154  unit-test: unit-test-clean docker-thirdparty-couchdb
   155  	./scripts/run-unit-tests.sh
   156  
   157  .PHONY: unit-tests
   158  unit-tests: unit-test
   159  
   160  # Pull thirdparty docker images based on the latest baseimage release version
   161  # Also pull ccenv-1.4 for compatibility test to ensure pre-2.0 installed chaincodes
   162  # can be built by a peer configured to use the ccenv-1.4 as the builder image.
   163  .PHONY: docker-thirdparty
   164  docker-thirdparty: docker-thirdparty-couchdb
   165  	docker pull confluentinc/cp-zookeeper:${ZOOKEEPER_VER}
   166  	docker pull confluentinc/cp-kafka:${KAFKA_VER}
   167  	docker pull hyperledger/fabric-ccenv:1.4
   168  
   169  .PHONY: docker-thirdparty-couchdb
   170  docker-thirdparty-couchdb:
   171  	docker pull couchdb:${COUCHDB_VER}
   172  
   173  .PHONY: verify
   174  verify: export JOB_TYPE=VERIFY
   175  verify: unit-test
   176  
   177  .PHONY: profile
   178  profile: export JOB_TYPE=PROFILE
   179  profile: unit-test
   180  
   181  .PHONY: linter
   182  linter: check-deps gotool.goimports gotool.gofumpt gotool.staticcheck
   183  	@echo "LINT: Running code checks.."
   184  	./scripts/golinter.sh
   185  
   186  .PHONY: check-deps
   187  check-deps:
   188  	@echo "DEP: Checking for dependency issues.."
   189  	./scripts/check_deps.sh
   190  
   191  .PHONY: check-metrics-docs
   192  check-metrics-doc:
   193  	@echo "METRICS: Checking for outdated reference documentation.."
   194  	./scripts/metrics_doc.sh check
   195  
   196  .PHONY: generate-metrics-docs
   197  generate-metrics-doc:
   198  	@echo "Generating metrics reference documentation..."
   199  	./scripts/metrics_doc.sh generate
   200  
   201  .PHONY: check-swagger
   202  check-swagger: gotool.swagger
   203  	@echo "SWAGGER: Checking for outdated swagger..."
   204  	./scripts/swagger.sh check
   205  
   206  .PHONY: generate-swagger
   207  generate-swagger: gotool.swagger
   208  	@echo "Generating swagger..."
   209  	./scripts/swagger.sh generate
   210  
   211  .PHONY: protos
   212  protos: gotool.protoc-gen-go
   213  	@echo "Compiling non-API protos..."
   214  	./scripts/compile_protos.sh
   215  
   216  .PHONY: native
   217  native: $(RELEASE_EXES)
   218  
   219  .PHONY: tools
   220  tools: $(TOOLS_EXES)
   221  
   222  .PHONY: $(RELEASE_EXES)
   223  $(RELEASE_EXES): %: $(BUILD_DIR)/bin/%
   224  
   225  $(BUILD_DIR)/bin/%: GO_LDFLAGS = $(METADATA_VAR:%=-X $(PKGNAME)/common/metadata.%)
   226  $(BUILD_DIR)/bin/%:
   227  	@echo "Building $@"
   228  	@mkdir -p $(@D)
   229  	GOBIN=$(abspath $(@D)) go install -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
   230  	@touch $@
   231  
   232  .PHONY: docker
   233  docker: $(RELEASE_IMAGES:%=%-docker)
   234  
   235  .PHONY: $(RELEASE_IMAGES:%=%-docker)
   236  $(RELEASE_IMAGES:%=%-docker): %-docker: $(BUILD_DIR)/images/%/$(DUMMY)
   237  
   238  $(BUILD_DIR)/images/baseos/$(DUMMY):  BUILD_CONTEXT=images/baseos
   239  $(BUILD_DIR)/images/ccenv/$(DUMMY):   BUILD_CONTEXT=images/ccenv
   240  $(BUILD_DIR)/images/peer/$(DUMMY):    BUILD_ARGS=--build-arg GO_TAGS=${GO_TAGS}
   241  $(BUILD_DIR)/images/orderer/$(DUMMY): BUILD_ARGS=--build-arg GO_TAGS=${GO_TAGS}
   242  $(BUILD_DIR)/images/tools/$(DUMMY):   BUILD_ARGS=--build-arg GO_TAGS=${GO_TAGS}
   243  
   244  $(BUILD_DIR)/images/%/$(DUMMY):
   245  	@echo "Building Docker image $(DOCKER_NS)/fabric-$*"
   246  	@mkdir -p $(@D)
   247  	$(DBUILD) -f images/$*/Dockerfile \
   248  		--build-arg GO_VER=$(GO_VER) \
   249  		--build-arg ALPINE_VER=$(ALPINE_VER) \
   250  		$(BUILD_ARGS) \
   251  		-t $(DOCKER_NS)/fabric-$* ./$(BUILD_CONTEXT)
   252  	docker tag $(DOCKER_NS)/fabric-$* $(DOCKER_NS)/fabric-$*:$(BASE_VERSION)
   253  	docker tag $(DOCKER_NS)/fabric-$* $(DOCKER_NS)/fabric-$*:$(TWO_DIGIT_VERSION)
   254  	docker tag $(DOCKER_NS)/fabric-$* $(DOCKER_NS)/fabric-$*:$(DOCKER_TAG)
   255  	@touch $@
   256  
   257  # builds release packages for the host platform
   258  .PHONY: release
   259  release: check-go-version $(MARCH:%=release/%)
   260  
   261  # builds release packages for all target platforms
   262  .PHONY: release-all
   263  release-all: check-go-version $(RELEASE_PLATFORMS:%=release/%)
   264  
   265  .PHONY: $(RELEASE_PLATFORMS:%=release/%)
   266  $(RELEASE_PLATFORMS:%=release/%): GO_LDFLAGS = $(METADATA_VAR:%=-X $(PKGNAME)/common/metadata.%)
   267  $(RELEASE_PLATFORMS:%=release/%): release/%: $(foreach exe,$(RELEASE_EXES),release/%/bin/$(exe))
   268  
   269  # explicit targets for all platform executables
   270  $(foreach platform, $(RELEASE_PLATFORMS), $(RELEASE_EXES:%=release/$(platform)/bin/%)):
   271  	$(eval platform = $(patsubst release/%/bin,%,$(@D)))
   272  	$(eval GOOS = $(word 1,$(subst -, ,$(platform))))
   273  	$(eval GOARCH = $(word 2,$(subst -, ,$(platform))))
   274  	@echo "Building $@ for $(GOOS)-$(GOARCH)"
   275  	mkdir -p $(@D)
   276  	GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $@ -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))
   277  
   278  .PHONY: dist
   279  dist: dist-clean dist/$(MARCH)
   280  
   281  .PHONY: dist-all
   282  dist-all: dist-clean $(RELEASE_PLATFORMS:%=dist/%)
   283  dist/%: release/% ccaasbuilder
   284  	mkdir -p release/$(@F)/config
   285  	cp -r sampleconfig/*.yaml release/$(@F)/config
   286  	cd release/$(@F) && tar -czvf hyperledger-fabric-$(@F).$(PROJECT_VERSION).tar.gz *
   287  
   288  .PHONY: docker-list
   289  docker-list: $(RELEASE_IMAGES:%=%-docker-list)
   290  %-docker-list:
   291  	@echo $(DOCKER_NS)/fabric-$*:$(DOCKER_TAG)
   292  
   293  .PHONY: docker-clean
   294  docker-clean: $(RELEASE_IMAGES:%=%-docker-clean)
   295  %-docker-clean:
   296  	-@for image in "$$(docker images --quiet --filter=reference='$(DOCKER_NS)/fabric-$*:$(DOCKER_TAG)')"; do \
   297  		[ -z "$$image" ] || docker rmi -f $$image; \
   298  	done
   299  	-@rm -rf $(BUILD_DIR)/images/$* || true
   300  
   301  .PHONY: docker-tag-latest
   302  docker-tag-latest: $(RELEASE_IMAGES:%=%-docker-tag-latest)
   303  %-docker-tag-latest:
   304  	docker tag $(DOCKER_NS)/fabric-$*:$(DOCKER_TAG) $(DOCKER_NS)/fabric-$*:latest
   305  
   306  .PHONY: docker-tag-stable
   307  docker-tag-stable: $(RELEASE_IMAGES:%=%-docker-tag-stable)
   308  %-docker-tag-stable:
   309  	docker tag $(DOCKER_NS)/fabric-$*:$(DOCKER_TAG) $(DOCKER_NS)/fabric-$*:stable
   310  
   311  .PHONY: publish-images
   312  publish-images: $(RELEASE_IMAGES:%=%-publish-images)
   313  %-publish-images:
   314  	@docker login $(DOCKER_HUB_USERNAME) $(DOCKER_HUB_PASSWORD)
   315  	@docker push $(DOCKER_NS)/fabric-$*:$(PROJECT_VERSION)
   316  
   317  .PHONY: clean
   318  clean: docker-clean unit-test-clean release-clean
   319  	-@rm -rf $(BUILD_DIR)
   320  
   321  .PHONY: clean-all
   322  clean-all: clean gotools-clean dist-clean
   323  	-@rm -rf /var/hyperledger/*
   324  	-@rm -rf docs/build/
   325  
   326  .PHONY: dist-clean
   327  dist-clean:
   328  	-@for platform in $(RELEASE_PLATFORMS) ""; do \
   329  		[ -z "$$platform" ] || rm -rf release/$${platform}/hyperledger-fabric-$${platform}.$(PROJECT_VERSION).tar.gz; \
   330  	done
   331  
   332  .PHONY: release-clean
   333  release-clean: $(RELEASE_PLATFORMS:%=%-release-clean)
   334  %-release-clean:
   335  	-@rm -rf release/$*
   336  
   337  .PHONY: unit-test-clean
   338  unit-test-clean:
   339  
   340  .PHONY: filename-spaces
   341  spaces:
   342  	@scripts/check_file_name_spaces.sh
   343  
   344  .PHONY: docs
   345  docs:
   346  	@docker run --rm -v $$(pwd):/docs n42org/tox:3.4.0 sh -c 'cd /docs && tox -e docs'
   347  
   348  .PHONY: ccaasbuilder-clean
   349  ccaasbuilder-clean:
   350  	rm -rf $(MARCH:%=release/%)/bin/ccaas_builder
   351  
   352  .PHONY: ccaasbuilder
   353  ccaasbuilder: ccaasbuilder-clean
   354  	cd ccaas_builder && go test -v ./cmd/detect && go build -o ../$(MARCH:%=release/%)/bin/ccaas_builder/bin/ ./cmd/detect/
   355  	cd ccaas_builder && go test -v ./cmd/build && go build -o ../$(MARCH:%=release/%)/bin/ccaas_builder/bin/ ./cmd/build/
   356  	cd ccaas_builder && go test -v ./cmd/release && go build -o ../$(MARCH:%=release/%)/bin/ccaas_builder/bin/ ./cmd/release/