- 「发布到 Release」以前只有在推 v* tag 时才跑,普通推送/PR 会显示 skipped, 容易以为坏了;现在条件写成 always() && (tag || 手动 publish) - workflow_dispatch 增加 publish 布尔输入:不打 tag 也能发版,用 v<版本> 作为 tag(不存在就按当前提交新建),省得同步工具漏推 tag - Release 任务里补上 checkout 和版本号读取,Release 标题用 VoiletMark <版本> - 用 always() 代替 !cancelled(),ARM runner 缺失导致 package 失败时也能收尾; 仍然会先检查 x86_64 的包在不在,缺了就不发 - README 写清楚两种发版方式和「skipped 是正常的」这一条
162 lines
4.9 KiB
YAML
162 lines
4.9 KiB
YAML
name: Linux 安装包
|
||
|
||
# 仓库本身在 Gitea,这个工作流是给 GitHub 镜像用的:
|
||
# 推送、打 tag(v*)、手动触发、PR 检查时编译并打出 .deb / .rpm。
|
||
on:
|
||
push:
|
||
branches: [main, master]
|
||
tags: ["v*"]
|
||
pull_request:
|
||
workflow_dispatch:
|
||
inputs:
|
||
publish:
|
||
description: "发布 Release(用 v<版本> 当 tag,不必先打 tag)"
|
||
type: boolean
|
||
default: false
|
||
|
||
permissions:
|
||
contents: write
|
||
|
||
concurrency:
|
||
group: packages-${{ github.ref }}
|
||
cancel-in-progress: true
|
||
|
||
jobs:
|
||
package:
|
||
name: ${{ matrix.arch }} · deb + rpm
|
||
runs-on: ${{ matrix.runs-on }}
|
||
# ARM runner 只有公共仓库(或自建 arm64 runner)才有;私有仓库里这一步失败
|
||
# 不算整体失败,x86_64 的包照常产出。
|
||
continue-on-error: ${{ matrix.optional }}
|
||
timeout-minutes: 30
|
||
strategy:
|
||
fail-fast: false
|
||
matrix:
|
||
include:
|
||
- arch: x86_64
|
||
runs-on: ubuntu-22.04
|
||
deb_arch: amd64
|
||
rpm_arch: x86_64
|
||
optional: false
|
||
- arch: aarch64
|
||
runs-on: ubuntu-24.04-arm
|
||
deb_arch: arm64
|
||
rpm_arch: aarch64
|
||
optional: true
|
||
|
||
steps:
|
||
- name: 检出代码
|
||
uses: actions/checkout@v4
|
||
|
||
- name: 安装构建依赖
|
||
run: |
|
||
sudo apt-get update
|
||
sudo apt-get install -y --no-install-recommends \
|
||
build-essential file \
|
||
qtbase5-dev qtbase5-dev-tools qt5-qmake \
|
||
rpm dpkg-dev
|
||
|
||
- name: 读取版本号
|
||
id: meta
|
||
run: |
|
||
version=$(sed -n 's/^VERSION[[:space:]]*=[[:space:]]*//p' VoiletMark.pro | head -n1 | tr -d '[:space:]')
|
||
if [ -z "$version" ]; then
|
||
echo "VoiletMark.pro 里没有 VERSION" >&2
|
||
exit 1
|
||
fi
|
||
echo "version=$version" >> "$GITHUB_OUTPUT"
|
||
|
||
- name: 编译
|
||
run: |
|
||
qmake_bin=$(command -v qmake-qt5 || command -v qmake || true)
|
||
if [ -z "$qmake_bin" ]; then
|
||
echo "找不到 qmake(确认装了 qtbase5-dev / qt5-qmake)" >&2
|
||
exit 1
|
||
fi
|
||
"$qmake_bin" -v
|
||
mkdir -p build
|
||
cd build
|
||
"$qmake_bin" ../VoiletMark.pro PREFIX=/usr CONFIG+=release
|
||
make -j"$(nproc)"
|
||
make install INSTALL_ROOT="$PWD/stage"
|
||
find stage -type f | sort
|
||
|
||
- name: 打 .deb
|
||
run: |
|
||
./packaging/build-deb.sh build/stage "${{ steps.meta.outputs.version }}" "${{ matrix.deb_arch }}" dist
|
||
|
||
- name: 打 .rpm
|
||
run: |
|
||
./packaging/build-rpm.sh build/stage "${{ steps.meta.outputs.version }}" "${{ matrix.rpm_arch }}" dist
|
||
|
||
- name: 检查产物
|
||
run: |
|
||
ls -lh dist
|
||
dpkg-deb -I dist/*.deb
|
||
rpm -qpi dist/*.rpm
|
||
rpm -qpl dist/*.rpm
|
||
|
||
- name: 上传构建产物
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: voiletmark-${{ matrix.arch }}
|
||
path: dist/*
|
||
if-no-files-found: error
|
||
|
||
release:
|
||
name: 发布到 Release
|
||
needs: package
|
||
# 只有两种情况发 Release:
|
||
# 1. 推了 v* tag
|
||
# 2. 手动 Run workflow 并勾上 publish
|
||
# 普通推送(main / PR)只会留下 artifact,这一步显示 skipped 是正常的。
|
||
# 用 always() 是为了 ARM 那个 job 失败(拿不到 arm runner)时这里照常收尾,
|
||
# 下面会检查 x86_64 的包在不在,缺了就不发。
|
||
if: >-
|
||
always() && (
|
||
startsWith(github.ref, 'refs/tags/') ||
|
||
(github.event_name == 'workflow_dispatch' && inputs.publish)
|
||
)
|
||
runs-on: ubuntu-24.04
|
||
timeout-minutes: 10
|
||
steps:
|
||
- name: 检出代码
|
||
uses: actions/checkout@v4
|
||
|
||
- name: 读取版本号
|
||
id: meta
|
||
run: |
|
||
version=$(sed -n 's/^VERSION[[:space:]]*=[[:space:]]*//p' VoiletMark.pro | head -n1 | tr -d '[:space:]')
|
||
echo "version=$version" >> "$GITHUB_OUTPUT"
|
||
|
||
- name: 下载所有产物
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
path: dist
|
||
merge-multiple: true
|
||
|
||
- name: 确认 x86_64 的包存在
|
||
run: |
|
||
ls -lh dist
|
||
test -n "$(ls dist/*amd64.deb 2>/dev/null)" || {
|
||
echo "没有 x86_64 的 deb,不发布" >&2
|
||
exit 1
|
||
}
|
||
|
||
- name: 生成 SHA256SUMS
|
||
run: |
|
||
cd dist
|
||
sha256sum ./*.deb ./*.rpm > SHA256SUMS
|
||
cat SHA256SUMS
|
||
|
||
- name: 挂到 Release
|
||
uses: softprops/action-gh-release@v2
|
||
with:
|
||
# 打 tag 时用那个 tag;手动发布时用 v<版本>(不存在就按当前提交新建)
|
||
tag_name: ${{ startsWith(github.ref, 'refs/tags/') && github.ref_name || format('v{0}', steps.meta.outputs.version) }}
|
||
target_commitish: ${{ github.sha }}
|
||
name: VoiletMark ${{ steps.meta.outputs.version }}
|
||
files: dist/*
|
||
generate_release_notes: true
|
||
fail_on_unmatched_files: true
|