Danny Massa 8f426a0bb2 Added TS Unit Testing, TS Lint, Yarn package management.
Using this new structure, developers can rebuild, test, and lint
individually, saving time an effort in the event of a failure.

Added Frontend unit testing alongside a more modular module design
to make components and services easier to test and easy to manage
dependencies for.

Adding Yarn for more performant package management

Change-Id: I56a57100b5d831bb31bc18e2c62c78bf63265324
2020-08-16 20:51:55 -05:00

257 lines
7.1 KiB
Makefile
Executable File

# Copyright (c) 2019 VMware, Inc. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
# Export path so that the JS linting tools can get access to npm & node
# this has to be done before the shell invocation
SHELL=/bin/bash
# Obtain the version and git commit info
GIT_VERSION=$(shell git describe --match 'v*' --always)
TOOLBINDIR := tools/bin
WEBDIR := client
LINTER := $(TOOLBINDIR)/golangci-lint
LINTER_CONFIG := .golangci.yaml
NODEJS_BIN := $(realpath tools)/node-v12.16.3/bin
NG := $(NODEJS_BIN)/ng
YARN := $(NODEJS_BIN)/yarn
# docker
DOCKER_MAKE_TARGET := build
# docker image options
DOCKER_REGISTRY ?= quay.io
DOCKER_FORCE_CLEAN ?= true
DOCKER_IMAGE_NAME ?= airshipui
DOCKER_IMAGE_PREFIX ?= airshipit
DOCKER_IMAGE_TAG ?= dev
DOCKER_IMAGE ?= $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_PREFIX)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)
DOCKER_TARGET_STAGE ?= release
PUBLISH ?= false
# test flags
COVERAGE_OUTPUT := coverage.out
TESTFLAGS ?= -count=1
# go options
PKG ?= ./...
TESTS ?= .
COVER_FLAGS ?=
COVER_PROFILE ?= cover.out
COVER_EXCLUDE ?= (zz_generated)
# Override the value of the version variable in main.go
LD_FLAGS= '-X opendev.org/airship/airshipui/pkg/commands.version=$(GIT_VERSION)'
GO_FLAGS := -ldflags=$(LD_FLAGS)
BUILD_DIR := bin
# Find all main.go files under cmd, excluding airshipui itself
EXAMPLE_NAMES := $(notdir $(subst /main.go,,$(wildcard examples/*/main.go)))
EXAMPLES := $(addprefix $(BUILD_DIR)/, $(EXAMPLE_NAMES))
MAIN := $(BUILD_DIR)/airshipui
EXTENSION :=
ifdef XDG_CONFIG_HOME
OCTANT_PLUGINSTUB_DIR ?= ${XDG_CONFIG_HOME}/octant/plugins
# Determine if on windows
else ifeq ($(OS),Windows_NT)
OCTANT_PLUGINSTUB_DIR ?= $(subst \,/,${LOCALAPPDATA}/octant/plugins)
EXTENSION=.exe
else
OCTANT_PLUGINSTUB_DIR ?= ${HOME}/.config/octant/plugins
endif
DIRS = internal
RECURSIVE_DIRS = $(addprefix ./, $(addsuffix /..., $(DIRS)))
### Composite Make Commands ###
.PHONY: $(MAIN)
$(MAIN): build
.PHONY: build
build: frontend-build
build: backend-build
.PHONY: lint
lint: tidy-lint
lint: check-copyright-lint
lint: whitespace-lint
lint: frontend-lint
lint: backend-lint
.PHONY: unit-test
test: frontend-unit-test
test: backend-unit-test
.PHONY: coverage
coverage: frontend-coverage
coverage: backend-coverage
.PHONY: verify
verify: build
verify: coverage
verify: lint
### Backend (Go) Make Commands ###
.PHONY: backend-build
backend-build:
@echo "Executing backend build steps..."
@mkdir -p $(BUILD_DIR)
@go build -o $(MAIN)$(EXTENSION) $(GO_FLAGS) cmd/main.go
@echo "Backend build completed successfully"
.PHONY: backend-unit-test
backend-unit-test:
@echo "Performing backend unit test step..."
@go test -run $(TESTS) $(PKG) $(TESTFLAGS) $(COVER_FLAGS)
@echo "Backend unit tests completed successfully"
.PHONY: backend-coverage
backend-coverage: TESTFLAGS = -covermode=atomic -coverprofile=fullcover.out
backend-coverage: backend-unit-test
@echo "Generating backend coverage report..."
@grep -vE "$(COVER_EXCLUDE)" fullcover.out > $(COVER_PROFILE)
@echo "Backend coverage report completed successfully"
.PHONY: backend-lint
backend-lint: $(LINTER)
backend-lint:
@echo "Running backend linting step..."
@$(LINTER) run --config $(LINTER_CONFIG)
@echo "Backend linting completed successfully"
### Frontend (Angular) Make Commands ###
.PHONY: frontend-build
frontend-build: $(YARN)
frontend-build:
@echo "Executing frontend build steps..."
@cd $(WEBDIR) && (PATH="$(PATH):$(NODEJS_BIN)"; $(NG) build) && cd ..
@echo "Frontend build completed successfully"
.PHONY: frontend-unit-test
frontend-unit-test: $(YARN)
frontend-unit-test:
@echo "Performing frontend unit test step..."
@cd $(WEBDIR) && (PATH="$(PATH):$(NODEJS_BIN)"; $(NG) test) && cd ..
@echo "Frontend unit tests completed successfully"
.PHONY: frontend-coverage
frontend-coverage: frontend-unit-test
.PHONY: frontend-lint
frontend-lint: $(YARN)
frontend-lint:
@echo "Running frontend linting step..."
@cd $(WEBDIR) && (PATH="$(PATH):$(NODEJS_BIN)"; $(NG) lint) && cd ..
@echo "Frontend linting completed successfully"
### Misc. Linting Commands ###
.PHONY: whitespace-lint
whitespace-lint:
@echo "Running whitespace linting step..."
@./tools/whitespace_linter
@echo "Whitespace linting completed successfully"
.PHONY: tidy-lint
tidy-lint:
@echo "Checking that go.mod is up to date..."
@./tools/gomod_check
@echo "go.mod check completed successfully"
# check-copyright is a utility to check if copyright header is present on all files
.PHONY: check-copyright-lint
check-copyright-lint:
@echo "Checking file for copyright statement..."
@./tools/check_copyright
@echo "Copyright check completed successfully"
### Helper Installations ###
$(LINTER):
@echo "Installing Go linter..."
@mkdir -p $(TOOLBINDIR)
./tools/install_go_linter
@echo "Go linter installation completed successfully"
$(YARN):
@echo "Installing Node.js, npm, yarn & project packages..."
@mkdir -p $(TOOLBINDIR)
./tools/install_npm
@cd $(WEBDIR) && (PATH="$(PATH):$(NODEJS_BIN)"; $(YARN) install) && cd ..
@echo "Node.js, npm, yarn, and project package installation completed successfully"
### Docker ###
.PHONY: images
images: docker-image
.PHONY: docker-image
docker-image:
ifeq ($(USE_PROXY), true)
@docker build . --network=host \
--build-arg http_proxy=$(PROXY) \
--build-arg https_proxy=$(PROXY) \
--build-arg HTTP_PROXY=$(PROXY) \
--build-arg HTTPS_PROXY=$(PROXY) \
--build-arg no_proxy=$(NO_PROXY) \
--build-arg NO_PROXY=$(NO_PROXY) \
--build-arg MAKE_TARGET=$(DOCKER_MAKE_TARGET) \
--tag $(DOCKER_IMAGE) \
--target $(DOCKER_TARGET_STAGE) \
--force-rm=$(DOCKER_FORCE_CLEAN)
else
@docker build . --network=host \
--build-arg MAKE_TARGET=$(DOCKER_MAKE_TARGET) \
--tag $(DOCKER_IMAGE) \
--target $(DOCKER_TARGET_STAGE) \
--force-rm=$(DOCKER_FORCE_CLEAN)
endif
ifeq ($(PUBLISH), true)
@docker push $(DOCKER_IMAGE)
endif
.PHONY: print-docker-image-tag
print-docker-image-tag:
@echo "$(DOCKER_IMAGE)"
.PHONY: docker-image-test-suite
docker-image-test-suite: DOCKER_MAKE_TARGET = "lint cover"
docker-image-test-suite: DOCKER_TARGET_STAGE = builder
docker-image-test-suite: docker-image
.PHONY: docker-image-unit-tests
docker-image-unit-tests: DOCKER_MAKE_TARGET = coverage
docker-image-unit-tests: DOCKER_TARGET_STAGE = builder
docker-image-unit-tests: docker-image
.PHONY: docker-image-lint
docker-image-lint: DOCKER_MAKE_TARGET = lint
docker-image-lint: DOCKER_TARGET_STAGE = builder
docker-image-lint: docker-image
.PHONY: clean
clean:
@echo "Removing build directories..."
rm -rf $(BUILD_DIR) $(COVERAGE_OUTPUT)
@echo "Removal completed successfully"
# The golang-unit zuul job calls the env target, so create one
# Note: on windows if there is a WSL curl in c:\windows\system32
# it will cause problems installing the lint tools.
# The use of cygwin curl is working however
.PHONY: env
### Helper Make Commands ###
# add-copyright is a utility to add copyright header to missing files
.PHONY: add-copyright
add-copyright:
@echo "Adding copyright license to necessary files..."
@./tools/add_license.sh
@echo "Copyright license additions completed successfully"