惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
D
Docker
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
美团技术团队
量子位
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
腾讯CDC
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
小众软件
小众软件
博客园 - 司徒正美
罗磊的独立博客
云风的 BLOG
云风的 BLOG
B
Blog RSS Feed
博客园 - 聂微东

希仁之拥

领克900半年使用体验 | 希仁之拥的博客 Ubuntu 26.04 Desktop使用体验 | 希仁之拥的博客 【转载】谈谈不受欢迎的博客技术特征 | 希仁之拥的博客 【转载】ClaudeCode 你想知道的所有秘密,源码深度研究报告 | 希仁之拥的博客 2025年年终总结 | 希仁之拥的博客 集成和使用Openclaw后的思考 | 希仁之拥的博客 我买了领克900 | 希仁之拥的博客 服务器性能优化之io拷贝 | 希仁之拥的博客 Go-Sail导航站上线啦 | 希仁之拥的博客 今年国庆的一些感受 [2025] | 希仁之拥的博客 在Deepin 25上配置forticlient | 希仁之拥的博客 分享一些酷酷的站点 [20250908] | 希仁之拥的博客 Go-Sail发布v3.0.6版本了 | 希仁之拥的博客 我对V2EX发布$V2EX讨论的一些感受 | 希仁之拥的博客 如何让Stripe支持支付宝和微信支付 | 希仁之拥的博客 2025上半年里程碑 | 希仁之拥的博客 四姑娘山之旅 | 希仁之拥的博客 近来帮同事做性能优化的过程回顾 | 希仁之拥的博客 聊聊接口的返回数据结构 | 希仁之拥的博客 由GORM的Updates语法糖 我把 Go-Sail 的文档站更新了 | 希仁之拥的博客 这就是我为什么讨厌拼多多 | 希仁之拥的博客 元旦快乐~ | 希仁之拥的博客 致敬还在写博客的我们 | 希仁之拥的博客 逐步的把图片资源迁移到星光图床上 | 希仁之拥的博客 帮弟弟配了一台mini主机 | 希仁之拥的博客 国庆的一些碎碎念 | 希仁之拥的博客 就这一刻而言,我觉得科技冷冰冰的。 | 希仁之拥的博客 如何使用acme.sh自动续签证书 | 希仁之拥的博客 Go-Sail的文档站点搭建好了 | 希仁之拥的博客
GitLab+Drone使用体验 | 希仁之拥的博客
希仁之拥 · 2025-05-29 · via 希仁之拥

前言

当公司的项目越来越多、开发人员也在不断补充的情况下,已然不是单枪匹马,一人作战的时代了。为了便利开发人员开发迭代和项目代码管理,包括版本迭代,代码审计等需求。接入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页面而非跳转到登录页面。官方论坛相关讨论

截图

配置

  • 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的超级管理员账号,然后设置允许内网地址访问(默认是不允许的)。 iShot_2023-02-10_18.09.19.png
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 SettingsTrusted选项。
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次构建限制。官方说明
免费的开源版本需要自行构建,开源版企业版具体差异见。官方说明
参考苏洋博客,我构建了一个开源版本镜像,本地启动暂无问题,欢迎大家共同交流。


980_120.png(via stardots.io)

觉得博主写的不错?给他一个赞赏:

keepchen的赞赏码-支付宝 keepchen的赞赏码-微信