构建 OpenList Magisk 模块 #2447
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |