From 1c7d6a233ab3643c66e7467eae079acaf5352247 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Wed, 17 Mar 2021 14:13:04 +0100 Subject: [PATCH] Add golang check targets This change adds check targets for Golang to the make file. These are also added as stages to the to the Jenkinsfile definition and the GitLab CI is modified to use them too. Signed-off-by: Evan Lezar --- .gitlab-ci.yml | 34 ++++++++++++------ Jenkinsfile | 94 ++++++++++++++++++++++++++++++++++---------------- Makefile | 36 +++++++++++++++++++ 3 files changed, 124 insertions(+), 40 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3480aa47..dbd9552f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,3 +1,17 @@ +# Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. +# +# 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. + # Build packages for all supported OS / ARCH combinations stages: @@ -37,42 +51,40 @@ lint: <<: *tests-setup stage: tests script: - - go get -u golang.org/x/lint/golint - - golint -set_exit_status ${PROJECT_GOPATH}/pkg + - GO111MODULE=off go get -u golang.org/x/lint/golint + - make lint vet: <<: *tests-setup stage: tests script: - - go vet ${PROJECT_GOPATH}/pkg + - make vet unit_test: <<: *tests-setup stage: tests script: - - go test ${PROJECT_GOPATH}/pkg + - make test fmt: <<: *tests-setup stage: tests script: - - res=$(gofmt -l pkg/*.go) - - echo "$res" - - test -z "$res" + - make assert-fmt ineffassign: <<: *tests-setup stage: tests script: - - go get -u github.com/gordonklaus/ineffassign - - ineffassign pkg/*.go + - GO111MODULE=off go get -u github.com/gordonklaus/ineffassign + - make ineffassign misspell: <<: *tests-setup stage: tests script: - - go get -u github.com/client9/misspell/cmd/misspell - - misspell pkg/*.go + - GO111MODULE=off go get -u github.com/client9/misspell/cmd/misspell + - make misspell # build-one jobs build packages for a single OS / ARCH combination. # diff --git a/Jenkinsfile b/Jenkinsfile index d720bd66..d68db797 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,21 +14,53 @@ # limitations under the License. */ -def getBuildClosure(def architecture, def makeCommand, def makeTarget) { - return { - container('docker') { - stage(architecture) { - sh "${makeCommand} ${makeTarget}" +podTemplate (cloud:'sw-gpu-cloudnative', + containers: [ + containerTemplate(name: 'docker', image: 'docker:dind', ttyEnabled: true, privileged: true), + containerTemplate(name: 'golang', image: 'golang:1.14.2', ttyEnabled: true) + ]) { + node(POD_LABEL) { + stage('checkout') { + checkout scm + } + stage('dependencies') { + container('golang') { + sh 'GO111MODULE=off go get -u github.com/client9/misspell/cmd/misspell' + sh 'GO111MODULE=off go get -u github.com/gordonklaus/ineffassign' + sh 'GO111MODULE=off go get -u golang.org/x/lint/golint' } + container('docker') { + sh 'apk add --no-cache make bash' + } + } + stage('check') { + parallel ( + getGolangStages(["assert-fmt", "lint", "vet", "ineffassign", "misspell"]) + ) + } + stage('test') { + parallel ( + getGolangStages(["test"]) + ) + } + stage('build-one') { + parallel ( + getSingleBuildForArchitectures(["amd64", "ppc64le", "arm64"]) + ) + } + stage('build-all') { + parallel ( + getAllBuildForArchitectures(["amd64", "ppc64le", "arm64", "x86_64", "aarch64"]) + ) } } } -def getBuildStagesForArchitectures(def architectures, def makeCommand, def makeTargetPrefix) { +def getGolangStages(def targets) { stages = [:] - for (a in architectures) { - stages[a] = getBuildClosure(a, makeCommand, "${makeTargetPrefix}-${a}") + for (t in targets) { + stages[t] = getLintClosure(t) } return stages @@ -43,28 +75,32 @@ def getAllBuildForArchitectures(def architectures) { return getBuildStagesForArchitectures(architectures, "echo make", "docker") } -podTemplate (cloud:'sw-gpu-cloudnative', - containers: [ - containerTemplate(name: 'docker', image: 'docker:dind', ttyEnabled: true, privileged: true) - ]) { - node(POD_LABEL) { - stage('checkout') { - checkout scm - } - stage('dependencies') { - container('docker') { - sh 'apk add --no-cache make bash' +def getBuildStagesForArchitectures(def architectures, def makeCommand, def makeTargetPrefix) { + stages = [:] + + for (a in architectures) { + stages[a] = getBuildClosure(a, makeCommand, "${makeTargetPrefix}-${a}") + } + + return stages +} + +def getBuildClosure(def architecture, def makeCommand, def makeTarget) { + return { + container('docker') { + stage(architecture) { + sh "${makeCommand} ${makeTarget}" } } - stage('build-one') { - parallel ( - getSingleBuildForArchitectures(["amd64", "ppc64le", "arm64"]) - ) - } - stage('build-all') { - parallel ( - getAllBuildForArchitectures(["amd64", "ppc64le", "arm64", "x86_64", "aarch64"]) - ) + } +} + +def getLintClosure(def target) { + return { + container('golang') { + stage(target) { + sh "make ${target}" + } } } -} \ No newline at end of file +} diff --git a/Makefile b/Makefile index 72f4ea65..5d4afa06 100644 --- a/Makefile +++ b/Makefile @@ -29,3 +29,39 @@ include $(CURDIR)/docker/docker.mk binary: go build -ldflags "-s -w" -o "$(LIB_NAME)" $(GOLANG_PKG_PATH) + +# Define the check targets for the Golang codebase +MODULE := . +.PHONY: check fmt assert-fmt ineffassign lint misspell vet +check: assert-fmt lint misspell vet +fmt: + go list -f '{{.Dir}}' $(MODULE)/... \ + | xargs gofmt -s -l -w + +assert-fmt: + go list -f '{{.Dir}}' $(MODULE)/... \ + | xargs gofmt -s -l > fmt.out + @if [ -s fmt.out ]; then \ + echo "\nERROR: The following files are not formatted:\n"; \ + cat fmt.out; \ + rm fmt.out; \ + exit 1; \ + else \ + rm fmt.out; \ + fi + +ineffassign: + ineffassign $(MODULE)/... + +lint: + # We use `go list -f '{{.Dir}}' $(GOLANG_PKG_PATH)/...` to skip the `vendor` folder. + go list -f '{{.Dir}}' $(MODULE)/... | xargs golint -set_exit_status + +misspell: + misspell $(MODULE)/... + +vet: + go vet $(MODULE)/... + +test: + go test $(MODULE)/...