Deploy / deploy (push) Successful in 1m28s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
104 lines
3.9 KiB
YAML
104 lines
3.9 KiB
YAML
# 备用路线。平时 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 <<EOF
|
||
Host deploy-target
|
||
HostName $DEPLOY_HOST
|
||
User $DEPLOY_USER
|
||
Port ${DEPLOY_PORT:-22}
|
||
IdentityFile ~/.ssh/deploy_key
|
||
IdentitiesOnly yes
|
||
# 不预先登记服务器公钥,第一次连接时自动接受
|
||
StrictHostKeyChecking accept-new
|
||
# 认证失败立即报错,不等输入密码
|
||
BatchMode yes
|
||
ConnectTimeout 30
|
||
ServerAliveInterval 30
|
||
EOF
|
||
|
||
- name: 部署(在服务器上拉代码、构建、重启)
|
||
if: steps.check.outputs.configured == 'true'
|
||
run: ssh deploy-target "cd ${{ vars.DEPLOY_DIR || 'IOT_SIM' }} && deploy/update-bg.sh ${{ github.sha }}"
|