Files
VoiletMark/.github/workflows/linux-packages.yml
T
liyepan 623b7a8185
Linux 安装包 / aarch64 · deb + rpm (push) Canceled after 0s
Linux 安装包 / x86_64 · deb + rpm (push) Canceled after 0s
Linux 安装包 / 发布到 Release (push) Canceled after 0s
fix: v0.12.3 —— 修正 Release 发布条件,支持手动勾选 publish 发版
- 「发布到 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 是正常的」这一条
2026-10-23 14:26:13 +08:00

162 lines
4.9 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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