# 备用路线。平时 push origin(git.xuyue.cc)后,由开发机上的 gitea-runner 测试、编好、部署(.gitea/workflows/deploy.yml), # 这里 push 不再触发,免得每次推送在两边各测一遍、各部署一遍。 # - PR:只跑测试。 # - 手动触发(Actions → CI/CD → Run workflow):测试通过后 SSH 到服务器执行 deploy/update.sh,服务器从 origin 拉代码、 # **自己编**、重启。开发机不在、又急着上线时用。部署需要的 Secrets 见 deploy/README.md 的"自动部署"一节。 # 只在 github.com 上运行(Gitea 有了 .gitea/workflows 后不再读这个目录,if 再保一道)。 name: CI/CD on: pull_request: workflow_dispatch: jobs: test: if: github.server_url == 'https://github.com' runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v7 - uses: oven-sh/setup-bun@v2 with: bun-version: 1.4.4 - uses: actions/setup-dotnet@v6 with: dotnet-version: 10.0.x # 测试里学生程序在 bubblewrap 沙箱中运行;Ubuntu 24.04 默认禁止非特权用户命名空间,要先放开 - name: 准备沙箱 run: | sudo apt-get update -q sudo apt-get install -y -q bubblewrap sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 - run: bun install --frozen-lockfile - name: 编译 C# 运行时 run: bun run build:runtime # 文件之间同时跑,grading 里的测试也同时跑(describe.concurrent),见 .gitea/workflows/deploy.yml 同名一步 - name: 服务端测试(编译并运行示例、沙箱、编译检查) working-directory: server run: bun test --parallel --max-concurrency=8 - name: 网页端测试和类型检查 working-directory: web run: | bun test src bunx vue-tsc --noEmit deploy: needs: test if: github.server_url == 'https://github.com' && github.event_name == 'workflow_dispatch' runs-on: ubuntu-24.04 # 服务器构建约几分钟;卡住时及时失败,不要一直占着 timeout-minutes: 20 # 连续推送时排队部署,不会两次部署同时进行 concurrency: group: deploy cancel-in-progress: false environment: production steps: # Secrets 还没配置时跳过部署(只跑测试),不算失败 - name: 检查部署配置 id: check env: DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} run: | if [ -n "$DEPLOY_HOST" ]; then echo "configured=true" >> "$GITHUB_OUTPUT" else echo "::notice::没有配置 DEPLOY_HOST 等 Secrets,跳过部署(配置方法见 deploy/README.md)" fi - name: 配置 SSH if: steps.check.outputs.configured == 'true' env: SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} DEPLOY_USER: ${{ secrets.DEPLOY_USER }} DEPLOY_PORT: ${{ secrets.DEPLOY_PORT }} run: | mkdir -p ~/.ssh && chmod 700 ~/.ssh printf '%s\n' "$SSH_KEY" > ~/.ssh/deploy_key chmod 600 ~/.ssh/deploy_key cat > ~/.ssh/config <