diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml new file mode 100644 index 0000000..2084584 --- /dev/null +++ b/.github/workflows/go.yml @@ -0,0 +1,41 @@ +name: Go + +on: + push: + branches: + - '**' + - '!master' + pull_request: + branches: [ master ] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: ^1.20 + id: go + + - name: Get dependencies + run: make get-dependencies + + - name: Ensure that all files are properly formatted + run: | + FILES=$(go run golang.org/x/tools/cmd/goimports@latest -w -l .) + if [ -n "${FILES}" ]; then + printf "Following files are not formatted: \n%s" "$FILES" + exit 1 + fi + + - name: GO vet + run: make vet + + - name: Test + run: make test + + - name: Test building + run: make build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..7fd2daf --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,30 @@ +on: + release: + types: [created] + +jobs: + release-linux-amd64: + name: release linux/amd64 + runs-on: ubuntu-latest + strategy: + matrix: + goos: [ linux, darwin, windows] + goarch: [ "arm64", "amd64" ] + exclude: + - goarch: arm64 + goos: windows + - goarch: arm64 + goos: darwin + + steps: + - uses: actions/checkout@v3 + - name: Set env + run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV + - uses: wangyoucao577/go-release-action@v1 + with: + github_token: ${{ secrets.GH_TOKEN }} + goos: ${{ matrix.goos }} + goarch: ${{ matrix.goarch }} + goversion: 1.20 + binary_name: aci-exporter-${{ env.RELEASE_VERSION }}.${{ matrix.goos }}.${{ matrix.goarch }} + extra_files: COPYING README.md diff --git a/.gitignore b/.gitignore index f3e84b6..cbd5d61 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ build/ .vscode/ .idea/ +./config.yaml +target/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..93a0194 --- /dev/null +++ b/Makefile @@ -0,0 +1,64 @@ +VERSION := $(shell git describe --tags) +GIT_HASH := $(shell git rev-parse --short HEAD ) + +GO_VERSION ?= $(shell go version) +GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) +LDFLAGS = -ldflags "-X main.Version=${VERSION} -X main.GitHash=${GIT_HASH} -X main.GoVersion=${GO_VERSION_NUMBER}" + +.PHONY: build +build: + CGO_ENABLED=0 go build ${LDFLAGS} -v -o target/aci-exporter . + +.PHONY: build-release +build-release: build-release-amd64 build-release-arm64 + +.PHONY: build-release-amd64 +build-release-amd64: + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ${LDFLAGS} -o=aci-exporter.linux.amd64 . && \ + CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build ${LDFLAGS} -o=aci-exporter.windows.amd64.exe . && \ + CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build ${LDFLAGS} -o=aci-exporter.darwin.amd64 . + +.PHONY: build-release-arm64 +build-release-arm64: + CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build ${LDFLAGS} -o=aci-exporter.linux.arm64 . && \ + CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build ${LDFLAGS} -o=aci-exporter.darwin.arm64 . + +.PHONY: generate-html-coverage +generate-html-coverage: + go tool cover -html=cover.out -o coverage.html + @printf "Generated coverage html \n" + +.PHONY: print-coverage +print-coverage: + @go tool cover -func cover.out + +.PHONY: test-unittests +test-unittests: + go test -v -race -coverprofile cover.out ./... + +.PHONY: test +test: fmt-check vet test-unittests generate-html-coverage print-coverage + @printf "Successfully run tests \n" + +.PHONY: get-dependencies +get-dependencies: + go get -v -t -d ./... + +.PHONY: vet +vet: + @go vet ./... + @go mod tidy + +test-output: + $(shell echo $$GO_VERSION_NUMBER) + +.PHONY: fmt-fix +fmt-fix: + @go mod download golang.org/x/tools + @go run golang.org/x/tools/cmd/goimports -w -l . + +.PHONY: fmt-check +fmt-check: + @printf "Check formatting... \n" + @go mod download golang.org/x/tools + @if [[ $$( go run golang.org/x/tools/cmd/goimports -l . ) ]]; then printf "Files not properly formatted. Run 'make fmt-fix' \n"; exit 1; else printf "Check formatting finished \n"; fi diff --git a/aci-api.go b/aci-api.go index e365d1d..d655a53 100644 --- a/aci-api.go +++ b/aci-api.go @@ -17,14 +17,15 @@ import ( "context" "encoding/json" "fmt" + "strconv" + "strings" + "time" + "github.com/Knetic/govaluate" log "github.com/sirupsen/logrus" "github.com/spf13/viper" "github.com/tidwall/gjson" "github.com/umisama/go-regexpcache" - "strconv" - "strings" - "time" ) var arrayExtension = regexpcache.MustCompile("^(?P.*)\\.\\[(?P.*)\\](?P.*)") diff --git a/aci-exporter.go b/aci-exporter.go index 81767e0..f70fcfc 100644 --- a/aci-exporter.go +++ b/aci-exporter.go @@ -21,13 +21,14 @@ import ( "strconv" "time" + "net/http" + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/segmentio/ksuid" log "github.com/sirupsen/logrus" "github.com/spf13/viper" - "net/http" ) type loggingResponseWriter struct {