Files
BYW-VoiceHub/.github/workflows/build-fpk.yml
T

125 lines
4.8 KiB
YAML

# .github/workflows/build-fpk.yml
# VoiceHub 飞牛 fnOS FPK 安装包自动构建
# 手动触发,版本号自动从 package.json 读取
name: Build VoiceHub FPK
on:
push:
branches:
- main
workflow_dispatch:
permissions:
contents: read
jobs:
build-fpk:
if: github.repository == 'laoshuikaixue/VoiceHub' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: 读取版本号 & 安装 fnpack
run: |
# 读取原始版本号
ORIGINAL_VER=$(node -p "require('./package.json').version")
echo "📦 原始版本: $ORIGINAL_VER"
# 转换为三段式版本号 (x.y.zw 格式,将第四段拼接到第三段)
FNOS_VER=$(echo "$ORIGINAL_VER" | awk -F. '{
if (NF >= 4) {
# 四段式版本号,拼接最后两段
printf "%s.%s.%s%s", $1, $2, $3, $4
} else if (NF == 3) {
# 已经是三段式,直接使用
printf "%s.%s.%s", $1, $2, $3
} else {
# 其他情况,保持原样
print $0
}
}')
echo "APP_VER=$FNOS_VER" >> "$GITHUB_ENV"
echo "📦 转换后版本: $FNOS_VER"
wget -q https://static2.fnnas.com/fnpack/fnpack-1.2.1-linux-amd64 -O /usr/local/bin/fnpack
chmod +x /usr/local/bin/fnpack
- name: 创建 FPK 目录
run: |
fnpack create voicehub --template docker
echo "📁 模板结构:"
find voicehub -type f | sort
- name: 写入 manifest & 准备图标
run: |
# 复制仓库中的 fnos 模板
cp -r fnos/* voicehub/
# 从 public 目录复制图标到构建目录
mkdir -p voicehub/app/ui/images
cp public/assets/logo.png voicehub/app/ui/images/icon-64.png
cp public/assets/logo.png voicehub/app/ui/images/icon-256.png
cp public/assets/logo.png voicehub/ICON.PNG
cp public/assets/logo.png voicehub/ICON_256.PNG
# 更新版本号
sed -i "s/^version=.*/version=${APP_VER}/" voicehub/manifest
chmod +x voicehub/cmd/main
echo "✅ manifest, cmd/main & icons 已就绪"
- name: 从仓库读取 docker-compose-prebuild-nju.yml 并写入
run: |
# 从项目根目录读取仓库内的 compose 文件
SRC_COMPOSE="docker-compose/docker-compose-prebuild-nju.yml"
# 目标路径
DST_COMPOSE="voicehub/app/docker/docker-compose.yaml"
# 创建目录
mkdir -p voicehub/app/docker
# 复制内容并进行修改:
# 1. 移除 postgres 服务的端口映射,以避免 fnOS 5432 端口冲突
# 2. 移除 voicehub 服务的代码挂载 (.:/app),避免覆盖镜像内的预构建代码导致 MODULE_NOT_FOUND
# 3. 确保容器间通过 service name 互联
# 直接使用 awk 工具更精确地过滤掉整个 volumes 块和 ports 块中我们不想要的行,或者删除空块
awk '
/^[[:space:]]+volumes:/ { in_volumes=1; print; next }
/^[[:space:]]+ports:/ { in_ports=1; print; next }
/^[[:space:]]+restart:/ { in_volumes=0; in_ports=0; print; next }
/^[[:space:]]+[a-zA-Z0-9_]+:/ { in_volumes=0; in_ports=0; print; next }
in_volumes && /^[[:space:]]+-[[:space:]]+.:\/app/ { next }
in_volumes && /^[[:space:]]+-[[:space:]]+\/app\/node_modules/ { next }
in_ports && /^[[:space:]]+-[[:space:]]+.5432:5432./ { next }
{ print }
' "$SRC_COMPOSE" > "$DST_COMPOSE.tmp"
# 清理由于上述删除可能产生的空的 volumes: 或 ports: 标签
# 使用 grep 检查下一行是否是配置项或空行
sed -E '/^[[:space:]]+volumes:[[:space:]]*$/{N;/\n[[:space:]]+-/!d}' "$DST_COMPOSE.tmp" > "$DST_COMPOSE.tmp2"
sed -E '/^[[:space:]]+ports:[[:space:]]*$/{N;/\n[[:space:]]+-/!d}' "$DST_COMPOSE.tmp2" > "$DST_COMPOSE"
rm "$DST_COMPOSE.tmp" "$DST_COMPOSE.tmp2"
echo "✅ 已处理 compose 文件:移除数据库端口暴露 & 移除应用代码挂载"
cat "$DST_COMPOSE"
- name: 最终目录 & 打包
run: |
echo "📦 FPK 结构:"
find voicehub -type f | sort
echo "---"
cd voicehub
fnpack build
ls -lh *.fpk 2>/dev/null || { echo "❌ 打包失败"; exit 1; }
mv *.fpk ../
- name: 上传 Artifact
uses: actions/upload-artifact@v7
with:
name: voicehub-fpk-${{ env.APP_VER }}
path: "*.fpk"
retention-days: 30