Непрерывный контроль качества кода Golang

сервер GitLab Jenkins SonarQube

Author: Kenny Allen

Email: kennyallen0520@gmail.com

предисловие

В процессе разработки ПО очень кропотливо и кропотливо вручную проверять лазейки и потенциальные ошибки в коде проекта.Для решения этой болевой точки родился SonarQube, который реализует ряд процессов автоматического обнаружения кода, включая спецификации имен, уязвимости кода, количество дублирований кода и т. д.

Однако один SonarQube не может быть настолько эффективным, как должен быть, Полная непрерывная проверка качества кода должна осуществляться совместно с хранилищами кода (такими как gitlab) и Jenkins для совместного создания автоматизированного процесса.

окрестности

  • Сервисы Gitlab, Jenkins, SonarQube работают в Docker на одной физической машине.

  • Сеть (IP-адрес локальной сети: 192.168.1.100)

    7.48.39

  • Host Scientific Internet Proxy

    192.168.1.100:1087

  • Имитировать доступ к внешней сети

    # 修改 hosts 文件,模拟外网访问
    sudo sh -c "echo '192.168.1.100 jenkins.kenny.com\n192.168.1.100 gitlab.kenny.com\n192.168.1.100 sonarqube.kenny.com' >> /etc/hosts"
  • Набор инструментов

название Версия
golang go1.10.3
docker 18.03.1-ce

строить

Далее я представлю процесс строительства с полным корпусом.

Jenkins

запустить службу
# $jenkins_home 宿主机目录,挂载容器 /var/jenkins_home
# 我的数据卷目录是 ~/.jenkins
export JENKINS_HOME=~/.jenkins
docker run -d --restart=always -p 8080:8080 -p 50000:50000 -v $JENKINS_HOME:/var/jenkins_home --name jenkins jenkins

# 查看 jenkins 日志
docker logs -f jenkins
инициализация
  1. Откройте браузер и посетитеjenkins.kenny.com:8080

    9.11.34

    # 在日志中找到管理员密码
    docker logs -f jenkins 
    
    # 或者在 $JENKINS_HOME/secrets/initialAdminPassword 文件中找到管理员密码
    cat $JENKINS_HOME/secrets/initialAdminPassword

    9.09.27

    9.11.06

  2. Установите рекомендуемые плагины (если вы хотите установить плагины самостоятельно, нажмите «Выбрать плагины для установки»)

    9.13.59

  3. Создать учетную запись администратора

    9.19.17

  4. загрузка завершена

    9.19.55

Gitlab

Запустите службу (у gitlab много встроенных служб, поэтому она должна занимать большой объем памяти, официальная рекомендация — более 4 ГБ)
# $gitlab_home 宿主机目录
# 我的数据卷目录是 ~/.gitlab
export GITLAB_HOME=~/.gitlab
docker run -d --restart=always -e 'GITLAB_HOST=gitlab.kenny.com' -p 443:443 -p 80:80 -p 22:22 -v $GITLAB_HOME/conf:/etc/gitlab -v $GITLAB_HOME:/var/opt/gitlab -v $GITLAB_HOME/log:/var/log/gitlab --name gitlab gitlab/gitlab-ce

# 查看 gitlab 日志
docker logs -f gitlab
инициализация
  1. Откройте браузер и посетитеgitlab.kenny.com

    9.26.59

  2. После установки нового пароля войдите в систему под пользователем root

    9.27.29

    9.27.42

  3. Создайте новую команду проекта sonarqube

    9.29.45

  4. Создайте новый демонстрационный проект в группе проекта sonarqube.

    9.31.26 9.32.38

  5. Добавить открытый ключ хоста в Gitlab

    # 生成 rsa 公钥和密钥
    ssh-keygen -t rsa
    
    # 查看并复制公钥
    cat ~/.ssh/id_rsa.pub

    9.36.12

    9.37.39

    доступGit Lab.Kenya.com/profile/can..., добавьте открытый ключ в Gitlab

    9.38.15

    9.38.18

  6. Перетащите проект sonarqube/demo в $GOPATH хоста.

    # 在 $GOPATH 下创建 gitlab.kenny.com 文件夹
    mkdir -p $GOPATH/src/gitlab.kenny.com && cd $GOPATH/src/gitlab.kenny.com
    
    # clone code
    git clone git@gitlab.kenny.com:sonarqube/demo.git

