From 3cacbd489ecba886a8f9c1d37eca7a6f70ced3d1 Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Fri, 24 Dec 2021 16:48:35 -0800 Subject: [PATCH] build: adapt btcutil Makefile for usage in project In this commit, we adapt the Makefile that was being used for the btcutil project to work for btcd as well. The Makefile is pretty simple, and is just a series of templated commands. Overtime, we can pull in some of the `lnd` additions as well, which we use to handle our reproducible build and verification system. --- .github/workflows/go.yml | 72 +++++++++++++++++------ Makefile | 124 +++++++++++++++++++++++++++++++++++++++ goclean.sh | 19 ------ 3 files changed, 177 insertions(+), 38 deletions(-) create mode 100644 Makefile delete mode 100755 goclean.sh diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 5da1bebc63..b015b3c175 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -1,35 +1,69 @@ name: Build and Test on: [push, pull_request] + +env: + # go needs absolute directories, using the $HOME variable doesn't work here. + GOCACHE: /home/runner/work/go/pkg/build + GOPATH: /home/runner/work/go + GO_VERSION: 1.17.5 + jobs: build: - # https://github.blog/changelog/2021-04-20-github-actions-control-permissions-for-github_token/ - permissions: - contents: read - name: Go CI + name: Build runs-on: ubuntu-latest - strategy: - matrix: - go: [1.16.8, 1.17.1] steps: - name: Set up Go uses: actions/setup-go@v2 with: - go-version: ${{ matrix.go }} + go-version: ${{ env.GO_VERSION }} + - name: Check out source uses: actions/checkout@v2 - - name: Install Linters - run: "curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.26.0" + - name: Build - env: - GO111MODULE: "on" - run: go build ./... + run: make build + + test-cover: + name: Unit coverage + runs-on: ubuntu-latest + steps: + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Check out source + uses: actions/checkout@v2 + - name: Test - env: - GO111MODULE: "on" - run: | - sh ./goclean.sh + run: make unit-cover - - name: Send coverage + - name: Send top-level coverage uses: shogo82148/actions-goveralls@v1 with: - path-to-profile: profile.cov + path-to-profile: coverage.txt + + - name: Send btcutil coverage + uses: shogo82148/actions-goveralls@v1 + with: + path-to-profile: btcutil/coverage.txt + + - name: Send btcutil coverage for psbt package + uses: shogo82148/actions-goveralls@v1 + with: + path-to-profile: btcutil/psbt/coverage.txt + + test-race: + name: Unit race + runs-on: ubuntu-latest + steps: + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Check out source + uses: actions/checkout@v2 + + - name: Test + run: make unit-race diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..5db0871ad1 --- /dev/null +++ b/Makefile @@ -0,0 +1,124 @@ +PKG := github.com/btcsuite/btcd + +LINT_PKG := github.com/golangci/golangci-lint/cmd/golangci-lint +GOACC_PKG := github.com/ory/go-acc +GOIMPORTS_PKG := golang.org/x/tools/cmd/goimports + +GO_BIN := ${GOPATH}/bin +LINT_BIN := $(GO_BIN)/golangci-lint +GOACC_BIN := $(GO_BIN)/go-acc + +LINT_COMMIT := v1.18.0 +GOACC_COMMIT := 80342ae2e0fcf265e99e76bcc4efd022c7c3811b + +DEPGET := cd /tmp && GO111MODULE=on go get -v +GOBUILD := GO111MODULE=on go build -v +GOINSTALL := GO111MODULE=on go install -v +DEV_TAGS := rpctest +GOTEST := GO111MODULE=on go test -v -tags=$(DEV_TAGS) + +GOFILES_NOVENDOR = $(shell find . -type f -name '*.go' -not -path "./vendor/*") + +RM := rm -f +CP := cp +MAKE := make +XARGS := xargs -L 1 + +# Linting uses a lot of memory, so keep it under control by limiting the number +# of workers if requested. +ifneq ($(workers),) +LINT_WORKERS = --concurrency=$(workers) +endif + +LINT = $(LINT_BIN) run -v $(LINT_WORKERS) + +GREEN := "\\033[0;32m" +NC := "\\033[0m" +define print + echo $(GREEN)$1$(NC) +endef + +default: build + +all: build check + +# ============ +# DEPENDENCIES +# ============ + +$(LINT_BIN): + @$(call print, "Fetching linter") + $(DEPGET) $(LINT_PKG)@$(LINT_COMMIT) + +$(GOACC_BIN): + @$(call print, "Fetching go-acc") + $(DEPGET) $(GOACC_PKG)@$(GOACC_COMMIT) + +goimports: + @$(call print, "Installing goimports.") + $(DEPGET) $(GOIMPORTS_PKG) + +# ============ +# INSTALLATION +# ============ + +build: + @$(call print, "Building all binaries") + $(GOBUILD) $(PKG) + $(GOBUILD) $(PKG)/cmd/btcctl + $(GOBUILD) $(PKG)/cmd/gencerts + $(GOBUILD) $(PKG)/cmd/findcheckpoint + $(GOBUILD) $(PKG)/cmd/addblock + +# ======= +# TESTING +# ======= + +check: unit + +unit: + @$(call print, "Running unit tests.") + $(GOTEST) ./... -test.timeout=20m + cd btcutil; $(GOTEST) ./... -test.timeout=20m + cd btcutil/psbt; $(GOTEST) ./... -test.timeout=20m + +unit-cover: $(GOACC_BIN) + @$(call print, "Running unit coverage tests.") + $(GOACC_BIN) ./... + cd btcutil; $(GOACC_BIN) ./... + cd btcutil/psbt; $(GOACC_BIN) ./... + +unit-race: + @$(call print, "Running unit race tests.") + env CGO_ENABLED=1 GORACE="history_size=7 halt_on_errors=1" $(GOTEST) -race -test.timeout=20m ./... + cd btcutil; env CGO_ENABLED=1 GORACE="history_size=7 halt_on_errors=1" $(GOTEST) -race -test.timeout=20m ./... + cd btcutil/psbt; env CGO_ENABLED=1 GORACE="history_size=7 halt_on_errors=1" $(GOTEST) -race -test.timeout=20m ./... + +# ========= +# UTILITIES +# ========= + +fmt: goimports + @$(call print, "Fixing imports.") + goimports -w $(GOFILES_NOVENDOR) + @$(call print, "Formatting source.") + gofmt -l -w -s $(GOFILES_NOVENDOR) + +lint: $(LINT_BIN) + @$(call print, "Linting source.") + $(LINT) + +clean: + @$(call print, "Cleaning source.$(NC)") + $(RM) coverage.txt btcutil/coverage.txt btcutil/psbt/coverage.txt + +.PHONY: all \ + default \ + build \ + check \ + unit \ + unit-cover \ + unit-race \ + fmt \ + lint \ + clean diff --git a/goclean.sh b/goclean.sh deleted file mode 100755 index dad9f8f1dc..0000000000 --- a/goclean.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# The script does automatic checking on a Go package and its sub-packages, including: -# 1. gofmt (http://golang.org/cmd/gofmt/) -# 3. go vet (http://golang.org/cmd/vet) -# 4. gosimple (https://github.com/dominikh/go-simple) -# 5. unconvert (https://github.com/mdempsky/unconvert) -# 6. race detector (http://blog.golang.org/race-detector) -# 7. test coverage (http://blog.golang.org/cover) - -set -ex - -env GORACE="halt_on_error=1" go test -race -tags="rpctest" -covermode atomic -coverprofile=profile.cov ./... - -# Automatic checks -golangci-lint run --deadline=10m --disable-all \ ---enable=gofmt \ ---enable=vet \ ---enable=gosimple \ ---enable=unconvert