Files
matrix/.gitea
Matrix Music Bot Dev a22d9578fb
build-and-push-image / build-push (push) Has been cancelled
build-and-push-image / vulnerability-scan (push) Has been cancelled
ci(perf): runner 本地预拉 action 镜像加速 Set up job
问题:workflow "Set up job" 步骤非常缓慢
根因:每个 GitHub Actions step 都是 Docker 容器,需从 Docker Hub 拉镜像
      国内网络拉 Docker Hub 特别慢(甚至失败)

解决方案:
  scripts/prepull-actions.sh
    - 列出 build-image.yml 用到的所有 Docker 镜像
    - xargs -P 4 并行拉取
    - 提供验证命令 + cron 清理建议

更新 workflow 用的镜像列表:
  - docker/actions/setup-buildx:v3
  - docker/actions/login:v3
  - docker/actions/metadata:v5
  - docker/actions/build-push:v5
  - aquasec/trivy-action:master
  - moby/buildkit:v0.13.0

非 Docker action(actions/checkout / dtolnay/rust-toolchain / Swatinem/rust-cache)
是内置脚本,不需预拉。

README 新增"性能优化"章节:
  - 根因分析
  - 使用步骤
  - 清理策略 cron
  - 进一步优化建议(BuildKit cache / cargo 缓存 / 多架构)

使用方法:
  chmod +x scripts/prepull-actions.sh
  sudo ./scripts/prepull-actions.sh
2026-07-03 00:33:49 +08:00
..

Gitea Actions CI/CD 部署指南

本目录包含 Gitea Actions 工作流配置,用于自动构建并推送 Docker 镜像到 Gitea Container Registry。

当前工作流

build-image.yml

  • 触发条件push 到 master / main 分支(排除 tag 推送)
  • 目标架构linux/amd64
  • 镜像标签
    • latestlatest 镜像)
    • <sha>commit 短哈希,便于回溯)
  • 目标 RegistryGitea 内置 Container Registry
    • URLhttp://192.168.6.200:3080/1076code/matrix/packages/container/matrix-music-bot
  • 构建方式docker buildx + BuildKit 缓存(推到 registry 作为 :buildcache 镜像层)
  • 安全扫描:自动跑 Trivy 扫描 CRITICAL/HIGH 漏洞(不阻塞流程)

镜像使用

构建完成后,可通过以下方式拉取:

# 拉取最新
docker pull http://192.168.6.200:3080/1076code/matrix/packages/container/matrix-music-bot:latest

# 拉取特定 commit
docker pull http://192.168.6.200:3080/1076code/matrix/packages/container/matrix-music-bot:abc1234

# 运行(用 docker-compose 简化环境变量管理)
MATRIX_BOT_SECRET_PASSPHRASE="..." docker-compose up -d

或在 docker-compose.yml 中直接引用:

services:
  matrix-music-bot:
    image: 192.168.6.200:3080/1076code/matrix/packages/container/matrix-music-bot:latest
    # 移除 build: 段,改用 image 拉取
    # ... 其他配置不变

