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)/...