Browse Source
			
			
			
			
				
		* v2: introduce CI for v2 branch * v2-ci: split test report generation from test pass to preserve exit code * v2-ci: spilt lint results from unit test results * v2-ci: fix testRunTitle name * v2-ci: break up the steps for more accurate status indicators * v2-ci: break steps into different jobs * v2-ci: revert back to single-job pattern * v2-ci: reflect the true result by coercing SucceededWithIssues into Failed in the last step * v2-ci: don't fail the build on lint errorsmaster
							committed by
							
								 Matt Holt
								Matt Holt
							
						
					
				
				 2 changed files with 144 additions and 0 deletions
			
			
		| @ -0,0 +1,142 @@ | |||||
|  | # Mutilated beyond recognition from the example at: | ||||
|  | # https://docs.microsoft.com/azure/devops/pipelines/languages/go | ||||
|  | 
 | ||||
|  | trigger: | ||||
|  | - v2 | ||||
|  | 
 | ||||
|  | strategy: | ||||
|  |   matrix: | ||||
|  |     linux: | ||||
|  |       imageName: ubuntu-16.04 | ||||
|  |       gorootDir: /usr/local | ||||
|  |     mac: | ||||
|  |       imageName: macos-10.13 | ||||
|  |       gorootDir: /usr/local | ||||
|  |     windows: | ||||
|  |       imageName: windows-2019 | ||||
|  |       gorootDir: C:\ | ||||
|  | pool: | ||||
|  |   vmImage: $(imageName) | ||||
|  | 
 | ||||
|  | variables: | ||||
|  |   GOROOT: $(gorootDir)/go | ||||
|  |   GOPATH: $(system.defaultWorkingDirectory)/gopath | ||||
|  |   GOBIN:  $(GOPATH)/bin | ||||
|  |   modulePath: '$(GOPATH)/src/github.com/$(build.repository.name)' | ||||
|  |   # TODO: Remove once it's enabled by default | ||||
|  |   GO111MODULE: on | ||||
|  | 
 | ||||
|  | steps: | ||||
|  | - bash: | | ||||
|  |     latestGo=$(curl "https://golang.org/VERSION?m=text") | ||||
|  |     echo "##vso[task.setvariable variable=LATEST_GO]$latestGo" | ||||
|  |     echo "Latest Go version: $latestGo" | ||||
|  |   displayName: "Get latest Go version" | ||||
|  | 
 | ||||
|  | - bash: | | ||||
|  |     sudo rm -f $(which go) | ||||
|  |     echo '##vso[task.prependpath]$(GOBIN)' | ||||
|  |     echo '##vso[task.prependpath]$(GOROOT)/bin' | ||||
|  |     mkdir -p '$(modulePath)' | ||||
|  |     shopt -s extglob | ||||
|  |     shopt -s dotglob | ||||
|  |     mv !(gopath) '$(modulePath)' | ||||
|  |   displayName: Remove old Go, set GOBIN/GOROOT, and move project into GOPATH | ||||
|  | 
 | ||||
|  | # Install Go (this varies by platform) | ||||
|  | - bash: | | ||||
|  |     wget "https://dl.google.com/go/$(LATEST_GO).linux-amd64.tar.gz" | ||||
|  |     sudo tar -C $(gorootDir) -xzf "$(LATEST_GO).linux-amd64.tar.gz" | ||||
|  |   condition: eq( variables['Agent.OS'], 'Linux' ) | ||||
|  |   displayName: Install Go on Linux | ||||
|  | 
 | ||||
|  | - bash: | | ||||
|  |     wget "https://dl.google.com/go/$(LATEST_GO).darwin-amd64.tar.gz" | ||||
|  |     sudo tar -C $(gorootDir) -xzf "$(LATEST_GO).darwin-amd64.tar.gz" | ||||
|  |   condition: eq( variables['Agent.OS'], 'Darwin' ) | ||||
|  |   displayName: Install Go on macOS | ||||
|  | 
 | ||||
|  | - powershell: | | ||||
|  |     Write-Host "Downloading Go... (please be patient, I am very slow)" | ||||
|  |     (New-Object System.Net.WebClient).DownloadFile("https://dl.google.com/go/$(LATEST_GO).windows-amd64.zip", "$(LATEST_GO).windows-amd64.zip") | ||||
|  |     Write-Host "Extracting Go... (I'm slow too)" | ||||
|  |     Expand-Archive "$(LATEST_GO).windows-amd64.zip" -DestinationPath "$(gorootDir)" | ||||
|  |   condition: eq( variables['Agent.OS'], 'Windows_NT' ) | ||||
|  |   displayName: Install Go on Windows | ||||
|  | 
 | ||||
|  | - bash: curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.19.1 | ||||
|  |   displayName: Install golangci-lint | ||||
|  | 
 | ||||
|  | - script: | | ||||
|  |     go get github.com/axw/gocov/gocov | ||||
|  |     go get github.com/AlekSi/gocov-xml | ||||
|  |     go get -u github.com/jstemmer/go-junit-report | ||||
|  |   displayName: Install test and coverage analysis tools | ||||
|  | 
 | ||||
|  | - bash: | | ||||
|  |     printf "Using go at: $(which go)\n" | ||||
|  |     printf "Go version: $(go version)\n" | ||||
|  |     printf "\n\nGo environment:\n\n" | ||||
|  |     go env | ||||
|  |     printf "\n\nSystem environment:\n\n" | ||||
|  |     env | ||||
|  |   displayName: Print Go version and environment | ||||
|  | 
 | ||||
|  | - script: | | ||||
|  |     go get -v -t -d ./... | ||||
|  |     mkdir test-results | ||||
|  |   workingDirectory: '$(modulePath)' | ||||
|  |   displayName: Get dependencies | ||||
|  | 
 | ||||
|  | - script: | | ||||
|  |     (golangci-lint run --out-format junit-xml -E gofmt -E goimports -E misspell) > test-results/lint-result.xml | ||||
|  |     exit 0 | ||||
|  |   workingDirectory: '$(modulePath)' | ||||
|  |   continueOnError: true | ||||
|  |   displayName: Run lint check | ||||
|  | 
 | ||||
|  | - script: | | ||||
|  |     (go test -v -coverprofile=cover-profile.out -race ./... 2>&1) > test-results/test-result.out | ||||
|  |   workingDirectory: '$(modulePath)' | ||||
|  |   continueOnError: true | ||||
|  |   displayName: Run tests | ||||
|  | 
 | ||||
|  | - script: | | ||||
|  |     mkdir coverage | ||||
|  |     gocov convert cover-profile.out > coverage/coverage.json | ||||
|  |     # Because Windows doesn't work with input redirection like *nix, but output redirection works. | ||||
|  |     (cat ./coverage/coverage.json | gocov-xml) > coverage/coverage.xml  | ||||
|  |   workingDirectory: '$(modulePath)' | ||||
|  |   displayName: Prepare coverage reports | ||||
|  | 
 | ||||
|  | - script: | | ||||
|  |     (cat ./test-results/test-result.out | go-junit-report) > test-results/test-result.xml | ||||
|  |   workingDirectory: '$(modulePath)' | ||||
|  |   displayName: Prepare test report | ||||
|  | 
 | ||||
|  | - task: PublishCodeCoverageResults@1 | ||||
|  |   displayName: Publish test coverage report | ||||
|  |   inputs: | ||||
|  |     codeCoverageTool: Cobertura  | ||||
|  |     summaryFileLocation: $(modulePath)/coverage/coverage.xml | ||||
|  | 
 | ||||
|  | - task: PublishTestResults@2 | ||||
|  |   displayName: Publish unit test | ||||
|  |   inputs: | ||||
|  |     testResultsFormat: 'JUnit' | ||||
|  |     testResultsFiles: $(modulePath)/test-results/test-result.xml | ||||
|  |     testRunTitle: $(agent.OS) Unit Test | ||||
|  |     mergeTestResults: false | ||||
|  | 
 | ||||
|  | - task: PublishTestResults@2 | ||||
|  |   displayName: Publish lint results | ||||
|  |   inputs: | ||||
|  |     testResultsFormat: 'JUnit' | ||||
|  |     testResultsFiles: $(modulePath)/test-results/lint-result.xml | ||||
|  |     testRunTitle: $(agent.OS) Lint | ||||
|  |     mergeTestResults: false | ||||
|  | 
 | ||||
|  | - bash: | | ||||
|  |     exit 1 | ||||
|  |   condition: eq(variables['Agent.JobStatus'], 'SucceededWithIssues') | ||||
|  |   displayName: Coerce correct build result | ||||
					Loading…
					
					
				
		Reference in new issue