Gitea 实例前置要求

  1. Container Registry 已开启

    • Gitea 管理后台 → packages → 启用 Container Registry
    • 配置域名(与 Gitea 主站一致即可)
  2. 注册 Actions Runner

    • Gitea 管理后台 → Actions → Runners → Create new runner

    • 在 runner 机器上执行:

      # Gitea Actions Runner 安装(参考 https://docs.gitea.com/usage/actions/act-runner
      # 1. 下载 act_runner 二进制
      curl -O https://dl.gitea.com/act_runner/0.2.11/act_runner-0.2.11-linux-amd64
      chmod +x act_runner-0.2.11-linux-amd64
      mv act_runner-0.2.11-linux-amd64 /usr/local/bin/act_runner
      
      # 2. 注册 runner(用 Gitea UI 提供的注册 token;标签要记好!)
      act_runner register \
          --instance http://192.168.6.200:3080 \
          --token <RUNNER_REGISTRATION_TOKEN> \
          --labels ubuntu-22.04      # ← 必须与 workflow 中 runs-on 一致
      
      # 3. 启动 runner(前台或 daemon
      act_runner daemon
      
    • 重要--labels 指定的标签必须与 workflow 中 runs-on 完全一致

    • 本项目 Gitea 实例现有 runnerhermes-runner,标签 ubuntu-22.04(全局)

    • Runner 必须有 docker buildx 可用(Docker 20.10+

  3. 网络可达性

    • Runner 能访问 crates.io(或 rsproxy.cn 镜像)下载 Rust crates
    • Runner 能访问 GitHub 拉取 actions/checkout 等 actions
    • Runner 能访问 Gitea Container Registry(通常同主机 / 同网络)

工作流调整指南

添加 tag 触发的版本镜像

build-image.yml 顶部加:

on:
  push:
    branches: [master, main]
    tags: ['v*']   # ← 新增:tag 推送触发
  tags-ignore: ''   # 取消排除

# 然后在 metadata-action 的 tags 加:
#   type=semver,pattern={{version}}
#   type=semver,pattern={{major}}.{{minor}}
#   type=semver,pattern={{major}}

启用多架构镜像

修改:

env:
  PLATFORM: linux/amd64,linux/arm64

jobs:
  build:
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

添加推送后自动部署

deploy:
  needs: build
  runs-on: ubuntu-latest
  if: gitea.ref == 'refs/heads/master'
  steps:
    - name: SSH to production
      uses: appleboy/ssh-action@v1
      with:
        host: ${{ secrets.PROD_HOST }}
        username: ${{ secrets.PROD_USER }}
        key: ${{ secrets.PROD_SSH_KEY }}
        script: |
          cd /opt/matrix-music-bot
          MATRIX_BOT_SECRET_PASSPHRASE=$(cat ~/.matrix-bot-passphrase) \
            docker-compose pull && docker-compose up -d

添加 PR 检查(不推送)

新增 job

pr-check:
  if: gitea.event_name == 'pull_request'
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v4
    - uses: docker/setup-buildx-action@v3
    - uses: docker/build-push-action@v5
      with:
        context: .
        push: false  # 不推送,只构建验证

性能优化

"Set up job" 步骤慢的优化

根因:每个 GitHub Actions step 都是个 Docker 容器,需从 Docker Hub ghcr.io / docker.io)拉取镜像。runner 首次运行会卡在拉镜像上,国内网络下尤甚。

解决方案 ARunner 本地预拉 action 镜像

# 在 runner 主机上跑一次(脚本随仓库发布)
sudo ./scripts/prepull-actions.sh

# 验证缓存命中
docker images | grep -E "(docker/actions|aquasec/trivy-action|moby/buildkit)"

脚本会拉取 build-image.yml 用到的所有 Docker 镜像(并行 4 路)。

建议节奏

  • runner 初始化时:跑一次
  • 新增 action 时:跑一次
  • 定期清理悬空镜像:
# /etc/cron.d/docker-prune
0 3 * * 0  root  docker image prune -f --filter "until=168h"

预期效果

  • 首次运行:Set up job 仍慢(冷启动)
  • 后续运行:Set up job 仅 5-10 秒(仅做 job 调度,不再拉镜像)

构建性能进一步优化

如构建仍是瓶颈(>10 分钟),可叠加:

  • BuildKit registry cache(已启用):docker.io/yourorg/matrix-music-bot:buildcache
  • Cargo 缓存:在 Dockerfile 中加 RUN cargo build --release 复用 target/
  • 多架构(如需要):PLATFORM: linux/amd64,linux/arm64CI 时间约翻倍)

故障排查

Workflow 触发不了

检查:

  • .gitea/workflows/ 目录权限(应为 755
  • workflow 文件名后缀必须是 .yml.yaml
  • 仓库设置 → Actions → Workflows 状态为启用

docker/login-action 失败

  • 确认 Gitea 已开启 Container Registry
  • 检查 gitea.actor / gitea.token 是否有 packages 写权限
  • Registry URL 必须包含 scheme(如 http://...,不能用裸 hostname

docker/build-push-action 构建失败

  • 检查 Dockerfile 路径(默认 ./Dockerfile
  • 检查 BuildKit 是否启用(Buildx 默认启用)
  • 国内环境:考虑加 RUN cargo config set source.crates-io.replace-with ...

镜像推送后无法 docker pull

  • Registry 是 HTTP(非 HTTPS):客户端需加 --insecure-registry 或配置 daemon.json
  • 或用 Gitea 的 HTTPS 反向代理

相关文档