Drone CI/CD部署笔记

前言

之前用Gitea部署了自己的 代码网站,不过它的网络环境有点复杂(造成了后面某些问题)。Gitea装在家里一个笔记本上,通过家里主服务器的FRP服务给公布到公网。

一. 部署Drone

部署的时候按照Drone的官方文档配置了Gitea的OAUTH、RPC_SECRET等设置,执行环境则用了podman。drone也单独给其分配了二级域名:ci.lintian.co,与gitea一样通过Nginx反向代理来为其套上HTTPS。

podman run \
  --volume=/home/tianliang/drone:/data \
  --env=DRONE_GITEA_SERVER=https://code.lintian.co \
  --env=DRONE_GITEA_CLIENT_ID=xxxx \
  --env=DRONE_GITEA_CLIENT_SECRET=xxxxxxxxxxxxxxxxx \
  --env=DRONE_RPC_SECRET=xxxxxxxxx \
  --env=DRONE_SERVER_HOST=ci.lintian.co \
  --env=DRONE_SERVER_PROTO=https \
  --publish=8080:80 \
  --detach=true \
  --name=drone \
  drone/drone:2
  • 踩坑点1:与Gitea在同一内网时也需要通过公网连接
    在自己家里的内网中,内网中的服务器都设置了基于局域网地址的DNS解析(Gieta的地址会被解析成192.168.2.253),同时也将Drone部署在这个局域网中。当通过公网来访问Drone时内网地址会被传到前端然后报dail:192.168.2.253:443错误。
    解决:将其部署到公网云服务器上了(不想改内网的DNS配置)
  • 踩坑点2:实体机的环境变量会被传到podman容器中
    当我在下载某个文件的时候临时配置了HTTP_PROXYHTTPS_PROXY环境变量后再运行了podman run,结果这两个环境变量也传到了容器中。造成Drone访问Gitea时也走代理,但容器中根本没有这个 代理端口在运行.....
    解决:删除容器、清除HTTP_PROXYHTTPS_PROXY后再运行podman run
  • 踩坑点3:连接的Runner数量为0时,Build任务会一直被挂起(Pending)
    由于下面Runner选择的失误,没有检查Runner的连接日志,导致一直没有Runner连接至Drone。每个Build都被挂起了20分钟以上,花了好几个小时也没找到原因....

二. 部署Runner

Runner则选择了docker-runner:

podman run --detach \
  --env=DRONE_RPC_PROTO=https \
  --env=DRONE_RPC_HOST=ci.lintian.co \
  --env=DRONE_RPC_SECRET=xxxxxxxxx \
  --env=DRONE_RUNNER_CAPACITY=2 \
  --env=DRONE_RUNNER_NAME=docker-runner \
  --name=runner \
  drone/drone-runner-docker:1
  • 踩坑点1:docker-runner只能运行在docker下
    通过podman运行docker-runner时并没有按照文档将docker.sock给映射到容器中导致实际上Runner并没有正常运行,进而导致Build任务一直被挂起的异常。Google了一下说可以通过启动podman.socket服务来生成podman.sock以便映射到docker-runner。但是依旧报NAT-Link错误(看来是podman中的网络与docker不一样)。
    解决:找了一台机器运行docker

三. 提交代码触发CI

在经过上面的配置过后Build终于可以运行,接下来就是调整.drone.yml脚本了。目前是将代码编译打包成dokcer镜像后传到阿里云的镜像服务中。置于怎样部署到目标服务器中仍在调试。

  • Build任务没有被触发时检查Gitea的webhook是否被Drone正确响应
    由于之前的配置都基于局域网,所以局域网内残留有ci.lintian.co的局域网地址的解析,导致Gitea发起webhook时错误地发送到了局域网地址而导致Build任务没有被触发
    解决:移除Drone服务器的局域网地址解析,保证Gitea服务器发起的webhook发送到Drone服务器
  • 在git提交日志中加入[SKIP CI]可以不触发Build任务执行
  • Gitea中可以调整webhook的发起条件(如只有在新建tag时才发起)

总结

虽然目前腾讯云和阿里云都有各自的从代码管理到CI/CD部署的服务(之前用过Azure的),自己架设一个CI/CD服务对自己而言仍有不小的意义。