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_PROXY
和HTTPS_PROXY
环境变量后再运行了podman run
,结果这两个环境变量也传到了容器中。造成Drone访问Gitea时也走代理,但容器中根本没有这个 代理端口在运行.....
解决:删除容器、清除HTTP_PROXY
和HTTPS_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服务对自己而言仍有不小的意义。