drone+gitee轻量级CI/CD自动构建平台

文章目录

一、drone简介

drone是一个golang编写的轻量级持续集成平台,它是原生Docker,所有的进程都在容器内进行。这使得Drone非常适合像Kubernetes这样的平台,因为在Kubernetes上启动容器很简单。

如果你觉得jenkins太复杂可以尝试以下使用drone替代,drone所有构建步骤都是以docker镜像提供的插件完成的,官方和社区都提供了很多高质量的插件(类似钉钉消息、微信消息、aws支持等),如果业务太复杂也可以自行开发插件或使用一个基础镜像通过脚本完成构建。

使用过程中如发现bug可以到社区寻求帮助

官方及社区收录的插件库

drone github仓库

drone社区

二、drone+gitee

drone从v2.7.2版本开始支持gitee

官方文档

1. 创建oauth2应用

右上角头像->设置->第三方应用->创建应用

配置如下图,应用主页填你准备部署drone的服务器域名或ip,应用回调地址在drone访问链接后跟/login,权限至少选择projectspull_requestsnoteshook

drone+gitee轻量级CI/CD自动构建平台

2. 生成rpc密钥

drone server和drone runner通信的密钥,可以使用openssl生成,这个密钥后面部署drone serverdrone runner都需要使用

$ openssl rand -hex 16
bea26a2221fd8090ea38720fc445eca6

3. 部署drone

直接使用docker-compose部署,按配置说明修改对应配置

简单的docker-compose.yml

version: '3'

services:

  server:
    image: drone/drone
    ports:
    - 80:80
    - 443:443
    volumes:
    - /opt/drone/data:/data:rw
    networks:
    - drone
    restart: always
    environment:
	# 你的服务器域名或ip
    - DRONE_SERVER_HOST=your.company.com
    # 使用的协议http或者https
    - DRONE_SERVER_PROTO=http
    # runner通信密钥,后面runner也要配置相同的值
    - DRONE_RPC_SECRET=d7daxxxxxxxxxxxx1a8b
    # gitee第三方应用client id
    - DRONE_GITEE_CLIENT_ID=dba7xxxxxxxxxxxx4eb9
    # gitee第三方应用client secret
    - DRONE_GITEE_CLIENT_SECRET=ea5exxxxxxxxxxxx748d
    # 默认创建账户,设置你的gitee用户名,这样你登录后是作为管理员
    - DRONE_USER_CREATE=username:your_gitee_username,admin:true

  runner:
    image: drone/drone-runner-docker
    restart: always
    ports:
    - 3000:3000
    networks:
    - drone
    depends_on:
    - server
    volumes:
    # 挂载宿主机的docker sock,runner实际还是使用的宿主机的docker daemon
    - /var/run/docker.sock:/var/run/docker.sock:rw
    environment:
    # 与drone server通信的协议http/https
    - DRONE_RPC_PROTO=http
    # drone server服务器
    - DRONE_RPC_HOST=your.company.com
    # drone server rpc密钥
    - DRONE_RPC_SECRET=d7daxxxxxxxxxxxx1a8b
    # runner name,标识runner
    - DRONE_RUNNER_NAME=runner
    # runner最多同时执行任务数
    - DRONE_RUNNER_CAPACITY=2
    # runner使用协议http/https
    - DRONE_HTTP_PROTO=http
    # runner的host,server向runner主动推送任务时使用此配置,如果在不同服务器此处应该设置为runner的域名或ip,此处是同一服务器,所以使用docker service name是可以直接访问的
    - DRONE_HTTP_HOST=runner

networks:
  drone:

更为详细的docker-compose.yml

version: '3'

services:

  server:
    image: drone/drone
    ports:
    - 80:80
    - 443:443
    volumes:
    - /opt/drone/data:/data:rw
    networks:
    - drone
    restart: always
    environment:
	# 你的服务器域名或ip
    - DRONE_SERVER_HOST=your.company.com
    # 使用的协议http或者https
    - DRONE_SERVER_PROTO=https
    # 使用https时你的ssl证书路径
    - DRONE_TLS_CERT=/data/your.company.com.pem
    # 使用https时你的ssl证书密钥路径
    - DRONE_TLS_KEY=/data/your.company.com.key
    # runner通信密钥,后面runner也要配置相同的值
    - DRONE_RPC_SECRET=d7daxxxxxxxxxxxx1a8b
    # gitee第三方应用client id
    - DRONE_GITEE_CLIENT_ID=dba7xxxxxxxxxxxx4eb9
    # gitee第三方应用client secret
    - DRONE_GITEE_CLIENT_SECRET=ea5exxxxxxxxxxxx748d
    # 默认创建账户,设置你的gitee用户名,这样你登录后是作为管理员
    - DRONE_USER_CREATE=username:your_gitee_username,admin:true
    # drone各日志功能
    - DRONE_LOGS_DEBUG=true
    - DRONE_LOGS_TRACE=true
    - DRONE_LOGS_COLOR=true
    - DRONE_LOGS_PRETTY=true
    - DRONE_LOGS_TEXT=true

  runner:
    image: drone/drone-runner-docker
    restart: always
    ports:
    - 3000:3000
    networks:
    - drone
    depends_on:
    - server
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock:rw
    environment:
    # 与drone server通信的协议http/https
    - DRONE_RPC_PROTO=https
    # drone server服务器
    - DRONE_RPC_HOST=your.company.com
    # drone server rpc密钥
    - DRONE_RPC_SECRET=d7daxxxxxxxxxxxx1a8b
    # runner name,标识runner
    - DRONE_RUNNER_NAME=runner
    # runner最多同时执行任务数
    - DRONE_RUNNER_CAPACITY=2
    # runner使用协议http/https
    - DRONE_HTTP_PROTO=http
    # runner的host,server向runner主动推送任务时使用此配置,如果在不同服务器此处应该设置为runner的域名或ip,此处是同一服务器,所以使用docker service name是可以直接访问的
    - DRONE_HTTP_HOST=runner
    # 是否开启runner ui
    - DRONE_UI_DISABLE=true
    # 访问runner ui时的登录用户名
    - DRONE_UI_USERNAME=runner_admin_username
    # 访问runner ui时的登录密码
    - DRONE_UI_PASSWORD=runner_admin_password

networks:
  drone:

三、gitee插件

由于gitee没有提供类似github/gitlab那样status的api,所以在pr中调整到CI平台基本只能靠评论。可以使用这个插件kit101z/drone-plugin-gitee-pulls实现在pr中更新build任务状态及快速访问的链接。

github status效果图:

drone+gitee轻量级CI/CD自动构建平台

kit101z/drone-plugin-gitee-pulls仓库文档也提供了示例,以下为效果图:

drone+gitee轻量级CI/CD自动构建平台

镜像链接:https://hub.docker.com/r/kit101z/drone-plugin-gitee-pulls

源码仓库:https://github.com/kit101/drone-plugin-gitee-pulls

这个插件有个问题就是开始时会在clone步骤之后执行,clone时间比较长的时候,pr中的评论会延迟很久。
后续计划利用drone的webhook实现。

上一篇:Linux CentOs平台安装MongoDB、数据备份还原


下一篇:Python 文件writelines() 方法和处理双层列表