Skip to content

Commit

Permalink
tools: Init build/test/verify scripts from k/release
Browse files Browse the repository at this point in the history
Signed-off-by: Stephen Augustus <foo@auggie.dev>
  • Loading branch information
justaugustus committed Feb 1, 2021
1 parent 0b96bd7 commit 39b2a08
Show file tree
Hide file tree
Showing 21 changed files with 960 additions and 46 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# Verify scripts may leave programs in this directory
bin/

# OSX leaves these everywhere on SMB shares
._*

Expand Down
120 changes: 107 additions & 13 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,33 +12,127 @@
# See the License for the specific language governing permissions and
# limitations under the License.

# If you update this file, please follow
# https://suva.sh/posts/well-documented-makefiles

REPO_ROOT := $(shell git rev-parse --show-toplevel)

.DEFAULT_GOAL := help
.DEFAULT_GOAL:=help
SHELL:=/usr/bin/env bash

.PHONY: targets
targets: help verify verify-toc verify-spelling verify-metadata update-toc add-verify-hook
COLOR:=\\033[36m
NOCOLOR:=\\033[0m

help: ## Show this help text.
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
##@ KEPs

verify: ## Runs all verification tests.
${REPO_ROOT}/hack/verify.sh
.PHONY: update-toc verify-toc verify-metadata

update-toc: ## Updates KEP Table of Contents.
${REPO_ROOT}/hack/update-toc.sh

verify-toc: ## Verifies the Table of Contents is in the correct format.
${REPO_ROOT}/hack/verify-toc.sh

verify-spelling: ## Verifies spelling.
${REPO_ROOT}/hack/verify-spelling.sh

verify-metadata: ## Verifies the KEP metadata is valid yaml.
${REPO_ROOT}/hack/verify-kep-metadata.sh

update-toc: ## Updates KEP Table of Contents.
${REPO_ROOT}/hack/update-toc.sh
##@ Verify

.PHONY: add-verify-hook verify verify-boilerplate verify-build verify-golangci-lint verify-go-mod verify-shellcheck verify-spelling

add-verify-hook: ## Adds verify scripts to git pre-commit hooks.
# Note: The pre-commit hooks can be bypassed by using the flag --no-verify when
# performing a git commit.
git config --local core.hooksPath "${REPO_ROOT}/.githooks"

# TODO(verify): Reconcile with duplicate target
verify: ## Runs all verification tests.
${REPO_ROOT}/hack/verify.sh

# TODO(lint): Uncomment verify-shellcheck once we finish shellchecking the repo.
verify: tools verify-boilerplate verify-build verify-golangci-lint verify-go-mod #verify-shellcheck ## Runs verification scripts to ensure correct execution

verify-boilerplate: ## Runs the file header check
${REPO_ROOT}/hack/verify-boilerplate.sh

verify-build: ## Builds the project for a chosen set of platforms
${REPO_ROOT}/hack/verify-build.sh

verify-go-mod: ## Runs the go module linter
${REPO_ROOT}/hack/verify-go-mod.sh

verify-golangci-lint: ## Runs all golang linters
${REPO_ROOT}/hack/verify-golangci-lint.sh

verify-shellcheck: ## Runs shellcheck
${REPO_ROOT}/hack/verify-shellcheck.sh

verify-spelling: ## Verifies spelling.
${REPO_ROOT}/hack/verify-spelling.sh

##@ Tests

.PHONY: test test-go-unit test-go-integration

test: test-go-unit ## Runs unit tests

test-go-unit: ## Runs Golang unit tests
${REPO_ROOT}/hack/test-go.sh

test-go-integration: ## Runs Golang integration tests
${REPO_ROOT}/hack/test-go-integration.sh

##@ Tools

.PHONY: tools

KEP_TOOLS ?=

tools: ## Compiles a set of KEP tools, specified by $KEP_TOOLS
./compile-tools $(KEP_TOOLS)

##@ Dependencies

.SILENT: update-deps update-deps-go update-mocks
.PHONY: update-deps update-deps-go update-mocks

update-deps: update-deps-go ## Update all dependencies for this repo
echo -e "${COLOR}Commit/PR the following changes:${NOCOLOR}"
git status --short

update-deps-go: GO111MODULE=on
update-deps-go: ## Update all golang dependencies for this repo
go get -u -t ./...
go mod tidy
go mod verify
$(MAKE) test-go-unit
${REPO_ROOT}/hack/update-all.sh

update-mocks: ## Update all generated mocks
go generate ./...
for f in $(shell find . -name fake_*.go); do \
cp hack/boilerplate/boilerplate.go.txt tmp ;\
sed -i.bak -e 's/YEAR/'$(shell date +"%Y")'/g' -- tmp && rm -- tmp.bak ;\
cat $$f >> tmp ;\
mv tmp $$f ;\
done

##@ Helpers

.PHONY: help

help: ## Display this help
@awk \
-v "col=${COLOR}" -v "nocol=${NOCOLOR}" \
' \
BEGIN { \
FS = ":.*##" ; \
printf "\nUsage:\n make %s<target>%s\n", col, nocol \
} \
/^[a-zA-Z_-]+:.*?##/ { \
printf " %s%-15s%s %s\n", col, $$1, nocol, $$2 \
} \
/^##@/ { \
printf "\n%s%s%s\n", col, substr($$0, 5), nocol \
} \
' $(MAKEFILE_LIST)
108 changes: 108 additions & 0 deletions compile-tools
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
#!/usr/bin/env bash

# Copyright 2021 The Kubernetes Authors.
#
# 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
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set -o errexit
set -o nounset
set -o pipefail

TOOLS=(
kepctl
# TODO(kepify): Remove once kepify is merged into kepctl
kepify
)

setup_env() {
echo "Setting up environment..."

if [[ -z "${TOOL_BIN:-}" ]]; then
if [ -n "${GOBIN:-}" ]; then
export TOOL_BIN="${GOBIN}"
else
export TOOL_BIN="${GOPATH}/bin"
fi
fi

export PATH="${PATH}:${TOOL_BIN}"
}

compile() {
local tool="$1"

echo "Compiling $tool..."

go install "${tool}"
echo "${tool} compiled & installed"
}

check_deps() {
echo "Checking dependencies..."

compile github.com/psampaz/go-mod-outdated

local gmo_args=( '-update' '-direct' )
if [ -n "${FAIL_ON_OUTDATED:-}" ]; then
gmo_args+=( '-ci' )
fi

go list -u -m -json all | go-mod-outdated "${gmo_args[@]}"
}

compile_with_flags() {
local git_tree_state
local pkg
local tool="$1"

git_tree_state=dirty
pkg=k8s.io/release/pkg/version

if git_status=$(git status --porcelain --untracked=no 2>/dev/null) && [[ -z "${git_status}" ]]; then
git_tree_state=clean
fi

go build -v -ldflags "-s -w \
-X $pkg.buildDate=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
-X $pkg.gitCommit=$(git rev-parse HEAD 2>/dev/null || echo unknown) \
-X $pkg.gitTreeState=$git_tree_state \
-X $pkg.gitVersion=$(git describe --tags --abbrev=0 || echo unknown)" \
-o "$TOOL_BIN/$tool" "./cmd/$tool" \
|| return 1

echo "$tool was successfully compiled and installed to $TOOL_BIN/$tool"
}

main() {
cd "$(dirname "${BASH_SOURCE[0]}")"

setup_env
check_deps

if [ $# -gt 0 ]; then
for tool in "$@"; do
if [[ ${tool} =~ github.com\/ ]]; then
compile "${tool}"
else
compile_with_flags "${tool}"
fi
done
else
for tool in "${TOOLS[@]}"; do
echo "Compiling default tools..."
compile_with_flags "${tool}"
done
fi
}

main "$@"
11 changes: 7 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ go 1.12

require (
github.com/google/go-github/v32 v32.1.0
github.com/maxbrunsfeld/counterfeiter/v6 v6.3.0
github.com/olekukonko/tablewriter v0.0.4
github.com/pkg/errors v0.9.1
github.com/spf13/cobra v1.0.0
github.com/psampaz/go-mod-outdated v0.7.0
github.com/spf13/cobra v1.1.1
github.com/spf13/pflag v1.0.5
github.com/stretchr/testify v1.5.1
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d
gopkg.in/yaml.v2 v2.3.0
github.com/stretchr/testify v1.7.0
golang.org/x/oauth2 v0.0.0-20210112200429-01de73cf58bd
gopkg.in/yaml.v2 v2.4.0
k8s.io/release v0.7.0
k8s.io/test-infra v0.0.0-20200813194141-e9678d500461
sigs.k8s.io/yaml v1.2.0
)
Loading

0 comments on commit 39b2a08

Please sign in to comment.