使用 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 <[email protected]>'
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 <[email protected]>'
是 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