一、前言
Drone 是一套基于容器构建的CI工具,部署配置起来非常方便。
它的官网在这https://www.drone.io/
二、安装部署
话不多说,首先就是需要安装它,官方提供一套基于容器的单机部署方式。
你需要自行安装dokcer 与 docker-compose
安装完 docker-compose 后,将以下内容复制到 docker-compose.yml 中
docker-compose.yml 内容如下
(注:带 ${xxx} 形式的环境变量你不需要替换它,因为他会读取 .env 文件中的内容,而.env 文件的内容下文就有,最简单的方法就是你可以直接复制过来)
version: '3.7'
services:
drone-server:
image: drone/drone:1.6.2
ports:
- 80:80
- 443:443 # 这个端口我暂时没用到,下次如果我配置 https 就会用到了
restart: always
volumes:
- /var/lib/drone:/data
environment:
DRONE_AGENTS_ENABLED: "true"
DRONE_GITHUB_SERVER: https://github.com
DRONE_GITHUB_CLIENT_ID: ${DRONE_GITHUB_CLIENT_ID}
DRONE_GITHUB_CLIENT_SECRET: ${DRONE_GITHUB_CLIENT_SECRET}
DRONE_RPC_SECRET: ${DRONE_RPC_SECRET}
DRONE_SERVER_HOST: ${SERVER_HOST}
DRONE_SERVER_PROTO: http
DRONE_USER_CREATE: username:xhyonline,admin:true # 设置用户名,是github的用户名.....但是你要区分账号,这就很离谱
drone-runner:
image: drone/drone-runner-docker:1
ports:
- 3000:3000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
DRONE_RPC_PROTO: http
DRONE_RPC_HOST: ${SERVER_HOST}
DRONE_RPC_SECRET: ${DRONE_RPC_SECRET}
DRONE_RUNNER_CAPACITY: 3
介绍其中的几个参数:
- drone配置项说明
DRONE_GITHUB_CLIENT_ID: 在Github中创建OAuth Application时生成的Client IDDRONE_GITHUB_CLIENT_SECRET: 在Github中创建OAuth Application时生成的Client SecretDRONE_SERVER_PROTO: Drone提供服务的prototype,可选为http或httpsDRONE_SERVER_HOST: Drone的server地址,设置为127.0.0.1作为本地地址,也可以设置为外部可访问的域名或IP地址DRONE_TLS_AUTOCERT: 设置是否自动开启安全传输层协议,若设置为true,那么drone server proto会设置为使用https,DRONE_SERVER_PROTO设置为http也是无效DRONE_RUNNER_CAPACITY: drone提供服务的最大并行度DRONE_SECRET_SECRET: 可自由设置- Drone用到的端口号有:80和443
紧接着你还需要设置GitHub OAuth Application
登陆你的github账户,在右上角点击个人头像,选择Setting,选择Developer settings,选择OAuth Application,选择新建一个application,如下图:

- HomePage是DroneCI的访问地址,若是Drone由本地部署,那就可以设置为
http://127.0.0.1(当然我是部署在服务器上,这里就填写了 http://服务器的IP) - Authorization callback URL是DoneCI的登陆地址,格式必须是
{{HomePage}}/login,如http://127.0.0.1/login(同理如果你部署在服务器上请记得修改) - 创建成功以后,拿到
Client ID和Client Secret
最后在 docker-compose.yml 的同级目录下创建 .env 文件,并且填入以下内容
#!/bin/bash
export SERVER_HOST=CI机器的IP,例如:39.96.14.232,你也可以填写域名
export DRONE_RPC_SECRET="请自行生成秘钥对,你可以用命令openssl rand -hex 16 生成,然后黏贴在这里"
export DRONE_GITHUB_CLIENT_ID="你在Github上的ClientID"
export DRONE_GITHUB_CLIENT_SECRET="你在Github上的secret"
启动它
docker-compose up
docker-compose up -d # 后台启动
启动后你就可以通过访问 CI 机器的 IP 就能访问到了。
刚开始,浏览器会重定向到github登陆认证页面(如下图所示)

使用github账户登陆之后,浏览器被重定向回drone,并被授权访问你的github仓库