SonarQube

запустить службу
# 由于目前 sonarqube 官方的 Docker images 只有 7.1 版本,不满足 SonarGO 所需 7.2+ 版本,所以我参考7.1 的 Dockerfile 制作了一个 sonarqube 7.2.1 的镜像
# $sonarqube_home 宿主机目录
# 我的数据卷目录是 ~/.sonarqube
export SONARQUBE_HOME=~/.sonarqube
# 正式环境中应启用外部数据库服务来存储必要数据,在启动容器时设置如下JDBC相关参数:
# -e SONARQUBE_JDBC_USERNAME=sonar 
# -e SONARQUBE_JDBC_PASSWORD=sonar 
# -e SONARQUBE_JDBC_URL=jdbc:postgresql://localhost/sonar
docker run -d --restart=always -p 9000:9000 -v $SONARQUBE_HOME:/opt/sonarqube/data --name sonarqube kennyallen/sonarqube:7.2.1

# 查看 sonarqube 日志
docker logs -f sonarqube
инициализация
  1. Откройте браузер и посетитеsonarqube.kenny.com:9000

    8.58.40

  2. Войти с учетной записью администратора

    • Администратор аккаунта
    • пароль администратора

    8.59.06

  3. Сгенерировать токен (как идентификатор удаленного подключения к SonarQube, он генерируется только один раз, не забудьте сделать его резервную копию)

    admin_token: 74439d5bc557dcc206fa8b1f2f5516e65680bdc8

    8.59.41

  4. Установите плагин (перейдите в Администрирование -> Торговая площадка)

    9.01.25

    После завершения установки нажмите, чтобы перезапустить службу SonarQube, и все будет в порядке.

интегрированный

  • Интегрируйте Jenkins, Gitlab и SonarQube

Дженкинс установить плагин

  1. Нажмите, чтобы войти в «Управление системой» -> «Управление плагинами» -> «Дополнительные плагины».

    9.43.39

  2. Отфильтруйте, чтобы выбрать Gitlab, SonarQube Scanner, нажмите «Загрузить», чтобы установить после перезапуска.

    9.45.12 9.45.35

Конфигурация Дженкинса

  1. Установите SonarQube и JDK

    Перейдите в «Управление системой» -> «Глобальная конфигурация инструмента».

    установка JDK

    11.31.38

    Установка сканера SonarQube11.32.15

  2. SonarQube Server

    Перейдите в «Управление системой» -> «Настройки системы».

    Найдите серверы SonarQube

    Имя просто заполните

    Server URL: sonarqube.kenny.com:9000

    Server version: 5.3 or higher

    Токен аутентификации сервера: введите токен, сгенерированный при инициализации SonarQube.

    9.53.05

  3. Деавторизовать Gitlab

    Снимите флажок Включить аутентификацию для конечной точки «/project», сохраните

    11.20.17

  4. Установите среду и инструменты golang в контейнер jenkins.

    # 在 Jenkins 容器中执行命令
    docker exec -it jenkins /bin/bash
    # 临时设置环境变量
    export GOROOT=$JENKINS_HOME/go
    export GOPATH=$JENKINS_HOME/workspace/go
    export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    export http_proxy=http://192.168.1.100:1087;export https_proxy=http://192.168.1.100:1087;
    # 进入 jenkins 主目录
    cd $JENKINS_HOME
    # 下载 golang
    wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
    # 解压 golang 包
    tar -xvf  go1.10.3.linux-amd64.tar.gz
    # 删除 golang 包
    rm go1.10.3.linux-amd64.tar.gz
    # 安装必要工具
    # vgo
    go get -u -v golang.org/x/vgo
    # gometalinter
    go get -u -v github.com/alecthomas/gometalinter
    gometalinter --install
  5. Настроить уведомления по электронной почте

    Перейдите в «Управление системой» -> «Настройки системы».

    Jenkins Location

    Измените адрес электронной почты системного администратора на свой собственный адрес электронной почты, напримерwyh3265@163.com

    11.29.11

    Extend E-mail Notification

    Сервер SMTP Введите соответствующий адрес службы SMTP, например smtp.163.com.

    Установите флажок Использовать SMTP-аутентификацию

    Имя пользователя Обратите внимание, что вам не нужно добавлять @xxx.xxx

    Пароль Введите пароль электронной почты или код авторизации

    11.50.08

    Триггеры по умолчанию Проверять всегда

    11.50.26

