首发于 Gitea
使用 Gitea + Renovate Bot 自动监控软件包依赖

使用 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 启动任意容器

搭建

  1. 在你的 Gitea 服务器上创建一个机器人专用账号。在这种使用场景下,专用账号的优势是可以设定自定义名称、头像、访问令牌来与个人账号用途加以区分。

你可以参考此案例,假设我们创建一个机器人账号:

  • 账号: renovatebot
  • 全名: Renovate Bot
  • 访问令牌: abcdefghijklmnopqrstuvwxyz01234567654321
  • 将 Renovate Bot 机器人添加到我们要监控的项目。

前面我们创建了机器人专用账号,稍后 Renovate Bot 可以根据这个账号支持访问的仓库目录,逐一扫描软件包依赖。

因此,如果我们想要将自己的项目加入 Renovate Bot 的扫描清单,只需在项目的协作者中添加 renovatebot

  • 打开 仓库 - 协作者 - 搜索添加 renovatebot - 提供可写权限

这里,我们为协作者 renovatebot 提供了可写权限。这项操作将允许 Renovate Bot 在你的仓库创建额外的分支。机器人在扫描到落后的软件包依赖时,会根据最新的依赖版本在新的分支中创建修复补丁,并开启一个合并请求。

另外,在团队组织中,添加 Renovate Bot 账号,机器人就可以对当前账号可访问的所有组织项目逐一扫描,避免为每个项目单独配置 Renovate Bot。

  1. 自行部署 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 作为基础镜像。当你看到此文时,这里的版本号可能并不是最新的,你应该前往 hub.docker.com/r/renova 查找最新的 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)