Auto Update _worker.js #133
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: Auto Update _worker.js | |
| on: | |
| schedule: | |
| - cron: '0 0 * * *' # 每天00:00 UTC运行 | |
| workflow_dispatch: # 允许手动触发 | |
| inputs: | |
| release_type: | |
| description: '选择更新版本类型' # 选择更新版本类型 | |
| required: true | |
| default: 'release' | |
| type: choice | |
| options: | |
| - 'release' | |
| - 'prerelease' | |
| jobs: | |
| update: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout 仓库 # 检出仓库代码 | |
| uses: actions/checkout@v4 | |
| - name: 检查并初始化 update_type.txt # 检查并初始化 update_type.txt 文件 | |
| id: init_update_type_file | |
| run: | | |
| # 检查 update_type.txt 文件是否存在 | |
| if [ ! -f "update_type.txt" ]; then | |
| # 如果文件不存在,则创建它并写入 '1' 作为默认内容 (1=正式版) | |
| echo "1" > update_type.txt | |
| # 设置环境变量,标记此文件是在当前工作流运行中创建的 | |
| echo "UPDATE_TYPE_FILE_CREATED=true" >> $GITHUB_ENV | |
| echo "update_type.txt 文件不存在,已自动创建并设置为 '1' (正式版)。" # update_type.txt 文件不存在,已自动创建并设置为 '1' (正式版)。 | |
| else | |
| echo "update_type.txt 文件已存在。" # update_type.txt 文件已存在。 | |
| fi | |
| - name: 获取最新 release 信息 # 获取最新发布版本信息 | |
| id: get_release | |
| run: | | |
| # 获取手动触发时选择的更新类型,默认为 'release' | |
| # 手动触发的优先级最高 | |
| RELEASE_TYPE_INPUT="${{ github.event.inputs.release_type }}" | |
| ACTUAL_RELEASE_TYPE="" | |
| # 如果是定时任务触发,检查 update_type.txt 文件内容来确定更新类型 | |
| if [ "${{ github.event_name }}" == "schedule" ]; then | |
| # 确保文件存在,因为上一步可能已经创建了 | |
| if [ -f "update_type.txt" ]; then | |
| FILE_CONTENT=$(cat update_type.txt | tr -d '\n' | tr -d '\r') | |
| if [ "$FILE_CONTENT" == "0" ]; then | |
| # 如果文件内容为 '0',则选择预发布类型 | |
| ACTUAL_RELEASE_TYPE="prerelease" | |
| else | |
| # 否则,选择正式发布类型 (包括文件内容为 '1' 或其他非 '0' 的情况) | |
| ACTUAL_RELEASE_TYPE="release" | |
| fi | |
| else | |
| # 如果文件不存在 (理论上不会发生,因为上一步会创建),默认正式版 | |
| ACTUAL_RELEASE_TYPE="release" | |
| fi | |
| else | |
| # 如果是手动触发,使用手动输入的值 | |
| ACTUAL_RELEASE_TYPE="$RELEASE_TYPE_INPUT" | |
| fi | |
| echo "当前选择的更新类型: $ACTUAL_RELEASE_TYPE" # 当前选择的更新类型 | |
| if [ "$ACTUAL_RELEASE_TYPE" == "prerelease" ]; then | |
| # 如果选择预发布版本,获取所有 release 并筛选最新的非草稿预发布版本 | |
| latest_tag=$(curl -s https://api.github.com/repos/bia-pain-bache/BPB-Worker-Panel/releases \ | |
| | jq -r 'map(select(.prerelease == true and .draft == false)) | sort_by(.published_at) | .[-1].tag_name') | |
| if [ -z "$latest_tag" ]; then | |
| echo "未找到任何预发布版本。" # 未找到任何预发布版本。 | |
| exit 1 | |
| fi | |
| echo "最新预发布版本: $latest_tag" # 最新预发布版本 | |
| else | |
| # 默认或选择正式发布版本,获取最新正式发布版本 (GitHub API 的 /latest 默认返回非预发布版本) | |
| latest_tag=$(curl -s https://api.github.com/repos/bia-pain-bache/BPB-Worker-Panel/releases/latest | jq -r '.tag_name') | |
| if [ -z "$latest_tag" ]; then | |
| echo "未找到任何正式发布版本。" # 未找到任何正式发布版本。 | |
| exit 1 | |
| fi | |
| echo "最新正式发布版本: $latest_tag" # 最新正式发布版本 | |
| fi | |
| # 将最新标签名和实际选择的发布类型设置为环境变量,供后续步骤使用 | |
| echo "latest_tag=$latest_tag" >> $GITHUB_ENV | |
| echo "release_type=$ACTUAL_RELEASE_TYPE" >> $GITHUB_ENV | |
| - name: 检查本地 version.txt # 检查本地 version.txt 文件 | |
| id: check_version | |
| run: | | |
| # 检查是否存在 version.txt 文件 | |
| if [ -f "version.txt" ]; then | |
| # 如果存在,读取当前版本号并去除换行符和回车符 | |
| current_version=$(cat version.txt | tr -d '\n' | tr -d '\r') | |
| echo "当前本地版本: $current_version" # 当前本地版本 | |
| else | |
| # 如果不存在,视为首次更新 | |
| echo "未找到 version.txt,视为首次更新。" # 未找到 version.txt,视为首次更新。 | |
| current_version="" | |
| fi | |
| # 将当前版本号设置为环境变量,供后续步骤使用 | |
| echo "current_version=$current_version" >> $GITHUB_ENV | |
| - name: 判断是否需要更新 # 判断是否需要更新 | |
| id: need_update | |
| run: | | |
| # 比较当前版本和最新版本是否一致 | |
| if [ "$current_version" = "$latest_tag" ]; then | |
| echo "No update needed." | |
| # 设置环境变量 need_update 为 false | |
| echo "need_update=false" >> $GITHUB_ENV | |
| else | |
| echo "Update needed." | |
| # 设置环境变量 need_update 为 true | |
| echo "need_update=true" >> $GITHUB_ENV | |
| fi | |
| - name: 下载并替换 _worker.js # 下载并替换 _worker.js 文件 | |
| # 仅在需要更新时执行此步骤 | |
| if: env.need_update == 'true' | |
| run: | | |
| # 构建下载 URL | |
| download_url="https://github.com/bia-pain-bache/BPB-Worker-Panel/releases/download/${{ env.latest_tag }}/worker.js" | |
| echo "下载文件: $download_url" # 正在下载文件 | |
| # 使用 curl 下载文件并保存为 _worker.js | |
| curl -L -o _worker.js "$download_url" | |
| # 将最新标签名写入 version.txt | |
| echo "${{ env.latest_tag }}" > version.txt | |
| - name: 提交更新到 GitHub # 提交更新到 GitHub 仓库 | |
| # 仅在需要更新时执行此步骤 | |
| if: env.need_update == 'true' | |
| run: | | |
| # 配置 Git 用户名和邮箱,以便 GitHub Actions 可以提交代码 | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| # 添加 _worker.js 和 version.txt 到 Git 暂存区 | |
| git add _worker.js version.txt | |
| # 提交更改,提交信息包含更新的版本号 | |
| git commit -m "Update _worker.js to version ${{ env.latest_tag }}" | |
| # 推送更改到远程仓库 | |
| git push | |
| - name: 提交 update_type.txt (如果自动创建) # 提交 update_type.txt (如果文件是自动创建的) | |
| # 仅当 update_type.txt 文件是在当前工作流运行中自动创建时才执行此步骤 | |
| if: env.UPDATE_TYPE_FILE_CREATED == 'true' | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| git add update_type.txt | |
| git commit -m "feat: Auto-created update_type.txt with default 'release' type" | |
| git push | |
| - name: 发送更新成功通知 (复用或创建 GitHub Issue) # 发送更新成功通知 (复用或创建 GitHub Issue) | |
| # 仅在前面的步骤都成功执行且确实进行了更新时触发此通知 | |
| if: success() && env.need_update == 'true' | |
| uses: actions/github-script@v6 | |
| with: | |
| # 使用 GITHUB_TOKEN 进行身份验证,它具有创建 Issue 的权限 | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| script: | | |
| // 获取仓库所有者和名称 | |
| const { owner, repo } = context.repo; | |
| // 从环境变量中获取最新标签名和发布类型 | |
| const latestTag = process.env.latest_tag; | |
| const releaseType = process.env.release_type; | |
| const typeText = releaseType === 'prerelease' ? '预发布版本' : '正式版本'; // 根据发布类型设置文本 | |
| // 定义通知 Issue 的标题和内容 | |
| const notificationTitle = `_worker.js 自动更新通知`; // 用于查找和创建的统一标题 | |
| const notificationBody = `_worker.js 已成功更新到${typeText} ${latestTag}。`; | |
| const timestamp = new Date().toLocaleString('zh-CN'); // 获取当前时间并格式化 | |
| // 尝试查找带有特定标签的现有通知 Issue | |
| const { data: issues } = await github.rest.issues.listForRepo({ | |
| owner, | |
| repo, | |
| state: 'open', // 只查找开放的 Issue | |
| labels: 'auto-update-status-issue', // 用于识别此特定通知 Issue 的唯一标签 | |
| per_page: 1 // 只获取一个结果 | |
| }); | |
| let targetIssue = null; | |
| if (issues.length > 0) { | |
| targetIssue = issues[0]; | |
| } | |
| if (targetIssue) { | |
| // 如果找到现有 Issue,则在其上添加评论 | |
| await github.rest.issues.createComment({ | |
| owner, | |
| repo, | |
| issue_number: targetIssue.number, | |
| body: `${notificationBody}\n\n更新时间: ${timestamp}` // 在评论中包含时间戳 | |
| }); | |
| console.log(`已在现有 Issue #${targetIssue.number} 上添加评论。`); // 打印日志 | |
| } else { | |
| // 如果没有找到,则创建新的 Issue | |
| const { data: newIssue } = await github.rest.issues.create({ | |
| owner, | |
| repo, | |
| title: notificationTitle, // 使用统一标题 | |
| body: `${notificationBody}\n\n更新时间: ${timestamp}`, // 在 Issue 正文中包含时间戳 | |
| labels: ['auto-update', 'success', 'auto-update-status-issue'] // 添加所有相关标签,包括唯一标签 | |
| }); | |
| console.log(`已创建新的 Issue #${newIssue.number}。`); // 打印日志 | |
| } |