name: Publish Mini Program Dev Version on: push: branches: - main paths: - "mini/**" - ".gitea/workflows/miniapp-preview.yml" jobs: publish: # 专属运行器 lunar-node: docker://node:22-bookworm(注册于 doc79) runs-on: lunar-node steps: - uses: https://gitea.neatcn.com/gouki/action-checkout@v4 with: # Need recent commit subjects for the WeChat upload remark. fetch-depth: 20 - name: Verify Node runtime run: node --version - name: Install dependencies working-directory: mini run: npm ci - name: Run tests working-directory: mini run: npm test -- --runInBand - name: Configure production API and app version working-directory: mini env: MINIAPP_BUILD_NUMBER: ${{ gitea.run_number }} MINIAPP_VERSION_OVERRIDE: ${{ vars.MINIAPP_VERSION_OVERRIDE }} run: | test -n "$MINIAPP_BUILD_NUMBER" VERSION="$(node -e 'const {resolveVersion}=require("./ci/resolve-version.cjs"); process.stdout.write(resolveVersion(process.cwd()))')" test -n "$VERSION" mkdir -p ci-artifacts printf '%s\n' "$VERSION" > ci-artifacts/resolved-version.txt echo "Resolved Mini Program version for build+upload: $VERSION" - name: Materialize the upload key env: WECHAT_CI_PRIVATE_KEY: ${{ secrets.WECHAT_CI_PRIVATE_KEY }} run: | test -n "$WECHAT_CI_PRIVATE_KEY" umask 077 printf '%s' "$WECHAT_CI_PRIVATE_KEY" > "$RUNNER_TEMP/wechat-ci.key" - name: Upload WeChat development version working-directory: mini env: MINIAPP_APPID: ${{ vars.MINIAPP_APPID }} MINIAPP_ROBOT: ${{ vars.MINIAPP_ROBOT }} # Prefer the version resolved before build so UI label matches WeChat upload. MINIAPP_BUILD_NUMBER: ${{ gitea.run_number }} MINIAPP_VERSION_OVERRIDE: ${{ vars.MINIAPP_VERSION_OVERRIDE }} WECHAT_CI_PRIVATE_KEY_PATH: ${{ runner.temp }}/wechat-ci.key MINIAPP_UPLOAD_RESULT: ${{ gitea.workspace }}/mini/ci-artifacts/upload-result.json MINIAPP_VERSION_LABEL: ${{ gitea.sha }} MINIAPP_UPLOAD_DESC_ITEMS: "3" MINIAPP_UPLOAD_DESC_MAX: "100" run: | test -n "$MINIAPP_APPID" test -n "$MINIAPP_BUILD_NUMBER" test -s ci-artifacts/resolved-version.txt RESOLVED_VERSION="$(tr -d '\n' < ci-artifacts/resolved-version.txt)" # Force upload to the same version that was baked into the JS bundle. export MINIAPP_VERSION_OVERRIDE="$RESOLVED_VERSION" mkdir -p ci-artifacts node -e 'const c=require("./project.config.json"); if(c.appid!==process.env.MINIAPP_APPID){console.error("MINIAPP_APPID mismatch with project.config.json", process.env.MINIAPP_APPID, c.appid); process.exit(1)}' node -e 'const {resolveVersion}=require("./ci/resolve-version.cjs"); console.log("Resolved Mini Program version:", resolveVersion(process.cwd()))' node -e 'const {resolveUploadDesc}=require("./ci/resolve-upload-desc.cjs"); console.log("Resolved upload remark:", resolveUploadDesc({repoRoot:require("path").resolve(".."), versionLabel:process.env.MINIAPP_VERSION_LABEL}))' # Normalize PEM newlines that may be flattened when stored in Secrets. python3 - <<'PY' from pathlib import Path import os key_path = Path(os.environ["WECHAT_CI_PRIVATE_KEY_PATH"]) text = key_path.read_text() if "\\n" in text and "BEGIN" in text: text = text.replace("\\n", "\n") text = text.replace("\r\n", "\n").strip() + "\n" key_path.write_text(text) content = key_path.read_text() assert "BEGIN" in content and "PRIVATE KEY" in content, "WECHAT_CI_PRIVATE_KEY is not a PEM private key" print("private_key_lines=", len(content.splitlines())) PY node ci/upload-ci.cjs test -s ci-artifacts/upload-result.json cat ci-artifacts/upload-result.json - name: Persist upload result on runner host run: | test -s mini/ci-artifacts/upload-result.json test -d /ci-artifacts cp mini/ci-artifacts/upload-result.json "/ci-artifacts/miniapp-upload-${{ gitea.sha }}.json" cp mini/ci-artifacts/upload-result.json /ci-artifacts/miniapp-upload-latest.json ls -la /ci-artifacts/miniapp-upload-latest.json echo "Upload result saved on runner host: /opt/lunar/ci-artifacts/miniapp-upload-latest.json" - name: Send success notification if: success() env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} run: | VERSION="$(tr -d '\n' < mini/ci-artifacts/resolved-version.txt)" chmod +x .gitea/scripts/notify.sh .gitea/scripts/notify.sh success \ "小程序开发版上传成功" \ "版本: ${VERSION}\n上传结果已保存到: /opt/lunar/ci-artifacts/miniapp-upload-latest.json" - name: Send failure notification if: failure() env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} run: | chmod +x .gitea/scripts/notify.sh .gitea/scripts/notify.sh failure \ "小程序开发版上传失败" \ "请检查 Actions 日志了解失败原因" - name: Remove temporary credentials if: always() run: rm -f "$RUNNER_TEMP/wechat-ci.key"