最近公司决定用 Drone 来实现 CICD,趁机就学习了一下,在这里记录一下
官方文档:docs.drone.io/server/prov…
前提
Docker & WSL
因为 Drone 和 Gogs 都是安装在 Docker 中的,所以 Docker 是必须的。如果是 Windows,建议安装 WSL
hosts 文件修改
因为在公司和住处的局域网 IP 不同,公司是 10 开头的,住处是 192 开头的,为了方便,直接在 hosts 文件中加入如下行。后面在使用 Drone 和 Gogs 的时候, 就直接使用 drone.local.com 即可。
192.168.1.123 drone.local.com
Gogs
安装 Gogs
用 Docker 安装比较简单
# 也可以映射到主机的硬盘上,看你需求了
docker volume create --name gogs-data
docker run --name=gogs -p 10022:22 -p 10880:3000 -v gogs-data:/data gogs/gogs
当看到如下日志的时候,就证明启动成功了
2022/02/23 04:58:46 [ INFO] Run mode: Development
2022/02/23 04:58:47 [ INFO] Listen on http://0.0.0.0:3000
Feb 23 04:58:47 sshd[65]: Server listening on :: port 22.
Feb 23 04:58:47 sshd[65]: Server listening on 0.0.0.0 port 22
参考文档:hub.docker.com/r/gogs/gogs…
配置 Gogs
安装
docker run 命令跑成功以后,可以直接使用 http://drone.local.com:10880/ 访问 Gogs,当然,首先配置一下
- 数据库:选择 SQLLite3 最简单了
- 域名:就写之前在 hosts 中配置的 host
- SSH 端口号: 10022
- HTTP 端口号:10880
- 应用 URL:drone.local.com:10880/
点击 立即安装 即可
注册用户
安装完以后会自动跳转到登录页面,点击右上角的注册,注册一个用户。请注意,用户名先注册为 gogs,后面和 Drone 结合的时候,会有用。当然,别的名字也可以,在这篇文章暂定为 gogs
创建仓库
创建一个名为 drone-test 的仓库,然后加入 .drone.yml 和一些其他文件(这里只做一个框架,前端后端都可以用)
kind: pipeline
type: docker
name: drone-test-ci
steps:
- name: test
image: maven:3.8.4-openjdk-11-slim
commands:
- mkdir -p ./node_modules
- echo test ./node_modules/test.js
- export NODE_MODULES_PATH=`pwd`/node_modules
- echo $NODE_MODULES_PATH
- ls $NODE_MODULES_PATH
trigger:
branch:
- master
event:
- pull_request
- push
最后把 .drone.yml 和一些其他文件都推到 Gogs 仓库中
Drone
Drone 也在 Docker 中安装
docker run \
--volume=/var/lib/drone:/data \
--env=DRONE_AGENTS_ENABLED=true \
--env=DRONE_GOGS_SERVER=http://drone.local.com:10880 \
--env=DRONE_RPC_SECRET=super-duper-secret \
--env=DRONE_SERVER_HOST=drone.local.com:8080 \
--env=DRONE_SERVER_PROTO=http \
--env=DRONE_USER_CREATE=username:gogs,machine:false,admin:true,token:55f24eb3d61ef6ac5e83d550178638dc \
--publish=8080:80 \
--publish=8443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone
参数具体信息请参考 docs.drone.io/server/prov…
- DRONE_GOGS_SERVER: Gogs 的地址
- DRONE_RPC_SECRET: 用于 server 和 runner 之间的验证,和后面的 runner 中配置的一样即可
- DRONE_SERVER_HOST: Drone 的地址
- DRONE_USER_CREATE:创建用户,这里的用户名为
gogs和 Gogs 注册用户时是一样的名字,admin:true表示gogs用户拥有 admin 权限。
Drone Runner
Drone Runner 也在 Docker 中安装。这个 volume 映射是 linux 格式,所以建议在虚拟机或者 WSL 中运行。Windows 版本的请参见 docs.drone.io/runner/dock…
docker run --detach \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--env=DRONE_TMATE_ENABLED=true \
--env=DRONE_RPC_PROTO=http \
--env=DRONE_RPC_HOST=drone.local.com:8080 \
--env=DRONE_RPC_SECRET=super-duper-secret \
--env=DRONE_RUNNER_CAPACITY=2 \
--env=DRONE_RUNNER_NAME=my-first-runner \
--publish=3000:3000 \
--restart=always \
--name=runner \
drone/drone-runner-docker
这里选择的是 docker runner,因为 .drone.yml 中 type 配置的为 type: docker。
查看 runner 是否运行正确: docker logs runner,如果返回如下信息,则表明 runner 正常启动
time="2022-02-23T09:59:20Z" level=info msg="starting the server" addr=":3000"
time="2022-02-23T09:59:20Z" level=info msg="successfully pinged the remote server"
测试
1. 登录
访问 drone.local.com:8080/ 并使用 gogs 用户登录,登录后可以看见 drone-test 仓库已经存在
2. 激活项目
点进 drone-test 项目,切换到 Settings 页面,点击 ACTIVE REPOSITORY 按钮
3. 触发 build
随便修改 drone-test 项目中的内容,并推送到 Gogs 上,Drone 就会被触发。
OK,Gogs 和 Drone 的部署已经完成了。接下来会写怎么缓存 node_modules 或者 .m2
Issues
1. Drone 并没有被触发
可能原因1: Web 钩子 (Web hook,以下称 Web 钩子)没有添加,或者消息发送失败。
- 查看
Web 钩子在drone-test仓库的仓库设置中,选择管理 Web 钩子,应该可以看到已经有了一个Web 钩子
- 查看最近推送记录
可能原因2: Drone Runner 和 .drone.yml 中配置的 type 不一样。我遇到的就是这个问题,因为我的 .drone.yml 是从项目里拷贝的,我们项目用的是 kubenetes,而我本地用的是 docker runner