# 本地单机 Gitea + runner(DinD)测试环境,仅用于本机可信代码测试。 # 配套笔记:上级目录《Gitea 简单 CI 实践》——让其中的 demo workflow # (runs-on: demo-ci、checkout@v4、Node 22)不依赖云服务器即可本机跑通。 # # ── 使用步骤(命令均从仓库根目录执行;若已 cd 进本目录,可去掉 -f 直接 `docker compose up -d`)── # # 1. 生成并导出注册令牌(只放在当前 shell 里,切勿写进仓库或 .env 文件): # export GITEA_RUNNER_REGISTRATION_TOKEN="$(openssl rand -hex 32)" # Gitea >= 1.23:在 Gitea 首次初始化(完成安装向导)之前设置该变量, # 它会被固定为 runner 注册令牌;实例已初始化后再设置不会改变令牌, # 此时以 管理后台/仓库 → Actions → Runners 页面显示的令牌为准。 # # 2. 启动(首次运行会拉取两个镜像): # docker compose -f note/资源/DevOps/Gitea/local-ci/compose.yaml up -d # # 3. 打开 http://localhost:3000 完成首次安装(数据库保持默认 SQLite 即可)。 # 若 runner 早于安装完成启动,注册会失败并按 restart 策略自动重试, # 安装完成后无需手动干预,稍等即可看到 runner 在线。 # # 4. 注册/登录 → 新建仓库 → 仓库 设置 → Actions 启用; # 按《Gitea 简单 CI 实践》加入 demo.js、demo.test.js 与 # .gitea/workflows/ci.yml。本机 git 克隆/推送走 HTTP 协议: # git clone http://localhost:3000//.git # # 5. 仓库 Actions 页查看 run;需要排查 runner 时: # docker compose -f note/资源/DevOps/Gitea/local-ci/compose.yaml logs runner # # 6. 账号、仓库、runner 注册与镜像缓存在三个命名卷里,保留卷即保留数据; # 彻底重来:docker compose -f note/资源/DevOps/Gitea/local-ci/compose.yaml down -v # # ── 安全提醒 ── # runner 容器 privileged: true(DinD 必需),权限等同宿主 root; # 本文件只用于本机可信仓库的本地测试,勿用于不可信仓库或对外提供服务。 services: gitea: image: docker.gitea.com/gitea:latest restart: unless-stopped environment: # 单机演示固定 SQLite,数据随 gitea-data 卷持久化 GITEA__database__DB_TYPE: sqlite3 # 页面/克隆地址显示为 localhost,方便本机浏览器与 git 客户端 GITEA__server__ROOT_URL: http://localhost:3000/ # 与 runner 用同一个固定注册令牌(含义见文件头第 1 步) GITEA_RUNNER_REGISTRATION_TOKEN: "${GITEA_RUNNER_REGISTRATION_TOKEN:?set GITEA_RUNNER_REGISTRATION_TOKEN}" ports: # 只绑定回环地址,不暴露到局域网;git 走 HTTP,无需映射 SSH 端口 - "127.0.0.1:3000:3000" volumes: - gitea-data:/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/api/healthz"] interval: 10s timeout: 5s retries: 12 start_period: 30s runner: image: docker.io/gitea/runner:3-dind restart: unless-stopped # DinD:job 容器跑在 runner 内部的嵌套 Docker daemon 里,需要 privileged privileged: true depends_on: gitea: condition: service_healthy environment: CONFIG_FILE: /config.yaml # 注册与克隆都发生在 runner 容器自身,它在 compose 网络内可直连 gitea 服务 GITEA_INSTANCE_URL: http://gitea:3000 GITEA_RUNNER_NAME: local-demo # 与 demo workflow 的 runs-on: demo-ci 一致;node:22-bookworm 提供 Node 22 GITEA_RUNNER_LABELS: demo-ci:docker://node:22-bookworm GITEA_RUNNER_REGISTRATION_TOKEN: "${GITEA_RUNNER_REGISTRATION_TOKEN:?set GITEA_RUNNER_REGISTRATION_TOKEN}" volumes: - ./runner-config.yaml:/config.yaml:ro # runner 状态(含 .runner 注册文件) - runner-data:/data # 嵌套 dockerd 的镜像与构建缓存 - runner-docker:/var/lib/docker # DinD 默认给 job 建独立网络;checkout 的 git fetch 会访问 http://gitea:3000, # job 若无法解析 gitea 就会失败,即使 runner 容器能解析也没用。 # runner-config.yaml 设置 container.network: host,使 job 共用 runner 容器的 # 网络命名空间(不是宿主机网络);隔离性随之降低,仅限本地可信测试。 volumes: gitea-data: runner-data: runner-docker: