2020-07-24 00:54:04 +00:00
BIN = syft
2020-05-12 14:45:18 +00:00
TEMPDIR = ./.tmp
2020-07-06 10:58:34 +00:00
RESULTSDIR = $( TEMPDIR) /results
COVER_REPORT = $( RESULTSDIR) /cover.report
COVER_TOTAL = $( RESULTSDIR) /cover.total
2020-05-12 14:45:18 +00:00
LINTCMD = $( TEMPDIR) /golangci-lint run --tests= false --config .golangci.yaml
2020-07-23 14:52:44 +00:00
ACC_TEST_IMAGE = centos:8.2.2004
ACC_DIR = ./test/acceptance
2020-07-06 10:58:34 +00:00
BOLD := $( shell tput -T linux bold)
PURPLE := $( shell tput -T linux setaf 5)
GREEN := $( shell tput -T linux setaf 2)
CYAN := $( shell tput -T linux setaf 6)
RED := $( shell tput -T linux setaf 1)
RESET := $( shell tput -T linux sgr0)
2020-05-12 14:45:18 +00:00
TITLE := $( BOLD) $( PURPLE)
SUCCESS := $( BOLD) $( GREEN)
2020-07-06 10:58:34 +00:00
# the quality gate lower threshold for unit test total % coverage (by function statements)
2020-07-17 17:32:45 +00:00
COVERAGE_THRESHOLD := 72
2020-05-12 14:45:18 +00:00
2020-07-23 14:52:44 +00:00
## Build variables
DISTDIR = ./dist
SNAPSHOTDIR = ./snapshot
GITTREESTATE = $( if $( shell git status --porcelain) ,dirty,clean)
i f e q "$(strip $(VERSION))" ""
override VERSION = $( shell git describe --always --tags --dirty)
e n d i f
## Variable assertions
2020-05-21 13:37:20 +00:00
i f n d e f T E M P D I R
2020-07-23 14:52:44 +00:00
$( error TEMPDIR is not set )
e n d i f
i f n d e f R E S U L T S D I R
$( error RESULTSDIR is not set )
e n d i f
i f n d e f A C C _ D I R
$( error ACC_DIR is not set )
e n d i f
i f n d e f D I S T D I R
$( error DISTDIR is not set )
e n d i f
i f n d e f S N A P S H O T D I R
$( error SNAPSHOTDIR is not set )
2020-05-21 13:37:20 +00:00
e n d i f
2020-07-06 10:58:34 +00:00
d e f i n e t i t l e
@printf '$(TITLE)$(1)$(RESET)\n'
e n d e f
2020-05-12 14:45:18 +00:00
2020-07-23 14:52:44 +00:00
## Tasks
2020-07-06 10:58:34 +00:00
2020-07-23 14:52:44 +00:00
.PHONY : all
all : clean lint check -licenses test ## Run all linux-based checks (linting, license check, unit, integration, and linux acceptance tests)
2020-05-12 14:45:18 +00:00
@printf '$(SUCCESS)All checks pass!$(RESET)\n'
2020-07-23 14:52:44 +00:00
.PHONY : compare
2020-07-13 16:12:00 +00:00
compare :
2020-07-23 14:52:44 +00:00
@cd test/inline-compare && make
2020-07-13 16:12:00 +00:00
2020-07-23 14:52:44 +00:00
.PHONY : test
test : unit integration acceptance -linux ## Run all tests (currently unit, integration, and linux acceptance tests )
2020-07-06 10:58:34 +00:00
2020-07-23 14:52:44 +00:00
.PHONY : help
2020-07-06 10:58:34 +00:00
help :
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $( MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "$(BOLD)$(CYAN)%-25s$(RESET)%s\n", $$1, $$2}'
2020-07-23 14:52:44 +00:00
.PHONY : ci -bootstrap
ci-bootstrap : bootstrap
2020-07-06 10:58:34 +00:00
sudo apt install -y bc
2020-07-23 14:52:44 +00:00
.PHONY : boostrap
bootstrap : ## Download and install all go dependencies (+ prep tooling in the ./tmp dir)
$( call title,Boostrapping dependencies)
@pwd
2020-07-06 10:58:34 +00:00
# prep temp dirs
mkdir -p $( TEMPDIR)
mkdir -p $( RESULTSDIR)
2020-07-23 14:52:44 +00:00
# install go dependencies
go mod download
# install utilities
[ -f " $( TEMPDIR) /golangci " ] || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $( TEMPDIR) / v1.26.0
[ -f " $( TEMPDIR) /bouncer " ] || curl -sSfL https://raw.githubusercontent.com/wagoodman/go-bouncer/master/bouncer.sh | sh -s -- -b $( TEMPDIR) / v0.1.0
[ -f " $( TEMPDIR) /goreleaser " ] || curl -sfL https://install.goreleaser.com/github.com/goreleaser/goreleaser.sh | sh -s -- -b $( TEMPDIR) / v0.140.0
.PHONY : lint
2020-07-06 10:58:34 +00:00
lint : ## Run gofmt + golangci lint checks
$( call title,Running linters)
2020-07-23 17:08:31 +00:00
# ensure there are no go fmt differences
2020-07-06 10:58:34 +00:00
@printf " files with gofmt issues: [ $( shell gofmt -l -s .) ]\n "
@test -z " $( shell gofmt -l -s .) "
2020-07-23 17:08:31 +00:00
# run all golangci-lint rules
2020-05-12 14:45:18 +00:00
$( LINTCMD)
2020-07-23 17:08:31 +00:00
# go tooling does not play well with certain filename characters, ensure the common cases don't result in future "go get" failures
$( eval MALFORMED_FILENAMES := $( shell find . | grep -e ':' ) )
@bash -c " [[ ' $( MALFORMED_FILENAMES) ' == '' ]] || (printf '\nfound unsupported filename characters:\n $( MALFORMED_FILENAMES) \n\n' && false) "
2020-07-23 14:52:44 +00:00
.PHONY : lint -fix
2020-07-06 10:58:34 +00:00
lint-fix : ## Auto-format all source code + run golangci lint fixers
$( call title,Running lint fixers)
2020-05-21 13:37:20 +00:00
gofmt -w -s .
2020-05-12 14:45:18 +00:00
$( LINTCMD) --fix
2020-07-23 14:52:44 +00:00
.PHONY : check -licenses
check-licenses :
$( TEMPDIR) /bouncer check
.PHONY : unit
2020-07-06 10:58:34 +00:00
unit : ## Run unit tests (with coverage)
$( call title,Running unit tests)
2020-07-24 01:47:11 +00:00
go test -v -coverprofile $( COVER_REPORT) ./...
2020-07-06 10:58:34 +00:00
@go tool cover -func $( COVER_REPORT) | grep total | awk '{print substr($$3, 1, length($$3)-1)}' > $( COVER_TOTAL)
@echo " Coverage: $$ (cat $( COVER_TOTAL) ) "
@if [ $$ ( echo " $$ (cat $( COVER_TOTAL) ) >= $( COVERAGE_THRESHOLD) " | bc -l) -ne 1 ] ; then echo " $( RED) $( BOLD) Failed coverage quality gate (> $( COVERAGE_THRESHOLD) %) $( RESET) " && false; fi
2020-05-12 14:45:18 +00:00
2020-07-23 14:52:44 +00:00
.PHONY : integration
2020-07-06 10:58:34 +00:00
integration : ## Run integration tests
$( call title,Running integration tests)
2020-07-23 14:52:44 +00:00
go test -v -tags= integration ./test/integration
2020-05-12 14:45:18 +00:00
2020-07-23 14:52:44 +00:00
test/integration/test-fixtures/tar-cache.key, integration-fingerprint :
find test/integration/test-fixtures/image-* -type f -exec md5sum { } + | awk '{print $1}' | sort | md5sum | tee test/integration/test-fixtures/tar-cache.fingerprint
2020-07-07 22:04:27 +00:00
2020-07-23 14:52:44 +00:00
.PHONY : java -packages -fingerprint
2020-07-13 16:11:11 +00:00
java-packages-fingerprint :
2020-07-24 00:54:04 +00:00
@cd syft/cataloger/java/test-fixtures/java-builds && \
2020-07-13 16:11:11 +00:00
make packages.fingerprint
2020-07-23 14:52:44 +00:00
.PHONY : clear -test -cache
2020-07-06 10:58:34 +00:00
clear-test-cache : ## Delete all test cache (built docker image tars)
find . -type f -wholename "**/test-fixtures/tar-cache/*.tar" -delete
2020-05-12 14:45:18 +00:00
2020-07-23 14:52:44 +00:00
.PHONY : check -pipeline
2020-07-06 10:58:34 +00:00
check-pipeline : ## Run local CircleCI pipeline locally (sanity check)
$( call title,Check pipeline)
# note: this is meant for local development & testing of the pipeline, NOT to be run in CI
mkdir -p $( TEMPDIR)
circleci config process .circleci/config.yml > .tmp/circleci.yml
circleci local execute -c .tmp/circleci.yml --job "Static Analysis"
circleci local execute -c .tmp/circleci.yml --job "Unit & Integration Tests (go-latest)"
@printf '$(SUCCESS)Pipeline checks pass!$(RESET)\n'
2020-05-12 14:45:18 +00:00
2020-07-23 14:52:44 +00:00
.PHONY : build
build : $( SNAPSHOTDIR ) ## Build release snapshot binaries and packages
$(SNAPSHOTDIR) : ## Build snapshot release binaries and packages
$( call title,Building snapshot artifacts)
# create a config with the dist dir overridden
echo " dist: $( SNAPSHOTDIR) " > $( TEMPDIR) /goreleaser.yaml
cat .goreleaser.yaml >> $( TEMPDIR) /goreleaser.yaml
# build release snapshots
BUILD_GIT_TREE_STATE = $( GITTREESTATE) \
$( TEMPDIR) /goreleaser release --skip-publish --rm-dist --snapshot --config $( TEMPDIR) /goreleaser.yaml
2020-07-25 11:47:14 +00:00
# verify checksum signatures
gpg --verify $( SNAPSHOTDIR) /*checksums.txt.sig $( SNAPSHOTDIR) /*checksums.txt
2020-07-23 14:52:44 +00:00
.PHONY : acceptance -mac
acceptance-mac : $( SNAPSHOTDIR ) ## Run acceptance tests on build snapshot binaries and packages (Mac)
$( call title,Running acceptance test: Run on Mac)
$( ACC_DIR) /mac.sh \
$( SNAPSHOTDIR) \
2020-07-24 21:41:22 +00:00
$( ACC_DIR) \
$( ACC_TEST_IMAGE) \
$( RESULTSDIR)
2020-07-23 14:52:44 +00:00
.PHONY : acceptance -linux
acceptance-linux : acceptance -test -deb -package -install acceptance -test -rpm -package -install ## Run acceptance tests on build snapshot binaries and packages (Linux)
.PHONY : acceptance -test -deb -package -install
acceptance-test-deb-package-install : $( SNAPSHOTDIR )
$( call title,Running acceptance test: DEB install)
$( ACC_DIR) /deb.sh \
$( SNAPSHOTDIR) \
2020-07-24 21:41:22 +00:00
$( ACC_DIR) \
$( ACC_TEST_IMAGE) \
$( RESULTSDIR)
2020-07-23 14:52:44 +00:00
.PHONY : acceptance -test -rpm -package -install
acceptance-test-rpm-package-install : $( SNAPSHOTDIR )
$( call title,Running acceptance test: RPM install)
$( ACC_DIR) /rpm.sh \
$( SNAPSHOTDIR) \
2020-07-24 21:41:22 +00:00
$( ACC_DIR) \
$( ACC_TEST_IMAGE) \
$( RESULTSDIR)
2020-07-23 14:52:44 +00:00
# TODO: this is not releasing yet
.PHONY : release
release : clean -dist ## Build and publish final binaries and packages
$( call title,Publishing release artifacts)
# create a config with the dist dir overridden
echo " dist: $( DISTDIR) " > $( TEMPDIR) /goreleaser.yaml
cat .goreleaser.yaml >> $( TEMPDIR) /goreleaser.yaml
# release
BUILD_GIT_TREE_STATE = $( GITTREESTATE) \
2020-07-25 11:09:20 +00:00
$( TEMPDIR) /goreleaser --rm-dist --config $( TEMPDIR) /goreleaser.yaml
2020-07-23 14:52:44 +00:00
2020-07-25 11:47:14 +00:00
# verify checksum signatures
gpg --verify $( DISTDIR) /*checksums.txt.sig $( DISTDIR) /*checksums.txt
2020-07-23 14:52:44 +00:00
# create a version file for version-update checks
echo " $( VERSION) " > $( DISTDIR) /VERSION
# TODO: add upload to bucket
.PHONY : clean
2020-07-24 21:41:22 +00:00
clean : clean -dist clean -snapshot ## Remove previous builds and result reports
2020-07-23 14:52:44 +00:00
rm -rf $( RESULTSDIR) /*
2020-07-24 21:41:22 +00:00
.PHONY : clean -snapshot
clean-snapshot :
2020-07-23 14:52:44 +00:00
rm -rf $( SNAPSHOTDIR) $( TEMPDIR) /goreleaser.yaml
.PHONY : clean -dist
clean-dist :
rm -rf $( DISTDIR) $( TEMPDIR) /goreleaser.yaml