From e78a2476120211150e89753dd75af9b51578b97c Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 2 Oct 2026 13:37:48 +0800 Subject: [PATCH] Deploy controller persistently on control host --- .gitea/workflows/ci.yaml | 7 +++++++ .gitea/workflows/manage.yaml | 12 +++++------- README.md | 20 ++++++++++++++++++++ scripts/ces-controller | 4 ++++ scripts/install-controller.sh | 24 ++++++++++++++++++++++++ 5 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 scripts/ces-controller create mode 100644 scripts/install-controller.sh diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 6ec2c72..814e300 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -22,6 +22,13 @@ jobs: run: | python3 -m py_compile controller.py python3 -m unittest discover -s tests -v + sh -n scripts/install-controller.sh scripts/ces-controller + + - name: Deploy verified controller + run: | + sh scripts/install-controller.sh "$GITHUB_SHA" + test "$(cat /opt/ces-controller/current/VERSION)" = "$GITHUB_SHA" + /usr/local/bin/ces-controller --help >/dev/null - name: Confirm no paid action ran run: | diff --git a/.gitea/workflows/manage.yaml b/.gitea/workflows/manage.yaml index 651dd28..b9dfb12 100644 --- a/.gitea/workflows/manage.yaml +++ b/.gitea/workflows/manage.yaml @@ -23,17 +23,15 @@ jobs: env: AUTODL_API_TOKEN: ${{ secrets.AUTODL_API_TOKEN }} TRAINING_RUNNER_REGISTRATION_TOKEN: ${{ secrets.TRAINING_RUNNER_REGISTRATION_TOKEN }} - GITEA_JOB_TOKEN: ${{ secrets.GITEA_TOKEN }} OPERATION: ${{ inputs.operation }} IMAGE_UUID: ${{ inputs.image_uuid }} CONFIRM_SPEND: ${{ inputs.confirm_spend }} steps: - - name: Checkout controller source + - name: Select deployed controller run: | - git init . - git remote add origin "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY.git" - git -c http.extraHeader="Authorization: token $GITEA_JOB_TOKEN" fetch --depth 1 origin "$GITHUB_SHA" - git checkout --detach FETCH_HEAD + test -x /usr/local/bin/ces-controller + test "$(cat /opt/ces-controller/current/VERSION)" = "$GITHUB_SHA" + echo "controller_version=$GITHUB_SHA" - name: Validate requested operation run: | @@ -44,7 +42,7 @@ jobs: - name: Manage AutoDL Pro instance run: | - python3 controller.py "$OPERATION" \ + /usr/local/bin/ces-controller "$OPERATION" \ --image-uuid "$IMAGE_UUID" \ --confirm-spend "$CONFIRM_SPEND" diff --git a/README.md b/README.md index ef52e5e..29200c3 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,26 @@ AutoDL GPU Runner 的 `TRAINING_RUNNER_REGISTRATION_TOKEN`。 Runner online 后,第一次 push 只执行 `Controller CI`,不会创建实例或产生 AutoDL 费用。 +## 阿里云长期部署 + +每次 push 到 `main` 后,`Controller CI` 会先运行测试,再把通过验证的控制器安装到: + +```text +/opt/ces-controller/releases// +``` + +`/opt/ces-controller/current` 原子指向当前版本,并安装 Terminal 入口 +`/usr/local/bin/ces-controller`。管理 workflow 只执行这个长期部署的版本,并拒绝执行与当前 +workflow commit 不一致的旧版本。部署目录不保存 AutoDL Token 或 Runner Registration Token; +Secret 仍只在单次 Actions 任务中注入。 + +通过 SSH 可以检查版本或查看帮助: + +```bash +cat /opt/ces-controller/current/VERSION +ces-controller --help +``` + ## 管理 workflow 从 Actions 手动运行 `Manage AutoDL GPU runner`: diff --git a/scripts/ces-controller b/scripts/ces-controller new file mode 100644 index 0000000..819c244 --- /dev/null +++ b/scripts/ces-controller @@ -0,0 +1,4 @@ +#!/bin/sh +set -eu + +exec python3 /opt/ces-controller/current/controller.py "$@" diff --git a/scripts/install-controller.sh b/scripts/install-controller.sh new file mode 100644 index 0000000..7bbe41d --- /dev/null +++ b/scripts/install-controller.sh @@ -0,0 +1,24 @@ +#!/bin/sh +set -eu + +if [ "$#" -ne 1 ] || [ -z "$1" ]; then + echo "usage: $0 GIT_COMMIT" >&2 + exit 2 +fi + +commit=$1 +root=/opt/ces-controller +release="$root/releases/$commit" +temporary_link="$root/.current.$$" + +install -d -m 700 "$root" "$root/releases" "$release" +install -m 700 controller.py "$release/controller.py" +install -m 600 README.md "$release/README.md" +printf '%s\n' "$commit" > "$release/VERSION" +chmod 600 "$release/VERSION" + +ln -s "$release" "$temporary_link" +mv -Tf "$temporary_link" "$root/current" +install -m 755 scripts/ces-controller /usr/local/bin/ces-controller + +echo "deployed_controller=$commit"