什么是 Drone
Drone 是一个现代化的继续集成和继续交付平台,使繁忙的团队可能主动构建、测试和公布工作流。应用 Drone 的团队公布软件的频率更高,bug 更少。1
人话:Drone 是一个轻量级的 jenkins,能够简略的实现软件的流水线化测试、编译、部署。并且能够和 gitlab github gogs gitea 轻松的联合到一起。
前提
本文对读者作出以下假如:
- 具备较为丰盛的 git 应用教训
- 能够纯熟的操作某种 git 服务平台,如 gogs、github、gitlab …. 本文以 gogs 为例
- 具备肯定的 linux 和 docker 的常识储备和操作教训
- 或者也会应用 docker-compose
- 或者懂一点 k8s
环境配置:
- 本文应用 Gogs 为例
- drone 为以后最新版:1.8.x
本文波及到的工程文件:https://github.com/alex-techs/drone-tutorial
本文链接:https://println.org/url/ODQ=
原理
个人观点,仅供参考
参加角色
角色 | 性能 |
---|---|
用户 | Gogs |
Drone Server | Drone 主服务,提供 Web 界面 |
Drone Runner | 我了解为实现各种操作的适配器,例如 ssh、docker、k8s 操作 |
Drone Agent | 操作宿主机 Docker API 的代理程序 |
Docker Server | 宿主机的 Doker 程序 |
装置
整个 Drone 体系都是基于 docker 运行的,所以无需装置,拉下几个镜像即可。当然也能够等运行的时候主动解决。
这里只是列出这些镜像和阐明其作用
- 主服务
docker pull drone/drone
- docker 操作代理
docker pull drone/agent
- ssh runner
以 ssh runner 为例
docker pull drone/drone-runner-ssh
配置
没什么配置,只是几个 docker 的启动参数而已。
server
参数 | 作用 | ||
---|---|---|---|
DRONE_GOGS_SERVER | 要连贯的 GOGS 服务器地址 | ||
DRONE_GIT_ALWAYS_AUTH | 在克隆公共 repo 时仍然进行身份认证 | ||
DRONE_RPC_SECRET | DRONE 主服务对外接口的密钥,调用所有接口均须要提供 | ||
DRONE_SERVER_HOST | DRONE 主服务启动时监听的地址,相似 server_name 的概念 | ||
DRONE_SERVER_PROTO | DRONE 主服务启动时的协定,http \ | \ | https,非必须 |
DRONE_DEBUG | 默认 false,是否输入 debug 日志,非必须 | ||
DRONE_PROVIDER | 服务提供者,申明是 gogs,非必须 | ||
DRONE_DATABASE_DATASOURCE | 申明主服务应用的数据源,非必须 | ||
DRONE_DATABASE_DRIVER | 申明主服务应用的数据库驱动,非必须 | ||
DRONE_GOGS_SKIP_VERIFY | 是否强制应用 TLS 与 gogs 建设链接,默认 false,非必须 |
agent
参数 | 作用 | ||
---|---|---|---|
DRONE_RPC_SERVER | 即 DRONE_SERVER_HOST | ||
DRONE_RPC_SECRET | 即 DRONE_RPC_SECRET | ||
DRONE_DEBUG | 默认 false,是否输入 debug 日志,非必须 | ||
DOCKER_HOST | 宿主机 docker 的 json api 默认监听的地址 | ||
DRONE_RPC_PROTO | DRONE 主服务启动时的协定,http \ | \ | https |
ssh-runner
参数 | 作用 |
---|---|
DRONE_RPC_PROTO | 即 DRONE_SERVER_PROTO |
DRONE_RPC_HOST | 即 DRONE_SERVER_HOST |
DRONE_RPC_SECRET | 即 DRONE_RPC_SECRET |
其它参数大全:https://docs.drone.io/server/reference/
如何使 docker 监听 tcp 2375 端口
DOCKER_HOST 须要这个值
编辑宿主机的 /usr/lib/systemd/system/docker.service 文件
找到:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
批改为:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock
从新加载 service 缓存
systemctl daemon-reload
重启 docker
systemctl restart docker
启动
环境变量
export GOGS_URL="http://1.1.2.3:2048"
export DRONE_HOST="0.0.0.0"
export DRONE_SECRET="xh1HJLO2yfandlwjeHdsL3Kklwheour89"
export DOCKER_HOST="tcp://`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}'bridge`:2375"
server
docker run -d \
--volume=/var/lib/drone:/data \
--env=DRONE_GOGS_SERVER=${GOGS_URL} \
--env=DRONE_RPC_SECRET=${DRONE_SECRET} \
--env=DRONE_SERVER_HOST=${DRONE_HOST} \
--env=DRONE_SERVER_PROTO=http \
--publish=3005:80 \
--restart=always \
--name=drone \
drone/drone
agent
docker run -d \
--env=DOCKER_HOST=${DOCKER_HOST} \
--env=DRONE_RPC_SERVER=http://drone-server \
--env=DRONE_RPC_SECRET=${DRONE_SECRET} \
--restart=always \
--name=drone-agent \
--link drone:drone-server \
drone/agent
ssh-runner
docker run -d \
-e DRONE_RPC_HOST=drone-server \
-e DRONE_RPC_SECRET=${DRONE_SECRET} \
--restart always \
--name runner \
--link drone:drone-server \
drone/drone-runner-ssh
应用 Web 界面治理构建
如果你正确的启动了上述的几个镜像,那么你关上浏览器,输出 IP:3005 能够进入到 DRONE 主服务的 web 治理界面的登陆界面,账号密码为 DRONE_GOGS_SERVER
设置的 Gogs 服务器的账号密码。
留神:防火墙肯定要凋谢 3005 端口,否则是无法访问到 Drone 的
主界面:
当你的 Gogs 退出了新的我的项目,能够应用 SYNC 按钮同步到 Drone 中来
为新工程开启构建
坑
Save 之后将会主动生成 Gogs WebHook,然而它生成的地址未经转换,间接是 DRONE_HOST 拼接了 /hook,那就会产生一些问题
- 咱们配置地址为 0.0.0.0 是为了公网可拜访,那它生成这样的地址要上哪里发回调。咱们要手动改成浏览器中能够拜访的那个地址,例如:
http://xxx.org:3005/hook
。无论你配置的什么地址,都应该亲自来 Gogs 中看一看,是否是可拜访的地址
- 如果咱们配置的 DRONE_HOST 是 127.0.0.1/ 那么它将会生成这样的地址,临时先不关注端口的话,就只有多了个 / 的问题。按常理来讲多一个 / 不会影响申请成果,然而 Drone 会受影响,要手动去掉 /,批改为正确地址才能够。例如:
http://xxx.org:3005/hook
。 - 配置实现后你须要点铅笔符号,拉到最上面,有一个 Test Delivery,点击上来察看是否能够胜利推送。
如果是这样,那就要从新查看你的 Webhook 域名配置了。
如果是绿色,阐明你的配置正确。并且 Drone 将会启动第一次构建,然而因为咱们没有 .drone.yml 文件,所以构建肯定是失败的
我的项目详情界面
书写 .drone.yml 配置文件
Hello World
在你的我的项目根目录,新建 .drone.yml 并写入以下内容
kind: pipeline
name: default
steps:
- name: Hello World
image: centos
commands:
- echo Hello World
Key | 含意 |
---|---|
kind | 默认为 pipeline |
type | 这里没有用到,标记本次构建应用的 runner 类型,默认是 docker 即默认应用 Docker Runner |
name | 因为 drone 反对同时书写多个构建工作,所以须要为本工作起个名字 |
steps | 数组构造,流水线化的构建步骤 |
steps.images | 本步骤运行在哪个 docker 镜像中,该镜像必须存在于 docker hub 中 |
steps.commands | 构建过程中,将会顺次执行的命令,如果命令退出码非 0,将会终止构建本次构建 |
提供 JSON 版本来辅助了解数据结构。当然也能够间接应用 json,因为 json 是非法的 yml 格局
{
"kind": "pipeline",
"name": "default",
"steps": [
{
"name": "Hello World",
"image": "centos",
"commands": ["echo Hello World"]
}
]
}
Drone 配置文件除 yml 和 json 之外,还能够应用 jsonnet,官网示例:https://docs.drone.io/pipeline/scripting/jsonnet/
一次大胆的尝试
cat >.drone.yml<<EOF
kind: pipeline
name: default
steps:
- name: Hello World
image: centos
commands:
- echo Hello World
EOF
git add .drone.yml
git commit -am "first commit"
git push origin master
Gogs
Drone
注:如果你的构建始终处于期待开始状态,也就是齿轮转圈不胜利也不失败。你就要检查一下 agent 容器是否正确的启动和 drone 主服务是否能正确的链接到 agent 容器中了。一般来说是主服务没有链接上,始终在期待 agent。
对于机密
为新工程开启构建
一节曾经稍微解释过机密的作用。本节次要形容如何应用机密
新建机密
为什么咱们要定义一个叫做 log-path 的值,而不是 password 等真的机密。一会儿你就晓得了
增加实现
在 .drone.yml 中应用机密
批改 Hello World 时建设的 .drone.yml,应用 from_secret 来取出机密的值
cat >.drone.yml<<EOF
kind: pipeline
name: default
steps:
- name: Hello World
image: centos
environment:
VARPATH: /var
LOGPATH:
from_secret: log-path
commands:
- echo $${VARPATH}
- echo $${LOGPATH}
- ls $${LOGPATH}
EOF
git add .drone.yml
git commit -am "first commit"
git push origin master
咱们退出了 environment 组,该组的作用是在运行的容器内事后设置一些环境变量。并且建设了几个环境变量。
重点: VARPATH 是间接明文,LOGPATH 则是应用了 from_secret 并输出了咱们方才在 web 界面上新建的机密的 key。
所以能够简略的了解 from_secret 是为了从机密读取某个 key,from_secret 除了 environment 之外,也能够利用于任意的字段中。
注:个别的 shell 命令应用一个 $ 来获取变量,而 commands 应用 $$ 是因为 yml 会解析 $,并且替换为 yml 变量值,应用两个 $$ 本义则能够放弃原文。
验证
注:因为无奈看到原文,所以应用 password 举例的话并不能验证是否正确。应用一个目录来 ls 则能够判断是否真的读取到了机密的值
Runner
管道可帮忙您主动执行软件交付过程中的步骤,例如启动代码生成、运行自动测试以及部署到暂存环境或生产环境。管道执行由源代码存储库触发。代码更改会触发运行相应管道的 Drone 的 Webhook。其余常见触发器包含主动打算或用户启动的工作流。通过将文件放在 git 存储库的根目录来配置管道。yaml 语法设计为易于浏览和表白,以便查看存储库的任何人都能够了解工作流。
本例应用方才启动的 ssh runner,其它 runner 的应用可参考官网示例 https://docs.drone.io/pipeline/overview/
npm init
npm install helloworld
cat >.drone.yml<<EOF
kind: pipeline
type: ssh
name: default
server:
host: xxxx.org
user: root
password:
from_secret: password
# ssh_key:
# from_secret: ssh_key
steps:
- name: list
commands:
- ls /var
- name: npm
environment:
PATH: "$$PATH:/opt/node-v14.3.0-linux-x64/bin/"
commands:
- pwd
- node --version
- npm version
- npm install
EOF
git add .
git commit -am "first commit"
git push origin master
注:
- 这里的 password 咱们应用的就是从机密中获取到的
- 也能够应用 ssh_key 来链接,然而咱们启动 ssh runner 时并未映射 key 文件,所以应用明码进行演示。
- npm init 是为了让我的项目转换成 npm 我的项目,以演示 npm 等命令,并非必须
- PATH 设置这个值是我的 node 装置目录,为了让 commands 中的 npm 能够正确执行。你能够换成你本人的 node 装置门路
- 这次配置了多个 step,drone 也将会在 ssh 链接到的主机中顺次执行这些命令。
执行后果
执行正确,构建实现。
复合构建工作
咱们在 Hello World 中提到过,是能够书写多个构建工作的。原理是利用 yml 能够应用 --- …
拼接多个文件的个性,简略的能够了解为 .drone.yml 能够是多个 .drone.yml 拼起来的。
示例:将咱们的 Hello World 和 ssh runner 工作拼起来,同时执行。
---
kind: pipeline
name: Hello World
steps:
- name: Hello World
image: centos
environment:
VARPATH: /var
LOGPATH:
from_secret: log-path
commands:
- echo $${VARPATH}
- echo $${LOGPATH}
- ls $${LOGPATH}
---
kind: pipeline
type: ssh
name: Ssh-Runner
server:
host: xxxxx.org
user: root
password:
from_secret: password
steps:
- name: list
commands:
- ls /var
- name: npm
environment:
PATH: "$$PATH:/opt/node-v14.3.0-linux-x64/bin/"
commands:
- pwd
- node --version
- npm version
- npm install
...
每一对 ---
两头,就是一个构建工作。...
示意完结,可省略。
成果
应用 docker-compose 编排容器
本文不对 docker-compose 进行解说,可返回官网学习。
这份文件的作用与启动一节的 ssh 命令成果统一。其中的 DOCKER_HOST 须要依据理论的值来进行替换
cat >docker-compose.yml<<EOF
version: '3'
services:
drone-server:
image: drone/drone
ports:
- 3005:80
volumes:
- /var/lib/drone:/data
environment:
- DRONE_GOGS_SERVER=http://1.1.2.3:2048
- DRONE_RPC_SECRET=xh1HJLO2yfandlwjeHdsL3Kklwheour89
- DRONE_SERVER_HOST=0.0.0.0
- DRONE_SERVER_PROTO=http
drone-agent:
image: drone/agent
depends_on:
- drone-server
environment:
- DRONE_RPC_SERVER=http://drone-server
- DRONE_RPC_SECRET=xh1HJLO2yfandlwjeHdsL3Kklwheour89
- DOCKER_HOST=tcp://172.17.0.1:2375
links:
- drone-server
drone-ssh:
image: drone/drone-runner-ssh
depends_on:
- drone-server
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_SECRET=xh1HJLO2yfandlwjeHdsL3Kklwheour89
ports:
- 3000:3000
links:
- drone-server
EOF
docker-compose up -d
插件
Drone 还有相当丰盛的插件能够应用,示例:https://docs.drone.io/plugins/overview/
并不像其它的软件一样提供插件开发的 api,drone 插件的原理就是运行 docker 镜像。在容器启动时主动加载 step 中写入的环境变量或命令。你能够齐全将插件能够将它当作一种 step。
原理简略,不再赘述。
咱们最终的代码构造
.
├── .git
│ └── ...
├── node_modules
│ └── helloworld
│ └── ...
├── .drone.yml
├── package-lock.json
└── package.json
总结
咱们曾经学会了 drone 的装置、配置、根本应用,也晓得了如何应用 drone 进行主动构建和排查呈现的问题,学到了“机密”的应用办法,还学会了一个 ssh runner 和执行多个构建工作。
那么当初咱们就能够实现在代码更新后主动操作近程主机,更新、测试、编译、部署,实现根本的继续集成。
然而Drone 的能力,远不止于此。