最近将一直在用的Drone CI从0.8升级到了最新的1.6.x,Drone官方目前似乎没有提供从0.8迁移到1.x的方法,我是全新安装运行了一个Drone服务,所以本篇没有说明如何从旧版本迁移,只是记录全新安装Drone1.x的说明。
使用场景
CI/CD针对不同使用场景有不同的配置方案,按照我自身的需求,是一个极为简单的流程:
推送代码到gitea
→ gitea触发webhook
→ Drone通过ssh到指定服务器上执行一些操作
目的就是实现提交代码后,drone可以自动帮我把代码在指定的服务器上实现一些部署操作。
其实这样简单的需求应该是看官方文档就可以了,但是Drone的官方文档有些基本内容实在是说的不明白,很多简单而关键的点,文档中都没提,我都是通过额外搜索才找到。
基本配置/运行
Drone是基于docker运行的,我这边将Drone server和Runner运行在同一台机器上,通过Docker compose配置运行环境:
version: '3'
services:
drone-server:
image: drone/drone:1
ports:
- 8000:80
volumes:
- ./data:/data
restart: always
environment:
- DRONE_AGENTS_ENABLED=true
- DRONE_GITEA_SERVER=${DRONE_GITEA_SERVER}
- DRONE_GITEA_CLIENT_ID=${DRONE_GITEA_CLIENT_ID}
- DRONE_GITEA_CLIENT_SECRET=${DRONE_GITEA_CLIENT_SECRET}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
- DRONE_SERVER_HOST=${DRONE_SERVER_HOST}
- DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO}
- DRONE_USER_CREATE=${DRONE_SERVER_ADMIN_USER}
drone-runner-ssh-primary:
image: drone/drone-runner-ssh:linux-amd64
restart: always
ports:
- 3000:3000
environment:
- DRONE_RPC_PROTO=${DRONE_SERVER_PROTO}
- DRONE_RPC_HOST=${DRONE_SERVER_HOST}
- DRONE_RPC_SECRET=${DRONE_RPC_SECRET}
我们团队代码管理用的是gitea,所以Drone server配置的是gitea provider,前面提到我主要利用Drone通过ssh自动到指定服务器上执行一些操作,所以我配置了一个SSH Runner。
到这里一切顺利,配置项都可以在对应的文档中找到,我只是将文档中的docker运行参数和环境变量配置转成docker-compose
文件,具体说明文档中都有,docker-compose up
就能启动服务了,配置都没问题的话浏览器打开就会去gitea进行oauth登录,然后就可以回到Drone页面上看到仓库列表了。
配置执行ssh部署的Pipline
要吐槽的是,drone官方的文档连最基本的默认配置文件名是什么该放在哪里都没有写,那对于第一次接触的人,又怎样会知道Pipeline的配置代码要写哪里?
虽然drone的web界面里激活仓库后可以看到配置文件的设定,那作为基础文档,也应该说明下默认的配置文件是放在仓库根目录里的 .drone.yml
文件。
接下来就是在 .drone.yml
中写入如下Pipline配置。
---
kind: pipeline
type: ssh
name: deploy_uat
server:
host: my-server.com
user: deploy
ssh_key:
from_secret: deploy_key
clone:
disable: true
steps:
- name: deploy
commands:
- cd /path/to/my/project
- git pull origin master
trigger:
branch:
- master
按照我之前提到的需求场景,我用到的是 SSH pipelines,只要在push代码后让drone自动ssh到某个服务器上执行一些操作,都不需要drone每次都把仓库在服务器上克隆一遍,所以禁用了克隆以节约执行时间。 具体在目标服务器上的操作可以写在每个 steps
中的 commands
里面。
server
节点的配置说明
其他的配置都比较好理解,参考官方文档就行。
server
节点告诉drone去哪个服务器进行操作,host
和user
当然就是服务器的地址和登录用户名。接着通过指定ssh_key
,drone就能顺利登录目标服务器了。
那么这个ssh key是从哪里拿到的呢?我这边用的是drone的Secrets,预先把ssh key存入Secrets,然后在这里指定用哪个条目作为ssh key (from_secret: deploy_key
)。
1. 将 ssh key 存入Secrets
通过drone的命令行工具,可以将数据按群组存到drone的数据库中:
drone orgsecret add [organization] [name] [data]
按照文档的说明,上面这条命令可以将一行简单的数据存入Secrets,但是ssh key是一大坨文本,命令要怎么写?
文档又没说,查了半天,在drone官方论坛上,也有人问,drone开发者的回复终于让我找到方式
将ssh key文件存到本地,然后将数据以 @文件路径
的方式传入:
drone orgsecret add [organization] [name] @path/to/file
2. Secrets群组与仓库群组对应
刚才提到将Secrets基于群组的方式存储, 比如
drone orgsecret add devteam deploy_key @path/to/file
将名为deploy_key的数据存到devteam这个群组,要用这个数据的时候,仓库所属的群组也要是devteam。
仓库所属的群组在provider中,也就是gitea的群组,那么我们的仓库地址就类似
。[email protected]:devteam/myproject.git
关于这个群组对应关系,虽说能自己想明白,但是我觉得官方文档还是应该提一下的比较好。
这样弄好就差不多了,登录到drone的web界面,找到仓库后激活,之后每次push代码,drone就会自动到服务器上做相应的操作了。
Leave a Reply