Drone CI 1.x 基本安装配置

最近将一直在用的Drone CI从0.8升级到了最新的1.6.x,Drone官方目前似乎没有提供从0.8迁移到1.x的方法,我是全新安装运行了一个Drone服务,所以本篇没有说明如何从旧版本迁移,只是记录全新安装Drone1.x的说明。

使用场景

CI/CD针对不同使用场景有不同的配置方案,按照我自身的需求,是一个极为简单的流程:

推送代码到giteagitea触发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去哪个服务器进行操作,hostuser当然就是服务器的地址和登录用户名。接着通过指定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

Your email address will not be published. Required fields are marked *