Skip to content

构建 OpenList Magisk 模块 #2447

构建 OpenList Magisk 模块

构建 OpenList Magisk 模块 #2447

Workflow file for this run

name: 构建 OpenList Magisk 模块
on:
schedule:
- cron: '0 */4 * * *' # 每4小时运行一次
workflow_dispatch: # 支持手动触发
push:
branches:
- main # 推送 main 分支时触发
paths-ignore:
- 'update.json'
- 'OpenList-Magisk/module.prop' # 忽略由工作流自动更新的文件
permissions:
contents: write # 允许推送代码和创建 Release
actions: read # 允许读取 Actions 状态
jobs:
build:
runs-on: ubuntu-latest
steps:
# 检出仓库代码
- name: 检出仓库代码
uses: actions/checkout@v4
# 安装依赖工具
- name: 安装依赖
run: |
sudo apt-get update
sudo apt-get install -y curl zip gh
# 获取 OpenList 最新版本
- name: 获取 OpenList 最新版本
id: get_version
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
API_URL: https://api.github.com/repos/OpenListTeam/OpenList/releases/latest
run: |
for i in {1..3}; do
RESPONSE=$(curl -s -L -w "\n%{http_code}" -H "Authorization: Bearer $GITHUB_TOKEN" "$API_URL")
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
BODY=$(echo "$RESPONSE" | sed '$d')
if [ "$HTTP_CODE" -eq 200 ] && [ -n "$BODY" ]; then
echo "成功获取 OpenList Release 数据"
echo "$BODY" > latest_release.json
break
fi
echo "尝试 $i 失败,HTTP 状态码: $HTTP_CODE"
sleep $((5 * i))
done
if [ ! -f latest_release.json ] || [ ! -s latest_release.json ]; then
echo "::error::无法获取 OpenList 版本信息"
exit 1
fi
# 提取版本号
VERSION=$(echo "$BODY" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
if [ -z "$VERSION" ]; then
echo "::error::无法提取版本号"
cat latest_release.json
exit 1
fi
# 生成版本代码(比如 v4.1.10 -> 4110)
VERSION_NUM=$(echo "$VERSION" | tr -d 'v')
VERSION_CODE=$(echo "$VERSION_NUM" | awk -F. '{print $1 * 1000 + $2 * 100 + $3}')
# 提取下载链接
ARM_URL=$(echo "$BODY" | grep '"browser_download_url":' | grep 'openlist-android-arm.tar.gz' | sed -E 's/.*"([^"]+)".*/\1/')
ARM64_URL=$(echo "$BODY" | grep '"browser_download_url":' | grep 'openlist-android-arm64.tar.gz' | sed -E 's/.*"([^"]+)".*/\1/')
# 提取 CHANGELOG(使用 Python 处理 JSON)
CHANGELOG=$(python3 -c "import sys, json; data = json.load(sys.stdin); print(data.get('body', ''))" <<< "$BODY")
if [ -z "$ARM_URL" ] || [ -z "$ARM64_URL" ]; then
echo "::error::无法提取二进制下载链接"
exit 1
fi
# 设置环境变量
{
echo "OPENLIST_VERSION=$VERSION"
echo "OPENLIST_VERSION_CODE=$VERSION_CODE"
echo "OPENLIST_ARM_URL=$ARM_URL"
echo "OPENLIST_ARM64_URL=$ARM64_URL"
echo "OPENLIST_CHANGELOG<<EOF"
echo "$CHANGELOG"
echo "EOF"
} >> $GITHUB_ENV
# 检查当前模块版本
- name: 检查当前模块版本
id: check_version
run: |
if [ -f update.json ]; then
CURRENT_VERSION=$(grep '"version":' update.json | sed -E 's/.*"version":\s*"([^"]+)".*/\1/')
echo "CURRENT_VERSION=$CURRENT_VERSION" >> $GITHUB_ENV
else
echo "CURRENT_VERSION=none" >> $GITHUB_ENV
fi
# 比较版本并决定是否构建
- name: 检查是否需要构建
id: should_build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# 检查版本是否一致
VERSION_MATCH=false
if [ "${{ env.CURRENT_VERSION }}" != "none" ] && [ "${{ env.OPENLIST_VERSION }}" = "${{ env.CURRENT_VERSION }}" ]; then
VERSION_MATCH=true
fi
# 检查 Release 是否存在
RELEASE_EXISTS=false
if [ "$VERSION_MATCH" = "true" ]; then
if gh release view "${{ env.OPENLIST_VERSION }}" &>/dev/null; then
RELEASE_EXISTS=true
fi
fi
# 决定是否构建
if [ "${{ env.CURRENT_VERSION }}" = "none" ] || [ "${{ env.OPENLIST_VERSION }}" != "${{ env.CURRENT_VERSION }}" ] || [ "$RELEASE_EXISTS" = "false" ]; then
echo "需要构建新模块:"
if [ "${{ env.CURRENT_VERSION }}" = "none" ]; then
echo "- 当前版本不存在,首次构建"
elif [ "${{ env.OPENLIST_VERSION }}" != "${{ env.CURRENT_VERSION }}" ]; then
echo "- 版本不匹配:OpenList 版本 ${{ env.OPENLIST_VERSION }},当前模块版本 ${{ env.CURRENT_VERSION }}"
elif [ "$RELEASE_EXISTS" = "false" ]; then
echo "- 版本匹配但 Release 不存在"
fi
echo "SHOULD_BUILD=true" >> $GITHUB_ENV
else
echo "模块版本已是最新 (${{ env.OPENLIST_VERSION }}) 且 Release 存在,无需构建"
echo "SHOULD_BUILD=false" >> $GITHUB_ENV
fi
# 同步 OpenList 二进制文件
- name: 同步 OpenList 二进制文件
if: env.SHOULD_BUILD == 'true'
run: |
# 下载并解压 ARM 版本
for i in {1..3}; do
if curl -L -o openlist-arm.tar.gz "${{ env.OPENLIST_ARM_URL }}"; then
break
fi
echo "下载 ARM 版本失败,重试 $i/3"
sleep $((5 * i))
done
if [ ! -f openlist-arm.tar.gz ]; then
echo "::error::下载 ARM 版本失败"
exit 1
fi
tar -xzf openlist-arm.tar.gz
if [ ! -f openlist ]; then
echo "::error::解压 ARM 版本失败"
exit 1
fi
mv openlist openlist-arm
rm -f openlist-arm.tar.gz
# 下载并解压 ARM64 版本
for i in {1..3}; do
if curl -L -o openlist-arm64.tar.gz "${{ env.OPENLIST_ARM64_URL }}"; then
break
fi
echo "下载 ARM64 版本失败,重试 $i/3"
sleep $((5 * i))
done
if [ ! -f openlist-arm64.tar.gz ]; then
echo "::error::下载 ARM64 版本失败"
exit 1
fi
tar -xzf openlist-arm64.tar.gz
if [ ! -f openlist ]; then
echo "::error::解压 ARM64 版本失败"
exit 1
fi
mv openlist openlist-arm64
rm -f openlist-arm64.tar.gz
# 移动二进制文件到模块目录
if [ ! -f openlist-arm ] || [ ! -f openlist-arm64 ]; then
echo "::error::二进制文件不存在"
exit 1
fi
mv openlist-arm OpenList-Magisk/
mv openlist-arm64 OpenList-Magisk/
# 设置权限
chmod 755 OpenList-Magisk/openlist-arm OpenList-Magisk/openlist-arm64
# 更新配置文件
- name: 更新配置文件
if: env.SHOULD_BUILD == 'true'
run: |
# 更新 update.json
cat > update.json << EOF
{
"version": "${{ env.OPENLIST_VERSION }}",
"versionCode": ${{ env.OPENLIST_VERSION_CODE }},
"zipUrl": "${{ github.server_url }}/${{ github.repository }}/releases/download/${{ env.OPENLIST_VERSION }}/openlist-magisk-${{ env.OPENLIST_VERSION }}.zip",
"changelog": "${{ github.server_url }}/${{ github.repository }}/raw/main/OpenList-Magisk/CHANGELOG.md"
}
EOF
# 更新 module.prop
if [ -f OpenList-Magisk/module.prop ]; then
sed -i "s/^version=.*/version=${{ env.OPENLIST_VERSION }}/" OpenList-Magisk/module.prop
sed -i "s/^versionCode=.*/versionCode=${{ env.OPENLIST_VERSION_CODE }}/" OpenList-Magisk/module.prop
else
echo "::error::module.prop 文件不存在"
exit 1
fi
# 更新 CHANGELOG.md
mkdir -p OpenList-Magisk
echo "${{ env.OPENLIST_CHANGELOG }}" > OpenList-Magisk/CHANGELOG.md
# 提交更改
git config user.name "GitHub Actions"
git config user.email "actions@github.com"
git add update.json OpenList-Magisk/module.prop OpenList-Magisk/CHANGELOG.md
git commit -m "更新模块到 OpenList ${{ env.OPENLIST_VERSION }}" || echo "无更改需要提交"
git push origin main
# 打包模块
- name: 打包模块
if: env.SHOULD_BUILD == 'true'
run: |
cd OpenList-Magisk
zip -r ../openlist-magisk-${{ env.OPENLIST_VERSION }}.zip .
cd ..
# 创建 Release
- name: 创建 Release
if: env.SHOULD_BUILD == 'true'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# 检查 Release 是否已存在
if gh release view "${{ env.OPENLIST_VERSION }}" &>/dev/null; then
echo "Release ${{ env.OPENLIST_VERSION }} 已存在,跳过创建"
exit 0
fi
# 创建 Release notes 文件
echo "Synced with OpenList official release v${{ env.OPENLIST_VERSION }}" > release_notes.txt
echo "" >> release_notes.txt
echo "${{ env.OPENLIST_CHANGELOG }}" >> release_notes.txt
# 创建 Release
gh release create "${{ env.OPENLIST_VERSION }}" \
--title "OpenList Magisk Module ${{ env.OPENLIST_VERSION }}" \
--notes-file release_notes.txt \
--draft=false \
--prerelease=false \
"openlist-magisk-${{ env.OPENLIST_VERSION }}.zip"
echo "Release ${{ env.OPENLIST_VERSION }} 创建成功"
# 清理临时文件
rm -f release_notes.txt
# 清理临时文件
- name: 清理临时文件
if: always()
run: |
rm -rf openlist-magisk-*.zip latest_release.json release_notes.txt