1、安装docker、docker-compose
docker简介:
Docker 是一个开源的应用容器引擎,它允许开发者将应用程序及其依赖打包到一个可移植的容器中
docker-compose简介:
docker-compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许用户通过一个 YAML 文件配置应用程序的服务、网络和卷,然后使用简单的命令启动或管理整个应用程序。
安装如下:
sudo apt install docker
sudo apt install docker-compose
# 更新镜像源
vi /etc/docker/daemon.json
# 将如下内容添加进去
{
"registry-mirrors": [
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://your_preferred_mirror",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://hub.geekery.cn",
"https://hub.littlediary.cn",
"https://docker.rainbond.cc",
"https://docker.unsee.tech",
"https://docker.m.daocloud.io",
"https://hub.crdz.gq",
"https://docker.nastool.de",
"https://hub.firefly.store",
"https://registry.dockermirror.com",
"https://docker.1panelproxy.com",
"https://hub.rat.dev",
"https://docker.udayun.com",
"https://docker.kejilion.pro",
"https://dhub.kubesre.xyz",
"https://ov6czrb4.mirror.aliyuncs.com",
"https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io",
"https://docker.unsee.tech",
"https://docker.1panel.live",
"http://mirrors.ustc.edu.cn",
"https://docker.chenby.cn",
"http://mirror.azure.cn",
"https://dockerpull.org",
"https://hub.rat.dev"
]
}
# 重启docker
service docker restart
# 查看docker镜像源是否更新成功
docker info
2、安装代码扫描工具sonarqube + 数据库Postgres
SonarQube 是一个开源的代码质量管理平台,主要用于通过静态代码分析检测代码中的漏洞、错误、代码异味、重复代码等问题,并提供详细的代码质量报告。它支持多种编程语言(如 Java、Python、JavaScript 等),并可以与持续集成工具(如 Jenkins)和代码版本控制系统(如 Git)集成。
SonarQube 需要一个数据库来存储代码分析结果、配置信息以及项目质量快照。PostgreSQL 是一种支持多种数据类型和高级功能的关系型数据库,被广泛用于 SonarQube 的后端存储
使用docker拉取sonarqube + postgres + gitlab +gitlab-runner镜像
# 拉取sonnarqube社区版镜像
docker pull sonarqube:9.9.8-community
# 拉取postgres镜像,未指定版本则默认拉最新的
docker pull postgres
# 拉gitlab社区版、gitlab-runner最新版本
docker pull gitlab/gitlab-ce:latest
docker pull gitlab/gitlab-runner:latest
找到一个目录下,如/home/docker/,新增docker-compose.yml,内容填写如下:
services:
db:
image: postgres
container_name: db
ports:
- "5432:5432"
networks:
- sonarnet
environment:
POSTGRES_USER: sonar
POSTGRES_PASSWORD: sonar
POSTGRES_DB: sonarqube
sonarqube:
image: sonarqube:9.9.8-community
container_name: sonarqube
depends_on:
- db
ports:
- "9000:9000"
networks:
- sonarnet
environment:
SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonarqube?currentSchema=sonarqube
SONAR_JDBC_USERNAME: sonar
SONAR_JDBC_PASSWORD: sonar
volumes:
- /home/docker/volume/sonarqube9.9.8/conf:/opt/sonarqube/conf
- /home/docker/volume/sonarqube9.9.8/data:/opt/sonarqube/data
- /home/docker/volume/sonarqube9.9.8/logs:/opt/sonarqube/logs
- /home/docker/volume/sonarqube9.9.8/extensions:/opt/sonarqube/extensions
networks:
sonarnet:
driver: bridge
参考上述文件中的挂载到宿主机的地址,需要宿主机本地新建几个目录,具体如下
[root@localhost]# ls -al /home/docker/volume/
总用量 0
drwxrwxrwx. 3 root root 28 2月 25 18:56 .
drwxr-xr-x. 5 root root 55 1月 17 16:54 ..
drwxrwxrwx. 6 root root 60 2月 25 18:53 sonarqube9.9.8
[root@localhost]# ls -al /home/docker/volume/sonarqube9.9.8
总用量 4
drwxrwxrwx. 6 root root 60 2月 25 18:53 .
drwxrwxrwx. 3 root root 28 2月 25 18:56 ..
drwxrwxrwx. 2 root root 30 2月 25 20:22 conf
drwxrwxrwx. 4 root root 46 2月 12 16:57 data
drwxrwxrwx. 5 root root 57 2月 12 16:59 extensions
drwxrwxrwx. 2 root root 4096 2月 27 13:55 logs
// 开放所有权限 用于容器可以对本机文件进行修改
chmod -R 777 /home/docker/volume/
进入docker-compose.yml所在的目录,启动镜像
[root@localhost]# docker-compose up -d
# 查看镜像是否启动成功
[root@localhost]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0d467e6b5ab5 sonarqube:9.9.8-community "/opt/sonarqube/dock…" 2 days ago Up 2 days 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp sonarqube
0c6ceeadc24c postgres "docker-entrypoint.s…" 2 days ago Up 2 days 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp db
使用navicat 连接数据库,用户名密码为docker-compose.yml中设置的sonar/sonar
连接成功后新增sonarqube数据库,在数据库中新增模式sonarqube
停止sonarqube + postgres镜像
docker stop *** # ***更换成docker ps查询到的镜像id
修改 sonar.properties 与数据库连接的相关信息
cd /home/docker/volume/sonarqube9.9.8/conf
vi sonar.properties
# 改动点如下
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.jdbc.url=jdbc:postgresql://db:5432/sonarqube?currentSchema=sonarqube
如图:
宿主机运行如下命令设置
// 设置官方推荐的值
sysctl -w vm.max_map_count=524288
sysctl -w fs.file-max=131072
ulimit -n 131072
ulimit -u 8192
重新启动容器
docker-compose up -d
3、安装gitlab + gitlab-runner
编辑gitlab的 docker-compose.yml文件,volumes项标明要挂载出来的目录,在当前docker-compose.yml文件所在的目录下新建config、logs、data文件夹
version: '3.1'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
container_name: gitlab
restart: always
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.1.144:8929'
gitlab_rails['gitlab_shell_ssh_port'] = 2224
ports:
- '8929:8929'
- '2224:2224'
volumes:
- './config:/etc/gitlab'
- './logs:/var/log/gitlab'
- './data:/var/opt/gitlab'
编辑gitlab-runner的 docker-compose.yml文件,volumes项标明要挂载出来的目录,在当前docker-compose.yml文件所在的目录下新建config文件夹
services:
gitlab-runner:
image: 'gitlab/gitlab-runner:latest'
restart: unless-stopped
container_name: 'gitlab-runner'
privileged: true
volumes:
- ./config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
启动gitlab + gitlab-runner,登录gitlab(地址:http://192.168.1.144:8929/)用户名为root,密码需要从文件中获取,如下
docker exec d445b68aec61 cat /etc/gitlab/initial_root_password |grep Password
登录sonarqube,地址(http://192.168.1.123:9000/projects),初始账户名密码:admin/admin
4、 gitlab-runner集成sonar-scanner
方法一:
Sonar-scanner 是用于将代码扫描和sonarQube进行交互
sonar-scanner下载:
# 进入gitlab-runner镜像,给镜像安装sonar-scanner
docker exec -it (gitlab-runner的容器id) bash
# 下载sonar-scanner文件
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip
# 更新包列表 因为容器没有 unzip
apt-get update
apt update
# 安装 unzip
apt-get -y install unzip
apt -y install unzip
# 安装 vim
apt-get -y install vim
apt -y install vim
# 解压
unzip sonar-scanner-cli-5.0.1.3006-linux.zip
# 修改 sonar-scanner.properties 配置文件
vim /home/sonar-scanner-5.0.1.3006-linux/conf/sonar-scanner.properties
# 修改点如下,地址为sonar地址:
sonar.host.url=http://192.168.1.***:9000
#配置环境变量。编辑全局配置文件
#在文件末尾追加内容:
#sonar-scanner
echo 'export PATH=$PATH:/home/sonar-scanner-5.0.1.3006-linux/bin' >> /etc/profile
echo 'export PATH=$PATH:/home/sonar-scanner-5.0.1.3006-linux/bin' >> /root/.bashrc
# 使配置生效
source /root/.bashrc
source /etc/profile
# 查看是否配置成功。
sonar-scanner -v
打开gitlab,注册一个新的runner,并获取新的token值,可以在admin area -- CI/CD -- Runner -- New instrance runner,输入tags、details、Maximum job timeout,即可新增成功
在gitlab-runner安装的宿主机上直接执行命令
// 开始注册 无需进入容器 宿主机执行
docker exec gitlab-runner-scan gitlab-runner register \
--non-interactive \
--url "http://192.168.1.144:8929" \ #此处地址更新为具体地址
--registration-token "*********" \ #此处更新为之前注册完获取的token
--executor "shell" \
--description "java description" \
--tag-list "java-scan" \
--run-untagged="false" \
--locked="false" \
--access-level="not_protected"
执行结果大概如下:
注:gitlab-runner注册可进行如下一步一步操作
方法二:
在一个目录下新建Dockerfile,内容如下
FROM gitlab/gitlab-runner:v16.6.1
ENV SONAR_NAME 192.168.1.144
ENV SONAR_SCANNER_ZIP sonar-scanner-cli-5.0.1.3006-linux
ENV SONAR_SCANNER_FILE sonar-scanner-5.0.1.3006-linux
WORKDIR /home
RUN sed -i 's/htt[p|ps]:\/\/archive.ubuntu.com\/ubuntu\//mirror:\/\/mirrors.ubuntu.com\/mirrors.txt/g' /etc/apt/sources.list
RUN wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/$SONAR_SCANNER_ZIP.zip \
&& apt-get update \
&& apt update \
&& apt-get install -y locales \
&& locale-gen "en_US.UTF-8" \
&& update-locale LC_ALL="en_US.UTF-8" \
&& export LANG="en_US.UTF-8" \
&& apt-get -y install unzip \
&& apt -y install unzip \
&& unzip $SONAR_SCANNER_ZIP.zip && echo "export PATH=\$PATH:/home/$SONAR_SCANNER_FILE/bin" >> /etc/profile \
&& echo "export PATH=\$PATH:/home/$SONAR_SCANNER_FILE/bin" >> /root/.bashrc \
&& . /etc/profile \
&& . /root/.bashrc \
&& sed -i "s/#sonar.host.url=http:\/\/localhost:9000/sonar.host.url=http:\/\/$SONAR_NAME:9000/g" /home/$SONAR_SCANNER_FILE/conf/sonar-scanner.properties \
&& rm -f /home/$SONAR_SCANNER_ZIP.zip
// 在 DockerFile 的目录下执行命令构建镜像
docker build -t gitlab-runner-sonar-scanner:v1.0.0 .
镜像执行成功后,使用如下命令启动这个新的镜像
docker run -d --name gitlab-runner-scan -v /home/docker/volume/gitlab-runner/config-scan:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock --privileged=true gitlab-runner-sonar-scanner:v1.0.0
或者使用docker-compose.yml文件启动镜像
# 新增docker-compose.yml
vi docker-compose.yml
# 内容如下
services:
gitlab-runner:
image: 'gitlab-runner-sonar-scanner:v1.0.0'
restart: unless-stopped
container_name: 'gitlab-runner-scan'
privileged: true
volumes:
- ./config-scan:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
注册runner方式与方法一中一致 ,此处不在赘述
5、打通sonarqube与gitlab
5.1、创建gitlab的访问令牌。
点击用户图像 -- Edit profile -- Access tokens,注册结束后获取token
5.2、sonarqube上新增配置
配置 名称 / 路径 / token . 其中需要注意的是 路径写地址即可,token输入上一步创建的gitlab token即可
5.3、在sonarqube上拉取gitlab的项目,选择gitlab后输入5.1步骤新增的token即可
更新key项目 Key 是 SonarQube 中用于唯一标识项目的标识符。
6、.gitlab-ci.yml 文件创建扫描
stages:
#阶段,配置需要执行的阶段 可以配置多个
- sonarqube_scan
sonarqube-check:
#阶段,取自开始的stages
stage: sonarqube_scan
# sonar-scanner 相当于直接在容器中执行 sonar-scanner 命令
script:
- sonar-scanner -Dsonar.projectName=$CI_PROJECT_NAME -Dsonar.projectKey=$CI_PROJECT_NAME -Dsonar.sourceEncoding=UTF-8 -Dsonar.projectVersion=1.0 -Dsonar.language=java -Dsonar.sources=src -Dsonar.java.binaries=. -Dsonar.login=sqp_58007566cef6780a36aa2f489cd4fb5d85338b66 -Dsonar.qualitygate.wait=true
allow_failure: false
#标签 找 runner
tags:
- sonar
# 只允许 master 分支触发 并且只有合并到 master 时才会触发
only:
- master
- merge_requests