使用 Github Action 更新用于 rpm 打包的 spec 文件
本文最后更新于:2024年11月16日 凌晨
有一些软件包的上游本身就是使用 Github Action 发版的,每次 commit 都会触发 Github Action 去构建并分发新版本,使用构建时的时间日期作为版本号。针对这种包,手动更新费时费力,而规范的 specfile 应当是更新 %changelog
的,因此应当是使用 rpmdev-bumpspec 命令。只不过 rpmdev-bumpspec 需要在 rpm 系发行版或者装有 rpm 系列依赖包的发行版下执行,这不是随随便便一个 Linux 环境就能运行的。
我找到了 netoarmando/rpmdev-bumpspec-action 这个 Github Action,它通过启动一个 Fedora 的 docker 实现了使用 rpmdev-bumpspec 的效果。虽然 release 中只有一个 2021 年构建的 v1 版本,但 Fedora 的版本高低不影响 rpmdev-bumpspec 的效果。但每次 Github Action 执行时都会使用 fedora:latest 的 docker 重新构建一遍,不用担心 fedora 版本过低。
于是我们便解决了最核心的问题——处理 spec 文件。接下来只要补充好头尾的步骤即可。
首先使用 actions/checkout 释出仓库内的文件
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
通过 shell 命令获取仓库内 spec 文件的版本号,存入 $GITHUB_ENV
- name: Get Current Version
run: |
CURRENT_VERSION=`grep -E '^Version:' *.spec | awk '{print $2}'`
echo "CURRENT_VERSION=$CURRENT_VERSION" >> $GITHUB_ENV
通过 Github API 获取目标软件的最新版本号,存入 $GITHUB_ENV
- name: Export latest geoip version
run: |
NEW_VERSION=`curl -s https://api.github.com/repos/{user_name}/{repo_name}/releases/latest | jq -r '.tag_name' | sed 's/v//g'`
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV
当仓库内 spec 版本号与软件最新版本号不一致时,运行 rpmdev-bumpspec
- name: Run rpmdev-bumpspec action
if: ${{ env.CURRENT_VERSION != env.NEW_VERSION }}
uses: netoarmando/rpmdev-bumpspec-action@v1
with:
specfile: '{filename}'
new: ${{ env.NEW_VERSION }}
userstring: "username <[email protected]>"
当仓库内 spec 版本号与软件最新版本号不一致时,保存更改,推入仓库。
- name: Commit changes
if: ${{ env.CURRENT_VERSION != env.NEW_VERSION }}
run: |
git config --local user.email "[email protected]"
git config --local user.name "zhullyb"
git add .
git commit -m "upgpkg: v2ray-geoip@${{ env.NEW_VERSION }}"
git push
(可选)当仓库内 spec 版本号与软件最新版本号不一致时,通过 curl 语句触发 copr 的 webhook,让 copr 进行构建。
- name: trigger copr webhook
if: ${{ env.CURRENT_VERSION != env.NEW_VERSION }}
run: |
curl -X POST ${{ secrets.COPR_HOOK_URL }}v2ray-geoip/
最终的 yml 文件可以参考这里