使用 Gitea + Renovate Bot 自动监控软件包依赖
相信本文的读者或多或少用过或听说过 NPM、Maven、pip 这类软件包管理工具。
当你精心制作了一个网页、或写了一个小程序、或者使用 Vue.js + Spring 搭建了一套框架,来自 npmjs.com 和 maven 的无数软件包被你引入项目作为基础依赖,它们就如同一砖一瓦。当今互联网上丰富的第三方软件包能帮你比以往更轻松地构建大型业务系统。
因此,软件包依赖是供应链安全的重要部分,及时更新依赖可以减小漏洞风险面,甚至在不经意间提升软件性能。
Renovate Bot 是一款支持多种编程语言的软件包依赖监控工具。
它具有以下功能:
- 自动发现 Gitea 仓库列表
- 自动扫描软件包依赖。如
package.json
、go.mod
、Dockerfile
等 - 自动检查依赖更新
- 自动提供软件包依赖更新补丁
使用 Renovate Bot 可以实现周期性地扫描 Gitea 项目仓库,并且直接提供相关依赖的更新补丁。
根据下面的教程,我们在自己的 Gitea 服务器上配置 Renovate Bot 作为机器人,帮助我们自动查找项目中的依赖问题。
准备
- Gitea 服务器:可以是自建,也可以是支持 API 调用的公共服务器(API 入口一般都是默认打开的。可以试用
try.gitea.io
) - 安装 Renovate Bot 所需的服务器
- 一般选择 Linux 服务器,并建议至少拥有 1 核 1G 内存,空闲存储空间 5GB 以上
- Docker Engine: Renovate Bot 提供了运行机器人所需环境的容器镜像,标准镜像大小约 1.3GB (解压后大于 3GB)
- Docker Compose: Docker 运行环境的编排工具。有了它,你就可以轻松使用
docker compose up -d
启动任意容器
搭建
- 在你的 Gitea 服务器上创建一个机器人专用账号。在这种使用场景下,专用账号的优势是可以设定自定义名称、头像、访问令牌来与个人账号用途加以区分。
你可以参考此案例,假设我们创建一个机器人账号:
- 账号:
renovatebot
- 全名:
Renovate Bot
- 访问令牌:
abcdefghijklmnopqrstuvwxyz01234567654321
- 将 Renovate Bot 机器人添加到我们要监控的项目。
前面我们创建了机器人专用账号,稍后 Renovate Bot 可以根据这个账号支持访问的仓库目录,逐一扫描软件包依赖。
因此,如果我们想要将自己的项目加入 Renovate Bot 的扫描清单,只需在项目的协作者中添加 renovatebot
。
- 打开仓库 - 协作者 - 搜索添加 renovatebot - 提供可写权限
这里,我们为协作者 renovatebot
提供了可写权限。这项操作将允许 Renovate Bot 在你的仓库创建额外的分支。机器人在扫描到落后的软件包依赖时,会根据最新的依赖版本在新的分支中创建修复补丁,并开启一个合并请求。
另外,在团队组织中,添加 Renovate Bot 账号,机器人就可以对当前账号可访问的所有组织项目逐一扫描,避免为每个项目单独配置 Renovate Bot。
- 自行部署 Renovate Bot 机器人
Renovate Bot 有一个标准的容器环境,支持十种软件包依赖项目的查询,因此镜像大小达到了 1.3GB
(解压后会超过 3GB
)
Renovate Bot 也是一个通过命令行交互的机器人,它会在执行完一次全面扫描后退出程序,并不会持续在后台挂机运行。
下面我们展示一个 docker-compose.yml
格式的配置文件示例,在配置文件中,使用 Renovate Bot 标准镜像,配置要扫描的目标 Gitea 服务器。
首先创建文件夹 mkdir renovate && cd renovate
并粘贴下面的 docker-compose.yml
:
version: "3"
services:
renovate:
image: renovate/renovate:34
container_name: renovate
environment:
RENOVATE_AUTODISCOVER: 'true'
RENOVATE_ENDPOINT: 'https://gitea.com'
RENOVATE_GIT_AUTHOR: 'Renovate Bot <bot@renovateapp.com>'
RENOVATE_PLATFORM: "gitea"
RENOVATE_TOKEN: "abcdefghijklmnopqrstuvwxyz01234567654321"
上面的配置中使用了
renovate/renovate:34
作为基础镜像。当你看到此文时,这里的版本号可能并不是最新的,你应该前往 https://hub.docker.com/r/renovate/renovate/tags 查找最新的 Renovate 版本。
RENOVATE_AUTODISCOVER: 'true'
启动自动发现功能,Renovate Bot 通过 API 扫描发现账号下所有可以访问的仓库资源。RENOVATE_ENDPOINT: 'https://gitea.com'
填写 Gitea 服务器的 HTTP API 访问地址。这里是以https://gitea.com
为例,你应该替换成自己的服务器地址。RENOVATE_GIT_AUTHOR: 'Renovate Bot <bot@renovateapp.com>'
是 Renovate Bot 在签名补丁时所用的电子邮箱地址。RENOVATE_PLATFORM: "gitea"
设置平台模式,兼容 Gitea 服务器 API。RENOVATE_TOKEN
填写机器人账号的访问令牌。
然后,运行一次 renovate,观察日志结果,检查配置是否正确、网络能否连通:docker compose up
➜ docker compose up
[+] Running 1/0
⠿ Container renovate Created 0.0s
Attaching to renovate
renovate | INFO: Autodiscovered repositories
renovate | "length": 1,
renovate | "repositories": ["test_user/test_repo"]
renovate | INFO: Repository started (repository=test_user/test_repo)
renovate | "renovateVersion": "34.40.0"
renovate | INFO: Repository has no package files - skipping (repository=test_user/test_repo)
renovate | INFO: Repository finished (repository=test_user/test_repo)
renovate | "cloned": true,
renovate | "durationMs": 9650
renovate exited with code 0
如果看到类似上面日志那样,显示 renovate exited with code 0
就表示正常运行结束。如果扫描到仓库,就会检查该仓库的依赖,如日志中的:test_user/test_repo
- 定时运行 Renovate Bot
前面我们在 Docker 中创建了 renovate
,程序运行后自动退出。如果我们想要让 Renovate Bot 定时在后台扫描我们的软件包依赖,就可以使用 Linux 系统下的 cron 来规划定时任务。
我们使用 crontab 新建一个运行 Renovate Bot 的定时任务。(使用 crontab -e
启动任务编辑器)
# 每天早上 08:00 运行 docker start renovate
0 8 * * * /usr/bin/docker start renovate
# cron 定时任务格式可以从网站 crontab.guru 学习
- 在仓库中激活 Renovate Bot 任务
第一次运行 Renovate Bot 会生成一个 PR: Configure Renovate,该 PR 请求在主分支创建一个 renovate.json
。
一旦这个 PR 合入主分支,就表示允许在仓库中使用 Renovate Bot,在后续的检查中就会真正开始推送依赖更新补丁。
现在我们将 renovate.json
合并进入主分支。再次运行 renovate(docker start renovate
),新的补丁将通过合并请求推送:
最后,我们可以总结 Renovate 的工作流程:
- 启用程序
- 扫描仓库
- 对每个仓库重复做以下操作
- 检查
renovate.json
,没有就请求创建Configure Renovate
- 检查软件包依赖(扫描
package.json
、go.mod
、Dockerfile
、pom.xml
等依赖记录文件) - 创建更新补丁
- 提交合并请求
- 检查
- 结束程序
更多 Renovate 教程可以阅读 https://docs.renovatebot.com