- 选中你要配置的仓库,点击
ACTIVATE按钮,进入SETTINGS卡片,点击ACTIVATE按钮开启这个仓库.开启之后可以设置CI任务的基本配置。用过jenkins的人会发现,这个页面显然简洁一点。 此时,github仓库中会添加一条webhook地址,当github仓库发生改变时会通过webhook通知drone server。 不过,问题是这个webhook地址是DRONE_SERVER_HOST,如果配置为127.0.0.1或外网不可达时,这个webhook地址github是访问不到的。不过这不影响Cron Job的触发。 - 配置里面有四个主要选项
- Main: 主要配置
Project settings:设置是否开启仓库保护,若开启,那么每次触发CI自动编译都需要仓库管理员手动确认Project visibilty:设置仓库可见性,因为你设置的host地址所有人都可以访问到,并通过自己的github账户登陆,可见性可以保护你的仓库Configuration:设置CI任务的yaml配置文件,这里面制定了CI的所有流程,一般放在仓库根目录下,名为.drone.yaml,稍后会详细说明

Secrets: 如Drone Secret文档中所说,不方便明文存储到代码仓库里的密码值,可以通过Repository Secrets,Encrypted Secrets和External Secrets来存储 这里的Secrets设置可以指定Repository Secrets,在Secret Name中指定密码名称,Secret Value中设置该值。Allow Pull Requests是指,当是pull_request请求时这个密钥是否可被使用,因为其他人可能会通过pull request来触发CI,造成安全隐患。

在.drone.yaml中可以通过from_secret引用,如下面的username和password
kind: pipeline
name: default
steps:
- name: build
image: alpine
environment:
USERNAME:
from_secret: username
PASSWORD:
from_secret: password
- steps指定CI执行的步骤,默认pipline或创建一个叫做
clone的步骤,它是从git仓库克隆代码大步骤 - 多个step之间可以通过
depends_on来指定执行顺序,比如先clone,后build,然后deploy - 同一个
pipline下的多steps之间默认是串行的,实现方式应该是下面的stepdepends_on紧邻的上一个step - 多
pipline之间是并行的,同一个yaml文件里使用---分割多个pipline的定义 - triggers是指在什么情况下才会执行ICI任务,比如只对
master分支的pull request和push事件触发 - 在每一个
step中,可以通过Conditions来指定在CI过程中是否执行该step,通过when关键字指定。trriger是指定pipline何时被执行,condition指定pipline中的step是否被执行,如:
最后:
以下是完整的 Golang 在项目中定义 .drone.yml 文件,当你 push 到github 上时,就会触发构建,失败时会发送通知的 webhook
kind: pipeline
type: docker
name: srv-usercenter # 改改就能用 全局替换 srv-usercenter
steps:
# 编译阶段
- name: build
image: golang:1.16-alpine
volumes: # 将编译时将所需的依赖映射出来,避免下次构建时重新下载,当然如果你不需要,也可以把 volumes 删掉,大不了每次重新下载。请注意!!:挂载时需要在drone后台将 Trusted 勾上,具体路径请看下文的图片
- name: cache-go-deps
path: /go # 容器内的路径
commands:
- go version
- go env -w GOPROXY=https://goproxy.cn,direct
- go build -o app main.go
# 压缩编译后的二进制文件
- name: upx
image: cnbattle/drone-upx
settings:
save_file: app_upx
original_file: app
level: 9
# 将编译产物 rsync 到宿主机
- name: rsync
image: drillster/drone-rsync # 文档自行查看 drone 这个插件
settings:
hosts:
from_secret: host # host 就是在drone中设置的 secret 选项,具体看下面的图片
user:
from_secret: user
key:
from_secret: key # 请使用 ssh-keygen -t rsa 生成秘钥对,然后将公钥拷贝到要操纵的目标器的/root/.ssh/authorized_keys里,再把私钥黏贴到 drone 后台的secret里
source: ./app_upx
target: /build/srv-usercenter # 我们提前需要在目标机器上创建 build目录
delete: true
script:
- tree /build
- /build/srv-usercenter # 你可以在目标机器上执行重启命令来完成CI
when:
status:
- success
# 将容器内挂载出来,和构建阶段的 volumes 承接
volumes:
- name: cache-go-deps
host:
path: /var/local/drone-cache/repo/go-cache # 宿主机的路径
trigger:
branch:
- master
event:
- push
---
## 以下是构建完成后发送通知的事件
kind: pipeline
type: docker
name: notify
clone:
disable: true
steps:
- name: send
image: plugins/webhook
settings:
username:
from_secret: username
password:
from_secret: password
method: POST
urls: http://url/webhook # 请将 url 自行修改成你自己的
content_type: application/json
template: |
{
"owner": "{{ repo.owner }}",
"repo": "{{ repo.name }}",
"status": "{{ build.status }}",
}
trigger:
status:
- success
- failure
depends_on: [srv-usercenter]

文章评论(0)