Docker安装Gitlab管理项目代码并整合Sonarqube分析代码质量【完整操作步骤】
一、前言
1.GitLab
开放式一体化安全DevOps平台,集成了项目管理,CI/CD,安全以及配置监控,软件研发全生命周期的 DevOps 能力,是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。
2.GitLab-CI
GitLab-CI就是一套配合GitLab使用的持续集成系统(当然,还有其它的持续集成系统,同样可以配合GitLab使用,比如Jenkins,而且GitLab8.0以后的版本是默认集成了GitLab-CI并且默认启用的)。
3.GitLab-Runner
GitLab-Runner是配合GitLab-CI进行使用的。一般地,GitLab里面的每一个工程都会定义一个属于这个工程的软件集成脚本,用来自动化地完成一些软件集成工作。当这个工程的仓库代码发生变动时,比如有人push了代码,GitLab就会将这个变动通知GitLab-CI。这时GitLab-CI会找出与这个工程相关联的Runner,并通知这些Runner把代码更新到本地并执行预定义好的执行脚本,所以GitLab-Runner就是一个用来执行软件集成脚本的东西。你可以想象一下:Runner就像一个个的工人,而GitLab-CI就是这些工人的一个管理中心,所有工人都要在GitLab-CI里面登记注册,并且表明自己是为哪个工程服务的,当相应的工程发生变化时,GitLab-CI就会通知相应的工人执行软件集成脚本。
4.Sonarqube
SonarQube是管理代码质量的一个开放平台,可以快速定位代码中潜在的或者明显的错误。支持Java, C#, C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等二十几种编程语言的代码质量管理与检测。
二、准备工作
因为本文介绍的是基于docker安gitlab、gitlab-runner、sonarqube、postgres等镜像,所以先决条件是系统必须先安装好docker才能往下走,如果对docker的安装还不熟悉的可以查看我的另一篇文章【Linux安装最新版Docker完整教程】,安装完之后再往下看。
三、安装Gitlab
3.1 Docker安装最新版Gitlab
#新建gitlab文件目录
mkdir -p /mnt/gitlab/{
config,logs,data}
#拉取最新版本gitlab-ce镜像
docker pull gitlab/gitlab-ce
#启动容器
docker run -d --name gitlab --restart=always --privileged=true \
-p 443:443 -p 6001:6001 -p 2222:22 \
-v /mnt/gitlab/config:/etc/gitlab \
-v /mnt/gitlab/logs:/var/log/gitlab \
-v /mnt/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce
#修改gitlab.rb(如果gitlab页面访问地址和clone地址一致,可以直接使用external_url,而不必开启nginx['listen_addresses']和nginx['listen_port'])
vim /mnt/gitlab/config/gitlab.rb
{
# git clone地址,不加端口号默认为80
external_url 'http://192.168.0.132:6001'
# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '192.168.0.132'
gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 此端口是run时22端口映射的2222端口
# nginx监听地址(gitlab页面访问地址)
nginx['listen_addresses'] = ['*', '[::]']
# 容器内部nginx的监听端口
nginx['listen_port'] = 6001
}
#保存配置文件并退出
:wq
#重启gitlab容器
docker restart gitlab
#进入gitlab容器修改管理员密码
docker exec -it gitlab /bin/bash
#启动Ruby on Rails控制台
gitlab-rails console -e production
#等待控制台加载完毕,搜索电子邮件或用户名
user = User.where(id:1).first
#或者
user = User.find_by(email:'[email protected]')
#修改密码(密码不能包含常用的单词和字母组合)
user.password ='hello@2023'
user.password_confirmation ='hello@2023'
#保存
user.save!
#退出控制台
exit
#退出容器
exit
3.2 访问Gitlab登录页面: http://192.168.0.132:6001
1.管理员账号:[email protected]
2.密码:hello@2023
3.创建gitlab测试项目
4.查看项目地址和token(后面注册Runner时需要用到):Settings—>CI/CD—>Runner—>Project runners
5.Idea搭建SpringBoot测试项目
6.初始化项目仓库并提交代码到Gitlab(刚才创建的main分支是受保护的,所以我们需要创建master分支再提交)
#打开上面Idea搭建的test-sonar项目目录
cd D:\xxx\test-sonar
#初始化git仓库
git init
#添加文件
git add .
#提交代码
git commit -m 'first commit'
#关联远程仓库
git remote add origin http://192.168.0.132:6001/gitlab-instance-096449c7/test-sonar.git
#切换到master分支
git checkout -b master
#推送代码到远程master分支
git push -uf origin master
四、安装GitLab-Runner
4.1 Docker安装最新版GitLab-Runner
因为后面执行Job时可能需要用到mvn或者docker等命令,本文需要用到是mvn命令,所以虚拟机需要安装JDK和MAVEN环境,具体的操作需自行处理,不懂安装的可以查看我的另一篇文章【Docker安装Jenkins…】进行安装
#新建目录
mkdir -p /mnt/gitlab-runner/config
#拉取镜像
docker pull gitlab/gitlab-runner
#启动镜像
docker run -d --name gitlab-runner \
--net=host --restart always --privileged=true \
-v /mnt/gitlab-runner/config:/etc/gitlab-runner \
-v /usr/local/java/jdk-11:/usr/local/java/jdk-11 \
-v /usr/local/maven:/usr/local/maven \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner
# 进入容器
docker exec -it gitlab-runner /bin/bash
# 配置jdk11和maven3.8.6环境变量(容器没有vim命令的话就自行安装一下~)
vim /etc/profile
{
JAVA_HOME=/usr/local/java/jdk-11
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/lib
export JAVA_HOME CLASSPATH PATH
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin
}
# 注册runner
gitlab-runner register
# gitlab地址
【Enter the GitLab instance URL (for example, https://gitlab.com/):】
http://192.168.0.132:6001/
# token
【Enter the registration token:】
GR1348941Q2F_Ya9BrF2V2tupxGet
# 输入runner描述
【Enter a description for the runner:】
test_sonar_runner
# gitlab-runner标签名称tag
【Enter tags for the runner (comma-separated):】
sonar
#gitlab-runner可选维护说明
【Enter optional maintenance note for the runner】
test_sonar
# 选择执行gitlab-runner的执行程序。
【Enter an executor: custom, docker-ssh, parallels, kubernetes, docker, shell, ssh, virtualbox, docker+machine, docker-ssh+machine:】
shell
# 如果选择docker作为执行程序,那要定义一个默认镜像的名称
【Enter the default Docker image (for example, ruby:2.6):】
test_sonar:latest
4.2 在Gitlab的测试项目里查看runner
4.3 流水线测试
4.3.1 在maven项目下新建.gitlab-ci.yml文件
stages:
- build
- test
- deploy
build:
stage: build
tags:
- sonar
only:
- master
script:
- echo "mvn clean "
- echo "mvn install"
test:
stage: test
tags:
- sonar
only:
- master
script:
- echo "hello test"
deploy:
stage: deploy
tags:
- sonar
only:
- master
script:
- echo "hello deploy"
4.3.2 提交文件到Gitlab上
4.3.3 观察CI/CD流水线
4.3.4 gitlab-ci.yml使用
1.什么是gitlab-ci.yml文件
将.gitlab-ci.yml文件添加到存储库的根目录,并将GitLab项目配置为使用Runner,则每次提交或推送都会触发CI 管道
2.参数说明
字段 | 描述 |
---|---|
stages | 定义流水线所有的阶段,如果未定义stages,则默认有build、test、deploy三个阶段 |
stage | 定义一个作业阶段(默认值:)test |
script | 必须参数,由runner执行的shell脚本 |
image | 使用Docker image镜像 |
services | 使用Docker services镜像 |
before_script | 执行作业之前执行的一段shell脚本 |
after_script | 执行完作业之后执行的一段shell脚本 |
only | 限制作业在什么时候创建 |
except | 限制作业在什么时候不创建 |
tags | 作用使用的Runner运行器的标签列表 |
allow_failure | 允许作业失败,失败的作业不影响提交的状态 |
when | 什么时候运行作业 |
environment | 作用部署的环境名称 |
cache | 指定需要在job之间缓存的文件或目录 |
artifacts | 归档文件列表,指定成功后应附加到job的文件和目录的列表 |
dependencies | 当前作业依赖的其他作业,你可以使用依赖作业的归档文件 |
coverage | 作业的代码覆盖率 |
retry | 作业失败时,可以自动执行多少次 |
parallel | 指定并行运行的作业实例 |
trigger | 定义下游流水线的触发器 |
include | 作业加载其他YAML文件 |
extends | 控制实体从哪里继承 |
pages | 上传GitLab Pages的结果 |
variables | 定义环境变量 |
4.3.4 gitlab-runner常用命令
#调试模式排查错误特别有用。
gitlab-runner --debug <command>
#获取帮助信息
gitlab-runner <command> --help
#普通用户模式 配置文件位置 ~/.gitlab-runner/config.toml
gitlab-runner run
# 超级用户模式 配置文件位置/etc/gitlab-runner/config.toml
sudo gitlab-runner run
#注册
gitlab-runner register
#列出所有运行程序
gitlab-runner list
#检查注册的runner是否可以连接。
gitlab-runner verify
#删除
gitlab-runner verify --delete
#取消已注册的runner
gitlab-runner unregister
#使用令牌注销
gitlab-runner unregister --url http://gitlab.example.com/ --token t0k3n
#使用名称注销(同名删除第一个)
gitlab-runner unregister --name test-runner
#注销所有
gitlab-runner unregister --all-runners
#停止运行并从服务中卸载GitLab Runner
gitlab-runner uninstall
#启动GitLab Runner服务
gitlab-runner start
#停止GitLab Runner服务
gitlab-runner stop
#重启GitLab Runner服务
gitlab-runner restart
#显示GitLab Runner服务的状态。当服务正在运行时,退出代码为零;而当服务未运行时,退出代码为非零
gitlab-runner status
五、安装Sonarqube
5.1 Docker安装postgresql数据库
官网上已经声明 sonarQube 7.9 版本以上不再支持 mysql 了,所以我们使用 postgresql,
sonarqube:8.9.8-community版本postgreSQL数据的版本为:9–12。最高支持13版本。
#创建文件目录
mkdir -p /mnt/postgres/{
postgresql,data}
#拉取镜像
docker pull postgres:12.4-alpine
#启动容器
docker run -d --name postgres -p 5432:5432 \
-v /mnt/postgres/postgresql:/var/lib/postgresql \
-v /mnt/postgres/data:/var/lib/postgresql/data \
-v /etc/localtime:/etc/localtime:ro \
-e POSTGRES_USER=sonar \
-e POSTGRES_PASSWORD=sonar \
-e POSTGRES_DB=sonar \
-e TZ=Asia/Shanghai \
--restart always \
--privileged=true \
postgres:12.4-alpine
5.2 Docker安装Sonarqube
#修改内核参数(否则后面容器启动会报错)
vim /etc/sysctl.conf
{
# 增加以下配置
vm.max_map_count=262144
fs.file-max=65536
}
# 使配置生效
sysctl -p
#创建文件目录
mkdir -p /mnts/sonarqube/{
extensions,logs,data}
#拉取镜像
docker pull sonarqube:8.9.8-community
#启动容器
docker run -d --name sonarqube -p 9000:9000 \
--link postgres --restart always --privileged=true \
-v /mnt/sonarqube/extensions:/opt/sonarqube/extensions \
-v /mnt/sonarqube/logs:/opt/sonarqube/logs \
-v /mnt/sonarqube/data:/opt/sonarqube/data \
-e SONARQUBE_JDBC_URL=jdbc:postgresql://postgres:5432/sonar \
-e SONARQUBE_JDBC_USERNAME=sonar \
-e SONARQUBE_JDBC_PASSWORD=sonar \
sonarqube:8.9.8-community
参数说明:
–link 这个参数是postgresql数据库的容器名,后面的数据库地址需要采用该容器名进行连接
–restart always 容器跟随docker的启动而启动
–privileged=true 以特权方式启动容器,解决报错问题(Permission denied)
5.3 访问Sonarqube管理页面:http://192.168.0.132:9000
(默认账号:admin,密码:admin)
修改密码:sonar@123
5.4 Sonar安装中文插件
方式一:Administration->Marketplace->搜索chinese pack,进行相应版本的安装(如无法安装,则选择方式二),如下图
方式二:下载地址:https://github.com/xuhuisheng/sonar-l10n-zh/tags ,找到自己版本对应的中文包,将 jar 包放入 /mnt/sonarqube/extensions/plugins ,重启 sonarqube
六、SonarQube整合Gitlab
实现目标:代码通过gitlab提交后,sonarqube就会分析该代码质量
6.1 Sonar新建测试项目
1.登录sonarqube,新建项目
2.设置token
6.2 注册测试项目的gitlab-runner
# 进入容器
docker exec -it gitlab-runner /bin/bash
# 注册runner
gitlab-runner register
# gitlab地址
【Enter the GitLab instance URL (for example, https://gitlab.com/):】
http://192.168.0.132:6001/
# token
【Enter the registration token:】
GR1348941Q2F_Ya9BrF2V2tupxGet
# 输入runner描述
【Enter a description for the runner:】
test_sonar_runner
# gitlab-runner标签名称tag
【Enter tags for the runner (comma-separated):】
sonar
#gitlab-runner可选维护说明
【Enter optional maintenance note for the runner】
test_sonar
# 选择执行gitlab-runner的执行程序。
【Enter an executor: custom, docker-ssh, parallels, kubernetes, docker, shell, ssh, virtualbox, docker+machine, docker-ssh+machine:】
shell
# 如果选择docker作为执行程序,那要定义一个默认镜像的名称
【Enter the default Docker image (for example, ruby:2.6):】
test_sonar:latest
6.3 在测试项目下修改.gitlab-ci.yml文件
variables:
SONAR_PROJECT_KEY: "test-sonar"
SONAR_TOKEN: "b3575bc5f76697cad49ac33ead1ff076e3d79985"
SONAR_HOST_URL: "http://192.168.0.132:9000"
stages:
- test
sonar_preview:
stage: test
script:
- mvn --batch-mode verify sonar:sonar -Dsonar.projectKey=$SONAR_PROJECT_KEY -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_TOKEN
only:
- master
tags:
- sonar
6.4 提交测试代码
代码提交到gitlab后,gitlab流水线会进行操作,成功后,sonarqube上就有该项目了
七、SonarQube整合Idea
1.登录sonarqube,新建项目
2.设置token
3.选择maven
4.使用上面选择maven时复制的命令,提交检测到sonarqube服务器上
在idea的Terminal控制台操作有时会出现一些莫名其妙的异常,此时我们可以通过cmd的方式执行mvn命令
cmd方式
5.sonar管理后台查看报告