GitLab+Drone使用体验

前言

当公司的项目越来越多、开发人员也在不断补充的情况下,已然不是单枪匹马,一人作战的时代了。为了便利开发人员开发迭代和项目代码管理,包括版本迭代,代码审计等需求。接入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 Dashboard
  • Drone builds
    Drone builds
  • Drone build
    Drone build
  • Gitlab pipelines
    Gitlab pipelines
  • Sonarqube
    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的超级管理员账号,然后设置允许内网地址访问(默认是不允许的)。 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次构建限制。官方说明
免费的开源版本需要自行构建,开源版企业版具体差异见。官方说明
参考苏洋博客,我构建了一个开源版本镜像,本地启动暂无问题,欢迎大家共同交流。

转载请注明原文地址:https://blog.keepchen.com/a/the-gitlab-drone-experience.html