Author: Kenny Allen
Email: kennyallen0520@gmail.com
предисловие
В процессе разработки ПО очень кропотливо и кропотливо вручную проверять лазейки и потенциальные ошибки в коде проекта.Для решения этой болевой точки родился SonarQube, который реализует ряд процессов автоматического обнаружения кода, включая спецификации имен, уязвимости кода, количество дублирований кода и т. д.
Однако один SonarQube не может быть настолько эффективным, как должен быть, Полная непрерывная проверка качества кода должна осуществляться совместно с хранилищами кода (такими как gitlab) и Jenkins для совместного создания автоматизированного процесса.
окрестности
-
Сервисы Gitlab, Jenkins, SonarQube работают в Docker на одной физической машине.
-
Сеть (IP-адрес локальной сети: 192.168.1.100)
-
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
инициализация
-
Откройте браузер и посетитеjenkins.kenny.com:8080
# 在日志中找到管理员密码 docker logs -f jenkins # 或者在 $JENKINS_HOME/secrets/initialAdminPassword 文件中找到管理员密码 cat $JENKINS_HOME/secrets/initialAdminPassword
-
Установите рекомендуемые плагины (если вы хотите установить плагины самостоятельно, нажмите «Выбрать плагины для установки»)
-
Создать учетную запись администратора
-
загрузка завершена
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
инициализация
-
Откройте браузер и посетитеgitlab.kenny.com
-
После установки нового пароля войдите в систему под пользователем root
-
Создайте новую команду проекта sonarqube
-
Создайте новый демонстрационный проект в группе проекта sonarqube.
-
Добавить открытый ключ хоста в Gitlab
# 生成 rsa 公钥和密钥 ssh-keygen -t rsa # 查看并复制公钥 cat ~/.ssh/id_rsa.pub
доступGit Lab.Kenya.com/profile/can..., добавьте открытый ключ в Gitlab
-
Перетащите проект 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
инициализация
-
Откройте браузер и посетитеsonarqube.kenny.com:9000
-
Войти с учетной записью администратора
- Администратор аккаунта
- пароль администратора
-
Сгенерировать токен (как идентификатор удаленного подключения к SonarQube, он генерируется только один раз, не забудьте сделать его резервную копию)
admin_token: 74439d5bc557dcc206fa8b1f2f5516e65680bdc8
-
Установите плагин (перейдите в Администрирование -> Торговая площадка)
После завершения установки нажмите, чтобы перезапустить службу SonarQube, и все будет в порядке.
интегрированный
- Интегрируйте Jenkins, Gitlab и SonarQube
Дженкинс установить плагин
-
Нажмите, чтобы войти в «Управление системой» -> «Управление плагинами» -> «Дополнительные плагины».
-
Отфильтруйте, чтобы выбрать Gitlab, SonarQube Scanner, нажмите «Загрузить», чтобы установить после перезапуска.
Конфигурация Дженкинса
-
Установите SonarQube и JDK
Перейдите в «Управление системой» -> «Глобальная конфигурация инструмента».
установка JDK
-
SonarQube Server
Перейдите в «Управление системой» -> «Настройки системы».
Найдите серверы SonarQube
Имя просто заполните
Server URL: sonarqube.kenny.com:9000
Server version: 5.3 or higher
Токен аутентификации сервера: введите токен, сгенерированный при инициализации SonarQube.
-
Деавторизовать Gitlab
Снимите флажок Включить аутентификацию для конечной точки «/project», сохраните
-
Установите среду и инструменты 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
-
Настроить уведомления по электронной почте
Перейдите в «Управление системой» -> «Настройки системы».
Jenkins Location
Измените адрес электронной почты системного администратора на свой собственный адрес электронной почты, напримерwyh3265@163.com
Extend E-mail Notification
Сервер SMTP Введите соответствующий адрес службы SMTP, например smtp.163.com.
Установите флажок Использовать SMTP-аутентификацию
Имя пользователя Обратите внимание, что вам не нужно добавлять @xxx.xxx
Пароль Введите пароль электронной почты или код авторизации
Триггеры по умолчанию Проверять всегда
Новая задача сборки Jenkins
-
Создайте новый проект программного обеспечения в свободном стиле
-
Используйте пользовательское рабочее пространство
Каталог: $JENKINS_HOME/workspace/go/src/gitlab.kenny.com/demo
-
управление исходным кодом
URL репозитория:git lab.kenya.com/sonar go be/of…
Учетные данные: можно использовать имя пользователя и пароль Gitlab или логин SSH.
-
Построить триггер, проверить
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.
-
Новый вебхук
открыть в браузереgit lab.kenya.com/admin/app…(Пожалуйста, войдите в систему как root), найдите Исходящие запросы, нажмите Развернуть, установите флажок Разрешить запросы в локальную сеть от хуков и сервисов и сохраните изменения. (Разрешить github для локальной сети)
Входитьgit lab.kenya.com/sonar go be/of…
URL: Jenkins.kenya.com:8080/project/s…
SecretToken: оставьте пустым
проверилPush events,Merge request events
снимите флажокEnable SSL verification
Нажмите Добавить веб-хук
-
Добавьте шаг сборки, выберите 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
-
Добавьте шаг сборки, отметьте 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
-
Добавьте действие после сборки, выберите Редактируемое уведомление по электронной почте.
Список получателей проекта Введите адрес электронной почты, чтобы получать электронные письма, или используйте конфигурацию по умолчанию.
Содержимое по умолчанию плюс URL-адрес SonarQube:sonarqube.kenny.com:9000
контрольная работа
# 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
TODO
- Решить проблему невозможности выполнить gometalinter
- Стандарты качества Golang, пользовательские правила
- ...