本文最后更新于:2024年5月3日 晚上
有一些软件包的上游本身就是使用 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 释出仓库内的文件
1 2 3 4
| - name: Checkout uses: actions/checkout@v2 with: fetch-depth: 0
|
通过 shell 命令获取仓库内 spec 文件的版本号,存入 $GITHUB_ENV
1 2 3 4
| - 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
1 2 3 4
| - 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
1 2 3 4 5 6 7
| - 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 <username@mail.com>"
|
当仓库内 spec 版本号与软件最新版本号不一致时,保存更改,推入仓库。
1 2 3 4 5 6 7 8
| - name: Commit changes if: ${{ env.CURRENT_VERSION != env.NEW_VERSION }} run: | git config --local user.email "zhullyb@outlook.com" git config --local user.name "zhullyb" git add . git commit -m "upgpkg: v2ray-geoip@${{ env.NEW_VERSION }}" git push
|
(可选)当仓库内 spec 版本号与软件最新版本号不一致时,通过 curl 语句触发 copr 的 webhook,让 copr 进行构建。
1 2 3 4
| - name: trigger copr webhook if: ${{ env.CURRENT_VERSION != env.NEW_VERSION }} run: | curl -X POST ${{ secrets.COPR_HOOK_URL }}v2ray-geoip/
|
最终的 yml 文件可以参考这里