文章目录
- 在CentOS7上安装Drone搭建CI持续集成环境
- 前言
- 安装前规划
- 安装过程
- 配置域名解析
- 安装Docker
- 拉取Drone Server镜像
- 添加GitHub OAuth Application
- 生成Drone RPC secret
- 启动Drone Server
- 配置Nginx反向代理到Drone Server
- 为Drone站点配置HTTPS
- 测试Drone Server
- 安装和运行Drone Runner
- 激活项目
- 测试Drone Pipeline
- 测试Drone Pipeline for Java
- 在生产上安装Drone
- 使用Docker Compose来安装Drone
- 使用PostgresSQL替换默认内置的sqllite
- 让Drone运行在集群中,可以支持多个Job同时构建
- 让Drone构建时使用Maven local repo加快构建
- 集成消息通知插件
- Drone特色功能
- Drone限制
- Troubleshooting
- Active repository validation failure
- 代码变更后,没有自动触发Drone构建
- untrusted repositories cannot mount host volumes
- 参考文档
在CentOS7上安装Drone搭建CI持续集成环境
前言
在玩过GitLab + Jenkins后,最近准备来学习Drone CI/CD,看这个云原生的CI Server能给我们带来什么惊喜。
安装前规划
- 测试服务器:CentOS7 64位,有互联网访问权限,有root权限;
- 代码仓库:考虑到已经非常熟悉GitLab和测试服务器资源有限,这次直接采用GitHub;
- CI Server:本次的主角 Drone CI/CD,采用最简单的Docker安装方式;
- 域名:在我个人网站上规划一个二级域名
drone.xdevops.cn
- HTTPS:因为要使用GitHub OAuth,必须使用HTTPS;
- Nginx:使用Nginx来做二级域名的反向代理;
- Pipeline:使用最简单的Drone Docker Pipeline;
- 测试项目:使用我GitHub上的一个Java示例项目,主要测试Spring Boot的REST API功能;
安装过程
配置域名解析
增加一条域名解析的A记录,将drone.xdevops.cn
解析到服务器的公网IP。
安装Docker
使用阿里云Docker Yum源在线安装Docker:
#!/usr/bin/env bash
# remove docker
sudo yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum install -y docker-ce docker-ce-cli containerd.io
# Step 4: 开启Docker服务
sudo systemctl enable docker
sudo systemctl start docker
参见:
拉取Drone Server镜像
docker pull drone/drone:1
添加GitHub OAuth Application
-
登录GitHub;
-
打开用户设置(Settings),打开Developer settings / OAuth Apps;
-
新建一个OAuth App,输入相关信息,比如:
# Application name xdevops-drone # Homepage URL https://drone.xdevops.cn # Authorization callback URL https://drone.xdevops.cn/login
-
复制Client ID和Client Secret,后面启动Drone Server时需要用到。
生成Drone RPC secret
生成Drone Server和Drone Runner的RPC通信用的secret:
openssl rand -hex 16
启动Drone Server
创建一个start_drone_github_server.sh
脚本用来启动Drone Server for GitHub:
#!/usr/bin/env bash
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_GITHUB_CLIENT_ID={{DRONE_GITHUB_CLIENT_ID}} \
--env=DRONE_GITHUB_CLIENT_SECRET={{DRONE_GITHUB_CLIENT_SECRET}} \
--env=DRONE_RPC_SECRET={{DRONE_RPC_SECRET}} \
--env=DRONE_SERVER_HOST=drone.xdevops.cn \
--env=DRONE_SERVER_PROTO=https \
--env=DRONE_USER_CREATE=username:{{DRONE_ADMIN}},machine:false,admin:true \
--publish=9080:80 \
--publish=9443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:1
说明:
{{DRONE_GITHUB_CLIENT_ID}}
和{{DRONE_GITHUB_CLIENT_SECRET}}
为GitHub OAuth App的Client ID和Client Secret;{{DRONE_RPC_SECRET}}
为上面生成的Drone RPC secret;DRONE_SERVER_HOST
为Drone Server的域名或IP,这里使用域名,注意域名前面不要写http://
或https://
;{{DRONE_ADMIN}}
为Drone系统管理员的账号,在这个例子中为GitHub账号;--publish=9080:80
和--publish=9443:443
将容器内的80和443端口映射为服务器的9080和9443端口。
运行bash start_drone_github_server.sh
来启动Drone Server。
配置Nginx反向代理到Drone Server
在/etc/nginx/conf.d
下创建drone.xdevops.cn.conf
配置文件:
upstream drone_server {
server 127.0.0.1:9080;
}
server {
listen 80;
listen [::]:80;
server_name drone.xdevops.cn;
location / {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_pass http://drone_server;
proxy_redirect off;
proxy_http_version 1.1;
proxy_buffering off;
chunked_transfer_encoding off;
}
}
重新加载Nginx配置:
nginx -t
nginx -s reload
在浏览器中访问http://drone.xdevops.cn,验证是否可以正常访问。
为Drone站点配置HTTPS
因为GitHub OAuth需要HTTPS,因此还需要为Drone站点配置HTTPS。
如果已经安装了certbot并且之前已经为Nginx的其它站点配置过HTTPS,只需要运行下面的命令来为Drone站点配置HTTPS:
sudo certbot --nginx -d drone.xdevops.cn
再验证站点的HTTPS证书:
再在浏览器中打开https://drone.xdevops.cn来验证是否可以正常访问,以及浏览器是否正常识别HTTPS证书。
参见:
测试Drone Server
-
在浏览器中打开https://drone.xdevops.cn;
-
首次打开,需要登录GitHub账号来同意授权Drone访问你的GitHub;
安装和运行Drone Runner
采用Docker方式来运行Drone Runner。
拉取Drone Runner的Docker镜像:
docker pull drone/drone-runner-docker:1
创建start_drone_docker_runner.sh
脚本来运行Drone Runner:
#!/usr/bin/env bash
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=https \
-e DRONE_RPC_HOST=drone.xdevops.cn \
-e DRONE_RPC_SECRET={{DRONE_RPC_SECRET}} \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=runner1 \
-p 3000:3000 \
--restart always \
--name drone-runner \
drone/drone-runner-docker:1
说明:
{{DRONE_RPC_SECRET}}
为上面生成的Drone RPC secret;DRONE_SERVER_HOST
为Drone Server的域名或IP,这里使用域名,注意域名前面不要写http://
或https://
;
运行bash start_drone_docker_runner.sh
来启动Drone Runner。
激活项目
- 在Drone中激活需要构建的GitHub项目;
- 在Drone中,打开项目的Settings,设置Project visibility为Private。
测试Drone Pipeline
在项目的根目录下创建.drone.yml
,并push到GitHub。
kind: pipeline
type: docker
name: default
steps:
- name: greeting
image: alpine
commands:
- echo Hello, Drone!
- echo Happy Sunday!
在Drone中查看是否会自动触发构建,并查看构建结果和日志。
测试Drone Pipeline for Java
修改项目根目录下的.drone.yml
,并push到GitHub。
kind: pipeline
type: docker
name: ci-java8
steps:
- name: build
image: maven:3-jdk-8
commands:
- mvn install -s settings.xml -B -U
在Drone中查看是否会自动触发构建,并查看构建结果和日志。
测试项目的根目录有一个settings.xml,用来指向阿里云Maven repo来拉取Maven依赖。
在生产上安装Drone
和上面的安装过程相似,但是需要考虑Drone的性能和高可用。
使用Docker Compose来安装Drone
TODO
使用PostgresSQL替换默认内置的sqllite
TODO
让Drone运行在集群中,可以支持多个Job同时构建
TODO
让Drone构建时使用Maven local repo加快构建
- 使用Drone系统管理员账号(参见Drone Server中的
DRONE_USER_CREATE
参数配置)登录Drone; - 打开Repository的Settings,在Project Settings中勾选“Trusted” (没有看到Trusted选项,说明Drone Server中没有配置正确的
DRONE_USER_CREATE
参数和指定正确的Drone系统管理员账号); - 在
.drone.yml
中定义服务器上的持久卷目录(比如/mnt/data/maven_local_repo
),将容器内的Maven local repo (默认为/root/.m2
) 挂载到服务器上的该目录,示例:
kind: pipeline
type: docker
name: ci-java8
volumes:
- name: maven_local_repo
host:
path: /mnt/data/maven_local_repo
steps:
- name: build
image: maven:3-jdk-8
volumes:
- name: maven_local_repo
path: /root/.m2
commands:
- mvn install -s settings.xml -B -U
集成消息通知插件
Drone通过插件可以在流水线中集成消息通知,比如邮件通知、钉钉通知、微信通知和企业微信通知,另外也可以支持Slack通知和RocketChat通知。
参见:
用Mailgun方式在Drone pipeline中集成SMTP邮件通知
Drone特色功能
在代码库中显示构建状态
将Drone提供的一段Markdown代码段放在项目的README.md中,就可以在代码库中显示代码构建状态:
[![Build Status](https://drone.xdevops.cn/api/badges/cookcodeblog/gs-rest-service-maven/status.svg)](https://drone.xdevops.cn/cookcodeblog/gs-rest-service-maven)
方便地支持多分支构建
与Jenkins相比,Drone可以更方便地支持多分支构建,只要将.drone.yml
文件放在该分支下,对该分支的改动会自动触发使用该分支下的.drone.yml
来构建。
Drone限制
不能手工触发构建,只能自动触发构建
Drone不支持手工触发构建,只能自动触发构建(发生变更时,代码库通过Webhook通知Drone)。
但是可以在Drone中重跑(Restart)已有的构建。
参见:
Troubleshooting
Active repository validation failure
问题:在Drone中激活项目失败
原因:浏览器F12调试时,发现HTTP 500错误,并且Remote Address为127.0.0.1:10808。
解决方法:
- 修改Drone Server的启动参数,指定正确的DRONE_SERVER_HOST和DRONE_SERVER_PROTO,比如:
--env=DRONE_SERVER_HOST=drone.xdevops.cn \
--env=DRONE_SERVER_PROTO=https \
- 重启Drone Server。
代码变更后,没有自动触发Drone构建
-
确保已经在代码库中编写了
.drone.yml
(注意不是.drone.yaml
); -
确保已经安装和运行了Drone Runner;
-
打开GitHub上的项目,打开Settings / Webhooks,检查是否有Webhook触发失败的记录,并手工更正Webhook的配置错误;
-
Drone不支持手工触发,如果修改配置后,需要再次push代码才能触发构建。
untrusted repositories cannot mount host volumes
- 确保Drone的Repository Settings的Project settings中已经勾选了“Trusted”;
- 如果没有看到“Trusted”选项,检查Drone Server的启动配置参数中有没有配置了正确的
DRONE_USER_CREATE
参数,并指定了正确的Drone系统管理员账号:
--env=DRONE_USER_CREATE=username:{{DRONE_ADMIN}},machine:false,admin:true \
如果Drone连接GitHub,则{{DRONE_ADMIN}}
为GitHub账号。
参见: