diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e6a16c86c852e0384acf41932acb367b7254352b..d6b40fd96284e00a40c286e09bd8586bd839b02d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,41 +1,66 @@ -# This file is a template, and might need editing before it works on your project. -image: golang:latest +image: containers.ethitter.com:443/docker/images/golang:latest variables: REPO_NAME: git.ethitter.com/debian/eth-log-alerting -# The problem is that to be able to use go get, one needs to put -# the repository in the $GOPATH. So for example if your gitlab domain -# is gitlab.com, and that your repository is namespace/project, and -# the default GOPATH being /go, then you'd need to have your -# repository in /go/src/gitlab.com/namespace/project -# Thus, making a symbolic link corrects this. +cache: + paths: + - /apt-cache + - $GOPATH/src/github.com + - $GOPATH/src/golang.org + - $GOPATH/src/google.golang.org + - $GOPATH/src/gopkg.in + +stages: + - test + - build + before_script: - mkdir -p $GOPATH/src/$(dirname $REPO_NAME) - - ln -svf $CI_PROJECT_DIR $GOPATH/src/$REPO_NAME + - cp -R $CI_PROJECT_DIR $GOPATH/src/$REPO_NAME - cd $GOPATH/src/$REPO_NAME + - cp config-sample.json config.json - - go version + - export CC=clang-5.0 - - go get github.com/asaskevich/govalidator - - go get github.com/ashwanthkumar/slack-go-webhook - - go get github.com/hpcloud/tail + - make dep -stages: - - test - - build +unit_tests: + stage: test + script: + - make test + +race_detector: + stage: test + script: + - make race + +memory_sanitizer: + stage: test + script: + - make msan + +code_coverage: + stage: test + script: + - make coverage + +code_coverage_report: + stage: test + script: + - make coverhtml + only: + - master -format: +lint_code: stage: test script: - - go tool vet -composites=false -shadow=true *.go - - go test -race $(go list ./... | grep -v /vendor/) + - make lint -compile: +build: stage: build script: - - go get github.com/mitchellh/gox - - gox -output="eth-log-alerting-builds/{{.Dir}}_{{.OS}}_{{.Arch}}" -parallel=4 + - make artifacts: paths: - - eth-log-alerting-builds/ + - eth-log-alerting-builds/ \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..7fdfcd085dff67f95599d5363baa64c69947efb6 --- /dev/null +++ b/Makefile @@ -0,0 +1,39 @@ +PROJECT_NAME := "eth-log-alerting" +PKG := "git.ethitter.com/debian/$(PROJECT_NAME)" +PKG_LIST := $(shell go list ${PKG}/... | grep -v /vendor/) +GO_FILES := $(shell find . -name '*.go' | grep -v /vendor/ | grep -v _test.go) + +.PHONY: all dep build clean test coverage coverhtml lint + +all: build + +lint: + @golint -set_exit_status ${PKG_LIST} + +test: + @go test -v ${PKG_LIST} + +race: dep + @go test -v -race ${PKG_LIST} + +msan: dep + @go test -v -msan ${PKG_LIST} + +coverage: + ./tools/coverage.sh; + +coverhtml: + ./tools/coverage.sh html; + +dep: + @go get -v -d ./... + @go get github.com/mitchellh/gox + +build: dep + @gox -output="${CI_PROJECT_DIR}/eth-log-alerting-builds/{{.Dir}}_{{.OS}}_{{.Arch}}" -parallel=4 + +clean: + @rm -f $(PROJECT_NAME) + +help: + @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/eth-log-alerting_test.go b/eth-log-alerting_test.go new file mode 100644 index 0000000000000000000000000000000000000000..4c11ca1018f4854c8b070347000ccaea2b4c1d78 --- /dev/null +++ b/eth-log-alerting_test.go @@ -0,0 +1,19 @@ +package main + +import "testing" + +func TestValidatePath(t *testing.T) { + emptyString := "" + notValid := validatePath(&emptyString) + + if notValid == true { + t.Error("Empty path shouldn't validate") + } + + sampleConfig := "./config-sample.json" + valid := validatePath(&sampleConfig) + + if valid != true { + t.Error("Couldn't validate path to sample config") + } +} diff --git a/tools/coverage.sh b/tools/coverage.sh new file mode 100755 index 0000000000000000000000000000000000000000..0afd4f114465980f501559be19b79ac2ad39fe7f --- /dev/null +++ b/tools/coverage.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# +# Code coverage generation + +COVERAGE_DIR="${COVERAGE_DIR:-coverage}" +PKG_LIST=$(go list ./... | grep -v /vendor/) + +# Create the coverage files directory +mkdir -p "$COVERAGE_DIR"; + +# Create a coverage file for each package +for package in ${PKG_LIST}; do + go test -covermode=count -coverprofile "${COVERAGE_DIR}/${package##*/}.cov" "$package" ; +done ; + +# Merge the coverage profile files +echo 'mode: count' > "${COVERAGE_DIR}"/coverage.cov ; +tail -q -n +2 "${COVERAGE_DIR}"/*.cov >> "${COVERAGE_DIR}"/coverage.cov ; + +# Display the global code coverage +go tool cover -func="${COVERAGE_DIR}"/coverage.cov ; + +# If needed, generate HTML report +if [ "$1" == "html" ]; then + go tool cover -html="${COVERAGE_DIR}"/coverage.cov -o coverage.html ; +fi + +# Remove the coverage files directory +rm -rf "$COVERAGE_DIR";