前言
当公司的项目越来越多、开发人员也在不断补充的情况下,已然不是单枪匹马,一人作战的时代了。为了便利开发人员开发迭代和项目代码管理,包括版本迭代,代码审计等需求。接入CI(Continuous Integration,持续集成)就变得十分的迫切和必要了。
组合
Gitlab
+ Drone
+ Sonarqube
环境
1.内网测试服务器(宿主主机) windows 10
2.CI虚拟机 CentOS 8,使用vmware workstation安装
3.Gitlab虚拟机 CentOS 8,使用vmware workstation安装
4.CI软件:
4.1.Drone Server
,Drone runner
,Sonarqube
,Postgresql
使用docker容器运行
结论
先总结一下使用体验:
优点:
1.整个搭建方式十分轻量便捷
2.扩展性强
3.稳定性高
4.构建指令由.drone.yml
配置文件指定,简单易用
不足:
1.Drone不支持Gitlab子分组,若在子分组下创建项目,Drone后台无法同步项目。官方论坛相关讨论
2.Drone在登录过期(失效)后,会显示404页面而非跳转到登录页面。官方论坛相关讨论
截图
- Drone Dashboard
- Drone builds
- Drone build
- Gitlab pipelines
- Sonarqube
配置
- Gitlab
由于搭建CI的时候,Gitlab私有化部署已经完成,这里不再赘述。 - Drone
使用yaml文件书写配置,Drone支持多种数据库,这里使用的是Mysql
。
version: "3.1"
services:
drone-server:
container_name: drone-server
image: "drone/drone:latest"
environment:
- DRONE_GITLAB_SERVER=http://192.168.224.25:8888
- DRONE_GITLAB_CLIENT_ID= # 你的gitlab应用id,需要在gitlab平台新建application
- DRONE_GITLAB_CLIENT_SECRET= # gitlab应用密钥
- DRONE_RPC_SECRET= # 远程调用密钥,是drone server与drone runner通信的密钥凭证,可以随机生成,只要保持一致就行
- DRONE_SERVER_HOST=192.168.224.36:9080 # 注意:一定不要协议
- DRONE_SERVER_PROTO=http
- DRONE_LOGS_DEBUG=true
- DRONE_LOGS_TEXT=true
- DRONE_LOGS_PRETTY=true
- DRONE_LOGS_COLOR=false
- DRONE_DATABASE_DRIVER=mysql
- DRONE_DATABASE_DATASOURCE= # 数据连接dsn,如:username:password@tcp(127.0.0.1:3306)/drone?parseTime=true
- DRONE_USER_CREATE= # 这里非常关键,需要配置管理员账号,最好是与面创建application的是同一个账号。如:username:keepchen,admin:true,token:xxx token值同rpc token
ports:
- 9080:80
- 9443:443
restart: always
volumes:
- ./data:/data
drone-runner:
container_name: drone-runner
image: "drone/drone-runner-docker:latest"
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=192.168.224.36:9080
- DRONE_RPC_SECRET= # 远程调用密钥
- DRONE_RUNNER_CAPACITY=5
- DRONE_RUNNER_NAME=192.168.224.36
ports:
- 9030:3000
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock # 这里请务必这样配置,因为具体的build会用到。
- Sonarqube (使用
Postgresql
)
version: "3.1"
services:
postgres:
container_name: postgres
image: postgres:12
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=sonar
- POSTGRES_DB=sonar
volumes:
- ./data/postgres:/var/lib/postgresql/data
ports:
- "54320:5432"
sonarqube:
container_name: sonarqube
image: sonarqube:community
depends_on:
- postgres
environment:
- SONAR_JDBC_URL=jdbc:postgresql://postgres:5432/sonar
- SONAR_JDBC_USERNAME=sonar
- SONAR_JDBC_PASSWORD=sonar
volumes:
- ./data/sonarqube_data:/opt/sonarqube/data
- ./data/sonarqube_extensions:/opt/sonarqube/extensions
- ./data/sonarqube_logs:/opt/sonarqube/logs
ports:
- "9090:9000"
restart: always
可能遇到的问题
1.redirect_url not valid
出现这个问题,可能是因为:
1.1.Drone server的配置项DRONE_SERVER_HOST
不正确,一定要注意,不能携带协议。
1.2.需要登录Gitlab的超级管理员账号,然后设置允许内网地址访问(默认是不允许的)。
1.3.配置的Drone回调地址不正确,正确地址:http://192.168.224.36:9080/login
,将协议、ip地址、端口替换成自己的。
2.snoarqube无法授权
出现这个问题,可能是因为:
2.1.回调地址配置不正确,正确地址:http://192.168.224.36:9090/oauth2/callback/gitlab
,将协议、ip地址、端口替换成自己的。
3.Drone后台找不到用户设置入口
出现这个问题,首先,确认当前登录账号是否是管理员,其次,DRONE_USER_CREATE
这一项配置的用户名需要和Gitlab的登录名保持一致。
4.Drone runner无法设置host映射
需要在对应项目的设置中勾选Project Settings
的Trusted
选项。
4.1.Project Settings
根本就没有这个选项
解决办法同3。
来一发?
在项目中,配置.drone.yml
文件。
kind: pipeline
type: docker
name: projectName
trigger:
event:
- push
- merge
steps:
- name: 编译和打包
image: maven:3-jdk-8
volumes:
- name: cache
path: /tmp/cache
- name: maven-cache # <- 将本地缓存路径映射到容器
path: /root/.m2
commands:
- mvn clean
- mvn package -s /tmp/cache/settings.xml
- cp target/projectName.jar /tmp/cache/projectName
- name: 代码分析
image: maven:3-jdk-8
volumes:
- name: cache
path: /tmp/cache
- name: maven-cache
path: /root/.m2
environment:
sonar_host:
from_secret: sonar_host
sonar_token:
from_secret: sonar_token
commands:
- |
mvn --batch-mode verify sonar:sonar \
-Dsonar.projectKey= #你的projectKey \
-Dsonar.host.url=$$sonar_host \
-Dsonar.login=$$sonar_token
- name: 钉钉通知
image: guoxudongdocker/drone-dingtalk
settings:
token:
from_secret: dingtalk_token
type: markdown
message_color: true
message_pic: true
sha_link: true
when:
status: [ failure, success ]
volumes:
- name: cache
host:
path: /artifcats/artifcats
- name: maven-cache # <- 定义本地maven缓存仓库路径
host:
path: /artifcats/maven-repo
上面的配置告诉Drone runner需要干三件事情:编译打包、代码分析和钉钉消息通知。
Drone支持使用配置密钥,这样在整个配置文件中,看不到任何敏感信息。上面的关键字from_secret
就是从配置密钥中读取,这个在Drone后台项目下的settings
中配置。
钉钉通知效果:
进阶
1.maven使用本地仓库及本地缓存
刚开始的时候,去docker hub上找了许多相关的镜像,后面才发现,官方maven镜像就非常好用了,只需要将本地的缓存路径映射到容器中即可。
2.打包制成品导出
和上面一样的原理,只需要将本地路径映射到容器中,当打包完成,使用cp
命令直接拷贝即可。
总结
目前公司已经使用一个月,整体体验比较好,轻量快捷是第一印象。build的step可以根据自己的需要,随意DIY,如果没有合适的镜像,也可以自己制作满足定制化需求的镜像。
----------------------2021.07.25更新----------------------
据官网所描述,使用镜像构建的Drone服务是企业版本,有5000次构建限制。官方说明
免费的开源版本需要自行构建,开源版和企业版具体差异见。官方说明
参考苏洋博客,我构建了一个开源版本镜像,本地启动暂无问题,欢迎大家共同交流。