diff --git a/.github/workflows/auto_release.yml b/.github/workflows/auto_release.yml deleted file mode 100644 index f13f3ae51d..0000000000 --- a/.github/workflows/auto_release.yml +++ /dev/null @@ -1,92 +0,0 @@ -on: - push: - tags: - - 'v*' - workflow_dispatch: - -name: Auto Release - -jobs: - build-and-publish-to-github-release: - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Dashboard Build - run: | - cd dashboard - npm install - npm run build - echo "COMMIT_SHA=$(git rev-parse HEAD)" >> $GITHUB_ENV - echo ${{ github.ref_name }} > dist/assets/version - zip -r dist.zip dist - - - name: Upload to Cloudflare R2 - env: - R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }} - R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }} - R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }} - R2_BUCKET_NAME: "astrbot" - R2_OBJECT_NAME: "astrbot-webui-latest.zip" - VERSION_TAG: ${{ github.ref_name }} - run: | - echo "Installing rclone..." - curl https://rclone.org/install.sh | sudo bash - - echo "Configuring rclone remote..." - mkdir -p ~/.config/rclone - cat < ~/.config/rclone/rclone.conf - [r2] - type = s3 - provider = Cloudflare - access_key_id = $R2_ACCESS_KEY_ID - secret_access_key = $R2_SECRET_ACCESS_KEY - endpoint = https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com - EOF - - echo "Uploading dist.zip to R2 bucket: $R2_BUCKET_NAME/$R2_OBJECT_NAME" - mv dashboard/dist.zip dashboard/$R2_OBJECT_NAME - rclone copy dashboard/$R2_OBJECT_NAME r2:$R2_BUCKET_NAME --progress - mv dashboard/$R2_OBJECT_NAME dashboard/astrbot-webui-${VERSION_TAG}.zip - rclone copy dashboard/astrbot-webui-${VERSION_TAG}.zip r2:$R2_BUCKET_NAME --progress - mv dashboard/astrbot-webui-${VERSION_TAG}.zip dashboard/dist.zip - - - name: Fetch Changelog - run: | - echo "changelog=changelogs/${{github.ref_name}}.md" >> "$GITHUB_ENV" - - - name: Create GitHub Release - uses: ncipollo/release-action@v1 - with: - bodyFile: ${{ env.changelog }} - artifacts: "dashboard/dist.zip" - - build-and-publish-to-pypi: - # 构建并发布到 PyPI - runs-on: ubuntu-latest - needs: build-and-publish-to-github-release - steps: - - name: Checkout repository - uses: actions/checkout@v6 - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '3.10' - - - name: Install uv - run: | - python -m pip install uv - - - name: Build package - run: | - uv build - - - name: Publish to PyPI - env: - UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }} - run: | - uv publish diff --git a/.github/workflows/desktop_release.yml b/.github/workflows/release.yml similarity index 55% rename from .github/workflows/desktop_release.yml rename to .github/workflows/release.yml index e5c0b3db2c..2fc3d83b50 100644 --- a/.github/workflows/desktop_release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Desktop Release +name: Release on: push: @@ -11,13 +11,96 @@ on: required: false default: "master" tag: - description: "Release tag to upload assets to (for example: v4.14.6)" + description: "Release tag to publish assets to (for example: v4.14.6)" required: false permissions: contents: write jobs: + build-dashboard: + name: Build Dashboard + runs-on: ubuntu-24.04 + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + ref: ${{ inputs.ref || github.ref }} + + - name: Resolve tag + id: tag + shell: bash + run: | + if [ "${{ github.event_name }}" = "push" ]; then + tag="${GITHUB_REF_NAME}" + elif [ -n "${{ inputs.tag }}" ]; then + tag="${{ inputs.tag }}" + else + tag="$(git describe --tags --abbrev=0)" + fi + if [ -z "$tag" ]; then + echo "Failed to resolve tag." >&2 + exit 1 + fi + echo "tag=$tag" >> "$GITHUB_OUTPUT" + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.28.2 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: 20 + cache: "pnpm" + cache-dependency-path: dashboard/pnpm-lock.yaml + + - name: Build dashboard dist + shell: bash + run: | + pnpm --dir dashboard install --frozen-lockfile + pnpm --dir dashboard run build + echo "${{ steps.tag.outputs.tag }}" > dashboard/dist/assets/version + cd dashboard + zip -r "AstrBot-${{ steps.tag.outputs.tag }}-dashboard.zip" dist + + - name: Upload dashboard artifact + uses: actions/upload-artifact@v6 + with: + name: Dashboard-${{ steps.tag.outputs.tag }} + if-no-files-found: error + path: dashboard/AstrBot-${{ steps.tag.outputs.tag }}-dashboard.zip + + - name: Upload dashboard package to Cloudflare R2 + if: ${{ secrets.R2_ACCOUNT_ID != '' && secrets.R2_ACCESS_KEY_ID != '' && secrets.R2_SECRET_ACCESS_KEY != '' }} + env: + R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }} + R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }} + R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }} + R2_BUCKET_NAME: "astrbot" + R2_OBJECT_NAME: "astrbot-webui-latest.zip" + VERSION_TAG: ${{ steps.tag.outputs.tag }} + shell: bash + run: | + curl https://rclone.org/install.sh | sudo bash + + mkdir -p ~/.config/rclone + cat < ~/.config/rclone/rclone.conf + [r2] + type = s3 + provider = Cloudflare + access_key_id = $R2_ACCESS_KEY_ID + secret_access_key = $R2_SECRET_ACCESS_KEY + endpoint = https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com + EOF + + cp "dashboard/AstrBot-${VERSION_TAG}-dashboard.zip" "dashboard/${R2_OBJECT_NAME}" + rclone copy "dashboard/${R2_OBJECT_NAME}" "r2:${R2_BUCKET_NAME}" --progress + cp "dashboard/AstrBot-${VERSION_TAG}-dashboard.zip" "dashboard/astrbot-webui-${VERSION_TAG}.zip" + rclone copy "dashboard/astrbot-webui-${VERSION_TAG}.zip" "r2:${R2_BUCKET_NAME}" --progress + build-desktop: name: Build ${{ matrix.name }} runs-on: ${{ matrix.runner }} @@ -58,6 +141,23 @@ jobs: fetch-depth: 0 ref: ${{ inputs.ref || github.ref }} + - name: Resolve tag + id: tag + shell: bash + run: | + if [ "${{ github.event_name }}" = "push" ]; then + tag="${GITHUB_REF_NAME}" + elif [ -n "${{ inputs.tag }}" ]; then + tag="${{ inputs.tag }}" + else + tag="$(git describe --tags --abbrev=0)" + fi + if [ -z "$tag" ]; then + echo "Failed to resolve tag." >&2 + exit 1 + fi + echo "tag=$tag" >> "$GITHUB_OUTPUT" + - name: Setup uv uses: astral-sh/setup-uv@v6 @@ -81,12 +181,14 @@ jobs: desktop/pnpm-lock.yaml - name: Install dependencies + shell: bash run: | uv sync pnpm --dir dashboard install --frozen-lockfile pnpm --dir desktop install --frozen-lockfile - name: Build desktop package + shell: bash run: | pnpm --dir dashboard run build pnpm --dir desktop run build:webui @@ -94,23 +196,6 @@ jobs: pnpm --dir desktop run sync:version pnpm --dir desktop exec electron-builder --publish never - - name: Resolve artifact tag - id: tag - shell: bash - run: | - if [ "${{ github.event_name }}" = "push" ]; then - tag="${GITHUB_REF_NAME}" - elif [ -n "${{ inputs.tag }}" ]; then - tag="${{ inputs.tag }}" - else - tag="$(git describe --tags --abbrev=0)" - fi - if [ -z "$tag" ]; then - echo "Failed to resolve artifact tag." >&2 - exit 1 - fi - echo "tag=$tag" >> "$GITHUB_OUTPUT" - - name: Normalize artifact names shell: bash env: @@ -160,9 +245,11 @@ jobs: path: desktop/dist/release/* publish-release: - name: Publish Release Assets + name: Publish GitHub Release runs-on: ubuntu-24.04 - needs: build-desktop + needs: + - build-dashboard + - build-desktop steps: - name: Checkout repository uses: actions/checkout@v6 @@ -170,7 +257,7 @@ jobs: fetch-depth: 0 ref: ${{ inputs.ref || github.ref }} - - name: Resolve release tag + - name: Resolve tag id: tag shell: bash run: | @@ -182,18 +269,35 @@ jobs: tag="$(git describe --tags --abbrev=0)" fi if [ -z "$tag" ]; then - echo "Failed to resolve release tag." >&2 + echo "Failed to resolve tag." >&2 exit 1 fi echo "tag=$tag" >> "$GITHUB_OUTPUT" - - name: Download built artifacts + - name: Download dashboard artifact + uses: actions/download-artifact@v6 + with: + name: Dashboard-${{ steps.tag.outputs.tag }} + path: release-assets + + - name: Download desktop artifacts uses: actions/download-artifact@v6 with: pattern: AstrBot-${{ steps.tag.outputs.tag }}-* path: release-assets merge-multiple: true + - name: Resolve release notes + id: notes + shell: bash + run: | + note_file="changelogs/${{ steps.tag.outputs.tag }}.md" + if [ ! -f "$note_file" ]; then + note_file="$(mktemp)" + echo "Release ${{ steps.tag.outputs.tag }}" > "$note_file" + fi + echo "file=$note_file" >> "$GITHUB_OUTPUT" + - name: Ensure release exists env: GH_TOKEN: ${{ github.token }} @@ -201,10 +305,10 @@ jobs: run: | tag="${{ steps.tag.outputs.tag }}" if ! gh release view "$tag" >/dev/null 2>&1; then - gh release create "$tag" --title "$tag" --notes "" + gh release create "$tag" --title "$tag" --notes-file "${{ steps.notes.outputs.file }}" fi - - name: Remove stale desktop assets from release + - name: Remove stale assets from release env: GH_TOKEN: ${{ github.token }} shell: bash @@ -225,3 +329,33 @@ jobs: run: | tag="${{ steps.tag.outputs.tag }}" gh release upload "$tag" release-assets/* --clobber + + publish-pypi: + name: Publish PyPI + runs-on: ubuntu-24.04 + needs: publish-release + steps: + - name: Checkout repository + uses: actions/checkout@v6 + with: + fetch-depth: 0 + ref: ${{ inputs.ref || github.ref }} + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.10" + + - name: Install uv + shell: bash + run: python -m pip install uv + + - name: Build package + shell: bash + run: uv build + + - name: Publish to PyPI + env: + UV_PUBLISH_TOKEN: ${{ secrets.PYPI_TOKEN }} + shell: bash + run: uv publish diff --git a/dashboard/src/i18n/locales/en-US/core/header.json b/dashboard/src/i18n/locales/en-US/core/header.json index 698fc9741e..df3255ec03 100644 --- a/dashboard/src/i18n/locales/en-US/core/header.json +++ b/dashboard/src/i18n/locales/en-US/core/header.json @@ -47,6 +47,17 @@ "releaseNotes": { "title": "Release Notes" }, + "redirectConfirm": { + "title": "Leaving AstrBot", + "message": "You are about to open the GitHub Releases page. Continue?", + "latestLabel": "Latest", + "targetVersion": "Target version: ", + "currentVersion": "Current version: ", + "guideTitle": "Recommended after opening:", + "guideStep1": "Download the installer that matches your OS and architecture.", + "guideStep2": "Install it and restart AstrBot.", + "guideStep3": "If you use Docker, prefer the image update path." + }, "dashboardUpdate": { "title": "Update Dashboard to Latest Version Only", "currentVersion": "Current Version", diff --git a/dashboard/src/i18n/locales/zh-CN/core/header.json b/dashboard/src/i18n/locales/zh-CN/core/header.json index 88edef0f50..d21cb0f988 100644 --- a/dashboard/src/i18n/locales/zh-CN/core/header.json +++ b/dashboard/src/i18n/locales/zh-CN/core/header.json @@ -47,6 +47,17 @@ "releaseNotes": { "title": "更新日志" }, + "redirectConfirm": { + "title": "即将跳转", + "message": "将跳转到 GitHub Releases 页面,是否继续?", + "latestLabel": "最新版本", + "targetVersion": "目标版本:", + "currentVersion": "当前版本:", + "guideTitle": "跳转后建议:", + "guideStep1": "根据你的系统架构下载对应安装包。", + "guideStep2": "完成安装后重启 AstrBot。", + "guideStep3": "如果你使用 Docker,请优先使用镜像更新方式。" + }, "dashboardUpdate": { "title": "单独更新管理面板到最新版本", "currentVersion": "当前版本", @@ -79,4 +90,4 @@ "updateFailed": "修改失败,请重试" } } -} \ No newline at end of file +} diff --git a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue index 772a43fbb7..01284aa39c 100644 --- a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue +++ b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue @@ -1,5 +1,5 @@