Новая задача сборки Jenkins

  1. Создайте новый проект программного обеспечения в свободном стиле

    10.35.38

  2. Используйте пользовательское рабочее пространство

    Каталог: $JENKINS_HOME/workspace/go/src/gitlab.kenny.com/demo

    10.51.25

  3. управление исходным кодом

    URL репозитория:git lab.kenya.com/sonar go be/of…

    Учетные данные: можно использовать имя пользователя и пароль Gitlab или логин SSH.10.37.19

  4. Построить триггер, проверить

    Build when a change is pushed to GitLab. GitLab webhook URL: Jenkins.kenya.com:8080/project/s…

    Включенные триггеры GitLab. Отметьте Push Events и Accepted Merge Request Events, чтобы запускать сборки, когда в Gitlab есть операция push или merge.

    10.39.03

  5. Новый вебхук

    открыть в браузереgit lab.kenya.com/admin/app…(Пожалуйста, войдите в систему как root), найдите Исходящие запросы, нажмите Развернуть, установите флажок Разрешить запросы в локальную сеть от хуков и сервисов и сохраните изменения. (Разрешить github для локальной сети)

    10.43.37

    Входитьgit lab.kenya.com/sonar go be/of…

    URL: Jenkins.kenya.com:8080/project/s…

    SecretToken: оставьте пустым

    проверилPush events,Merge request events

    снимите флажокEnable SSL verification

    Нажмите Добавить веб-хук

    10.46.50

  6. Добавьте шаг сборки, выберите Execute Shell

    #!/bin/bash
    # 环境变量
    export GOROOT=$JENKINS_HOME/go
    export GOPATH=$JENKINS_HOME/workspace/go
    export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    export http_proxy=http://192.168.1.100:1087;export https_proxy=http://192.168.1.100:1087;
    
    # 安装依赖
    vgo mod -vendor
    
    # coverage
    go test ./... -coverprofile=coverage.out
    
    # test
    go test ./... -json > report.json
    
    # vet
    go vet ./... 2> govet-report.out
    
    # golint
    golint ./... > golint-report.out
    
    # gometalinter 
    # 执行 gometalinter 会失败,因此加了 || true
    gometalinter ./... > gometalinter-report.out || true
  7. Добавьте шаг сборки, отметьте Execute SonarQube Scanner

    Analysis properties

    sonar.projectKey=gitlab.kenny.com
    sonar.projectName=demo
    sonar.sources=.
    sonar.exclusions=**/*_test.go,**/vendor/**
    sonar.tests=.
    sonar.test.inclusions=**/*_test.go
    sonar.test.exclusions=**/vendor/**
    sonar.go.coverage.reportPaths=coverage.out
    sonar.go.tests.reportPaths=report.json
    sonar.go.govet.reportPaths=govet-report.out
    sonar.go.golint.reportPaths=golint-report.out
    sonar.go.gometalinter.reportPaths=gometalinter-report.out
  8. Добавьте действие после сборки, выберите Редактируемое уведомление по электронной почте.

    Список получателей проекта Введите адрес электронной почты, чтобы получать электронные письма, или используйте конфигурацию по умолчанию.

    Содержимое по умолчанию плюс URL-адрес SonarQube:sonarqube.kenny.com:9000

    11.51.18

контрольная работа

# clone demo 代码
cd $GOPATH/src/gitlab.kenny.com && git clone git@github.com:yuhao5/sonarqube-golang.git && rm -rf demo && mv sonarqube-golang demo && cd demo
# push 代码,触发 Jenkins 任务进行自动构建
git remote add gitlab git@gitlab.kenny.com:sonarqube/demo.git
git push -u gitlab master

# 若 gitlab 仓库地址不是 git@gitlab.kenny.com:sonarqube/demo.git ,请根据以下步骤修改:
docker exec -it gitlab /bin/bash
vim /etc/gitlab/gitlab.rb
# 找到 external_url,修改为 external_url 'http://gitlab.kenny.com'
# 然后执行
gitlab-ctl reconfigure

11.53.59

11.35.27

11.09.34

11.10.01

11.10.42

TODO

  1. Решить проблему невозможности выполнить gometalinter
  2. Стандарты качества Golang, пользовательские правила
  3. ...