在玩过GitLab + Jenkins后,最近准备来学习Drone CI/CD,看这个云原生的CI Server能给我们带来什么惊喜。
drone.xdevops.cn
增加一条域名解析的A记录,将drone.xdevops.cn
解析到服务器的公网IP。
使用阿里云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
参见:
docker pull drone/drone:1
登录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 Server和Drone Runner的RPC通信用的secret:
openssl rand -hex 16
创建一个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。
在/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,验证是否可以正常访问。
因为GitHub OAuth需要HTTPS,因此还需要为Drone站点配置HTTPS。
如果已经安装了certbot并且之前已经为Nginx的其它站点配置过HTTPS,只需要运行下面的命令来为Drone站点配置HTTPS:
sudo certbot --nginx -d drone.xdevops.cn
再验证站点的HTTPS证书:
再在浏览器中打开https://drone.xdevops.cn来验证是否可以正常访问,以及浏览器是否正常识别HTTPS证书。
参见:
在浏览器中打开https://drone.xdevops.cn;
首次打开,需要登录GitHub账号来同意授权Drone访问你的GitHub;
采用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.yml
,并push到GitHub。
kind: pipeline
type: docker
name: default
steps:
- name: greeting
image: alpine
commands:
- echo Hello, Drone!
- echo Happy Sunday!
在Drone中查看是否会自动触发构建,并查看构建结果和日志。
修改项目根目录下的.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的性能和高可用。
TODO
TODO
TODO
DRONE_USER_CREATE
参数配置)登录Drone;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
TODO
将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不支持手工触发构建,只能自动触发构建(发生变更时,代码库通过Webhook通知Drone)。
但是可以在Drone中重跑(Restart)已有的构建。
参见:
问题:在Drone中激活项目失败
原因:浏览器F12调试时,发现HTTP 500错误,并且Remote Address为127.0.0.1:10808。
解决方法:
--env=DRONE_SERVER_HOST=drone.xdevops.cn \
--env=DRONE_SERVER_PROTO=https \
确保已经在代码库中编写了.drone.yml
(注意不是.drone.yaml
);
确保已经安装和运行了Drone Runner;
打开GitHub上的项目,打开Settings / Webhooks,检查是否有Webhook触发失败的记录,并手工更正Webhook的配置错误;
Drone不支持手工触发,如果修改配置后,需要再次push代码才能触发构建。
DRONE_USER_CREATE
参数,并指定了正确的Drone系统管理员账号:--env=DRONE_USER_CREATE=username:{{DRONE_ADMIN}},machine:false,admin:true \
如果Drone连接GitHub,则{{DRONE_ADMIN}}
为GitHub账号。
参见: