在 《The Continuous Delivery Maturity Model》中,着重强调了 report 在 CI/CD 中的重要性,而且特别提到了要求做到做到历史 report 趋势的分析。gitlab-ci 由于本身设计的原因很难实现这些,我们必须借助三方软件的力量,例如 Sonar。

使用Docker镜像

将整个过程拆分为 Golang 数据分析以及 SonarCube 上报两个阶段,且分别使用合适的 Docker Image:

stages:
    - analysis
    - sonar
Golang 如何接入 Sonar

官方给出的示例配置如下:

sonar.projectKey=com.company.projectkey1
sonar.projectName=My Project Name
 
 
sonar.sources=.
sonar.exclusions=**/*_test.go,**/vendor/**
 
 
sonar.tests=.
sonar.test.inclusions=**/*_test.go
sonar.test.exclusions=**/vendor/**
feature分支使用 Sonar 的 preview 功能:
sonar.analysis.mode=preview
最后:完整的.gitlab-ci.yml
stages:
    - analysis
    - sonar

analysis:
    stage: analysis
    image: golang:1.10.5-alpine
    script:
        - mkdir -p $GOPATH/src/$(dirname SampleProject)
        - ln -svf $CI_PROJECT_DIR $GOPATH/src/SampleProject
        - cd $GOPATH/src/SampleProject
        - go test -v -test.short -coverprofile=coverage.out -timeout=10s $(go list ./... | grep -v /vendor/) -json > report.json
    artifacts:
        expire_in: 1 day
        paths:
            - report.json
            - coverage.out
    tags:
        - k8s_public_centos7.2.1511
    retry: 2

sonar-preview:
    stage: sonar
    image: newtmitch/sonar-scanner:3.2.0
    script:
        - cd $CI_PROJECT_DIR
        - sonar-scanner -X
            -Dsonar.host.url=<Your_SonarCube_URL>
            -Dsonar.projectKey=<Your_Project_URL>
            -Dsonar.projectName=<Your_Project_Name>
            -Dsonar.sources=.
            -Dsonar.analysis.mode=preview
            -Dsonar.sources.inclusions=**/*.go
            -Dsonar.exclusions=doc/**,**/*_test.go,**/vendor/**,.git/**,.glide/**
            -Dsonar.tests=.
            -Dsonar.test.inclusions=**/*_test.go
            -Dsonar.test.exclusions=**/vendor/**
            -Dsonar.go.tests.reportPaths=report.json
            -Dsonar.go.coverage.reportPaths=coverage.out
    dependencies: 
        - analysis
    except:
        - master
    tags:
        - k8s_public_centos7.2.1511
    retry: 2

sonar:
    stage: sonar
    image: newtmitch/sonar-scanner:3.2.0
    script:
        - cd $CI_PROJECT_DIR
        - sonar-scanner -X
            -Dsonar.host.url=<Your_SonarCube_URL>
            -Dsonar.projectKey=<Your_Project_URL>
            -Dsonar.projectName=<Your_Project_Name>
            -Dsonar.sources=.
            -Dsonar.sources.inclusions=**/*.go
            -Dsonar.exclusions=doc/**,**/*_test.go,**/vendor/**,.git/**,.glide/**
            -Dsonar.tests=.
            -Dsonar.test.inclusions=**/*_test.go
            -Dsonar.test.exclusions=**/vendor/**
            -Dsonar.go.tests.reportPaths=report.json
            -Dsonar.go.coverage.reportPaths=coverage.out
    dependencies: 
        - analysis
    only:
        - master
    tags:
        - k8s_public_centos7.2.1511
    retry: 2