From f51a3ac7508cff158c87bfb738c49f0e96834dce Mon Sep 17 00:00:00 2001 From: zjk <1553836110@qq.com> Date: Fri, 14 Aug 2026 17:59:25 +0800 Subject: [PATCH] =?UTF-8?q?CI=EF=BC=9A=E7=A7=BB=E9=99=A4=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=EF=BC=8C=E6=94=B9=E4=B8=BA=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E4=BA=8C=E8=BF=9B=E5=88=B6=E5=88=B0=20Gitea=20Releases?= =?UTF-8?q?=EF=BC=88v*=20tag=20=E5=BB=BA=E7=89=88=E6=9C=AC=E5=8F=B7=20Rele?= =?UTF-8?q?ase=EF=BC=8Cmain=20push=20=E6=9B=B4=E6=96=B0=20latest=20?= =?UTF-8?q?=E9=A2=84=E5=8F=91=E5=B8=83=EF=BC=89=EF=BC=8CREADME=20=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=8F=91=E5=B8=83=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 108 +++++++++++++++++++++++++++++++++------- README.md | 29 +++++++++++ 2 files changed, 118 insertions(+), 19 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index bd15d8a..02a9958 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -2,7 +2,9 @@ # FILE: .gitea/workflows/ci.yml # DESC: CI/CD for H100PowerManger # - build/test on aarch64 (QEMU emulation of arm64 Ubuntu 20.04) -# - deploy the cross-built binary to the RK3588 board +# - publish compiled binary to Gitea Releases (manual deploy) +# * tag push v* -> versioned Release +# * main push -> rolling "latest" Release (pre-release / test) # Self-contained (no external actions). The runner is an Alpine # container with the host Docker socket mounted; we install the # docker CLI at runtime. @@ -40,7 +42,7 @@ jobs: #------------------------------------------------------------------- - name: Install tools run: | - apk add --no-cache docker-cli docker-cli-buildx rsync openssh-client + apk add --no-cache docker-cli docker-cli-buildx rsync openssh-client curl jq - name: Verify docker run: | @@ -127,24 +129,92 @@ jobs: fi #------------------------------------------------------------------- - # Deploy the cross-built binary to the RK3588 board (push only) + # Publish the aarch64 binary to Gitea Releases (manual deployment) + # * tag push (v*) -> versioned Release (e.g. v1.0.0, stable) + # * main push -> rolling "latest" Release (pre-release/test) + # Only runs when build + tests succeeded. #------------------------------------------------------------------- - - name: Deploy to board - if: vars.DEPLOY_ENABLED == 'true' + - name: Publish release + if: success() && startsWith(github.ref, 'refs/tags/v') env: - DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} - DEPLOY_USER: ${{ vars.DEPLOY_USER }} - DEPLOY_PATH: ${{ vars.DEPLOY_PATH }} - DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} + RELEASE_TOKEN: ${{ secrets.CI_TOKEN }} run: | set -euo pipefail - USER="${DEPLOY_USER:-root}" - HOST="${DEPLOY_HOST:?DEPLOY_HOST secret not set}" - DEST="${DEPLOY_PATH:-/root/work/moos_ws/moos-ivp-extend/bin}" - mkdir -p ~/.ssh && chmod 700 ~/.ssh - printf '%s\n' "$DEPLOY_SSH_KEY" > ~/.ssh/id_ed25519 - chmod 600 ~/.ssh/id_ed25519 - ssh-keyscan -H "$HOST" >> ~/.ssh/known_hosts 2>/dev/null - chmod 755 bin/pPowerManger - rsync -avz bin/pPowerManger "${USER}@${HOST}:${DEST}/pPowerManger" - echo "Deployed pPowerManger -> ${USER}@${HOST}:${DEST}/" + REPO="${{ github.repository }}" + API="https://gitea2.zhaojingkui.xyz/api/v1/repos/${REPO}" + TAG="${GITHUB_REF#refs/tags/}" + COMMIT_SHORT="$(git rev-parse --short HEAD)" + REPORT_URL="https://gitea2.zhaojingkui.xyz/${REPO}/src/branch/test-reports/test-report.md" + BODY="pPowerManger (aarch64 / RK3588 / Ubuntu 20.04) + + - Commit: \`${COMMIT_SHORT}\` + - 时间: $(date -u +'%Y-%m-%d %H:%M:%S UTC') + - 测试报告: [${REPORT_URL}](${REPORT_URL}) + + 手动部署: 下载后 scp/rsync 到板卡: + \`\`\` + rsync -avz pPowerManger root@192.168.0.223:/root/work/moos_ws/moos-ivp-extend/bin/pPowerManger + \`\`\`" + + echo ">>> 创建版本号 Release: ${TAG}" + RELEASE_JSON=$(curl -sS -X POST -H "Authorization: token ${RELEASE_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\":\"${TAG}\",\"name\":\"${TAG}\",\"body\":$(jq -Rn --arg b "${BODY}" '$b'),\"prerelease\":false}" \ + "${API}/releases") + echo "${RELEASE_JSON}" | jq -e .id >/dev/null || { echo "创建 Release 失败:"; echo "${RELEASE_JSON}"; exit 1; } + RELEASE_ID=$(echo "${RELEASE_JSON}" | jq -r .id) + echo ">>> 上传 pPowerManger (release id=${RELEASE_ID})" + curl -sS -X POST -H "Authorization: token ${RELEASE_TOKEN}" \ + -F "attachment=@bin/pPowerManger" \ + "${API}/releases/${RELEASE_ID}/assets?name=pPowerManger" \ + | jq -e .id >/dev/null || { echo "上传失败"; exit 1; } + echo ">>> 发布完成: https://gitea2.zhaojingkui.xyz/${REPO}/releases/tag/${TAG}" + + - name: Publish latest release + if: success() && github.ref == 'refs/heads/main' + env: + RELEASE_TOKEN: ${{ secrets.CI_TOKEN }} + run: | + set -euo pipefail + REPO="${{ github.repository }}" + API="https://gitea2.zhaojingkui.xyz/api/v1/repos/${REPO}" + TAG="latest" + COMMIT_SHORT="$(git rev-parse --short HEAD)" + REPORT_URL="https://gitea2.zhaojingkui.xyz/${REPO}/src/branch/test-reports/test-report.md" + BODY="pPowerManger (aarch64 / RK3588 / Ubuntu 20.04) — 测试用最新构建 + + - Commit: \`${COMMIT_SHORT}\` + - 时间: $(date -u +'%Y-%m-%d %H:%M:%S UTC') + - 测试报告: [${REPORT_URL}](${REPORT_URL}) + + 手动部署: 下载后 scp/rsync 到板卡: + \`\`\` + rsync -avz pPowerManger root@192.168.0.223:/root/work/moos_ws/moos-ivp-extend/bin/pPowerManger + \`\`\`" + + # 1. move the "latest" tag to current commit + echo ">>> 移动 latest tag 到 ${COMMIT_SHORT}" + git tag -f "${TAG}" HEAD + git push -f origin "${TAG}" || true + + # 2. delete old "latest" release (by tag), ignore if none + echo ">>> 删除旧的 latest Release (如有)" + curl -sS -X DELETE -H "Authorization: token ${RELEASE_TOKEN}" \ + "${API}/releases/tags/${TAG}" || true + + # 3. create new "latest" release (pre-release) + echo ">>> 创建 latest Release (pre-release)" + RELEASE_JSON=$(curl -sS -X POST -H "Authorization: token ${RELEASE_TOKEN}" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\":\"${TAG}\",\"name\":\"latest (测试)\",\"body\":$(jq -Rn --arg b "${BODY}" '$b'),\"prerelease\":true}" \ + "${API}/releases") + echo "${RELEASE_JSON}" | jq -e .id >/dev/null || { echo "创建 latest Release 失败:"; echo "${RELEASE_JSON}"; exit 1; } + RELEASE_ID=$(echo "${RELEASE_JSON}" | jq -r .id) + + # 4. upload pPowerManger + echo ">>> 上传 pPowerManger (release id=${RELEASE_ID})" + curl -sS -X POST -H "Authorization: token ${RELEASE_TOKEN}" \ + -F "attachment=@bin/pPowerManger" \ + "${API}/releases/${RELEASE_ID}/assets?name=pPowerManger" \ + | jq -e .id >/dev/null || { echo "上传失败"; exit 1; } + echo ">>> 发布完成: https://gitea2.zhaojingkui.xyz/${REPO}/releases/tag/${TAG}" diff --git a/README.md b/README.md index 9e71ce8..979cd16 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,32 @@ H100 能源管理程序 - [最新测试报告 (Markdown)](https://gitea2.zhaojingkui.xyz/zjk/H100PowerManger/src/branch/test-reports/test-report.md) - [JUnit XML](https://gitea2.zhaojingkui.xyz/zjk/H100PowerManger/raw/branch/test-reports/junit.xml) + +## 构建产物(Gitea Releases,手动部署) + +CI 构建的 aarch64 二进制(RK3588 / Ubuntu 20.04)会发布到 Gitea Releases,供手动下载部署: + +- **版本号 Release**:推送 `v*` tag(如 `v1.0.0`)时创建,正式版 + → `https://gitea2.zhaojingkui.xyz/zjk/H100PowerManger/releases/tag/v1.0.0` +- **latest Release(测试)**:每次 `main` push 时更新,标记为预发布(测试用) + → `https://gitea2.zhaojingkui.xyz/zjk/H100PowerManger/releases/tag/latest` + +### 发布流程(CI 自动执行,仅测试通过后发布) + +`Publish release` / `Publish latest release` 步骤(`if: success()`,即构建 + 测试全部通过才发布)用 `${{ secrets.CI_TOKEN }}` 调 Gitea API 完成: + +1. **创建 Release**:`POST /releases` +2. **删除旧 latest**(仅 latest):`DELETE /releases/tags/latest` +3. **上传附件**:`POST /releases/{id}/assets?name=pPowerManger`(multipart 字段 `attachment`) +4. **按 `github.ref` 分支处理**: + - `refs/tags/v*` → 直接为该 tag 创建版本号 Release + - `refs/heads/main` → `git tag -f latest && git push -f origin latest`,删除旧 latest Release,重建为 prerelease,再上传二进制 +5. **Release body** 自动带上:commit / 时间 / 测试报告链接 / 手动部署命令 + +### 手动部署到板卡 + +从 Releases 页面下载 `pPowerManger` 后,手动推送到板卡(仅推送,不自动重启): + +```bash +rsync -avz pPowerManger root@192.168.0.223:/root/work/moos_ws/moos-ivp-extend/bin/pPowerManger +```