一、前言
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 ID
DRONE_GITHUB_CLIENT_SECRET
: 在Github中创建OAuth Application
时生成的Client Secret
DRONE_SERVER_PROTO
: Drone提供服务的prototype,可选为http
或https
DRONE_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)