← 返回首页

CI 指南:给自己的作业仓库装上 gitlab-runner

CI 指南:给自己的作业仓库装上 gitlab-runner

配套:Git 操作指南 · 综合实践项目总览 · 实验 00 / M0 适用对象:想让每次提交都带一份「自动构建/自检日志」的同学。环境示例:Ubuntu 22.04 Server(虚拟机即可)。


1. 为什么值得花这半小时

实在没有条件跑 runner 也不致命:保证 .gitlab-ci.yml 语法合法、本地 bash demo.sh 退出码为 0,并在 report.md 里注明本地自检结果,评审时有对应的降级核验口径。但有真实构建日志的同学,证据链完整度就是高一档。


2. 工作原理一句话

git push → 课程 GitLab 生成 pipeline → 把构建任务(job)派给你自己机器上的 gitlab-runner → runner 执行 .gitlab-ci.yml 里的脚本(装依赖、跑 demo.sh)→ 日志与结果回传 GitLab,显示在 commit、MR 和 Build → Pipelines 页面上。

Runner 装在你自己控制的 Ubuntu 机器上,只接你自己仓库的活。


3. 前置条件


4. 安装 gitlab-runner

两种方式二选一,校园网推荐方式 A(清华镜像)。

方式 A:清华 TUNA 镜像(推荐)

# ① 导入 GitLab 官方 GPG 公钥
curl -L https://packages.gitlab.com/runner/gitlab-runner/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/gitlab-runner.gpg

# ② 写入镜像源(Ubuntu 22.04 的代号是 jammy)
echo "deb [signed-by=/usr/share/keyrings/gitlab-runner.gpg] https://mirrors.tuna.tsinghua.edu.cn/gitlab-runner/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/gitlab-runner.list

# ③ 安装
sudo apt update && sudo apt install -y gitlab-runner

方式 B:官方仓库一键脚本

curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" -o script.deb.sh
less script.deb.sh    # 好习惯:curl 下来的脚本先看内容再执行
sudo bash script.deb.sh
sudo apt install -y gitlab-runner

验证安装:

gitlab-runner --version
sudo gitlab-runner status    # 应显示服务正在运行

5. 在 GitLab 上创建 runner 并拿到令牌

  1. 打开你自己的作业仓库,左侧 Settings → CI/CD → Runners,点 New project runner
  2. 勾选 Run untagged jobs——本课程的 .gitlab-ci.yml 不给 job 打标签(tag),不勾的话 runner 永远接不到活。
  3. 其余保持默认,点 Create runner,页面会给出一枚 glrt- 开头的认证令牌(authentication token)。它只显示这一次,立即保存到本地安全的地方(例如密码管理器),绝不能提交进仓库

如果你看到的是旧版界面(给的是 registration token 而不是上面的新建流程),在 Runners 展开区找到 registration token,下一步注册命令改用 --registration-token 参数。


6. 注册 runner 到你的机器

sudo gitlab-runner register --url https://git.cuc.edu.cn --token glrt-你的令牌

交互提问这样答:

验证:回到 GitLab 的 Runners 页面,你的 runner 前面应是绿色圆点;本机执行 sudo gitlab-runner verify 应输出 is alive


7. 两种执行器(executor)怎么选

docker(推荐) shell(备选)
隔离性 每个 job 一个干净容器,不碰你的系统 直接跑在你的系统上
.gitlab-ci.ymlimage: 字段 生效(python:3.11-slim 被忽略,用本机 python3
额外依赖 需装 Docker:sudo apt install -y docker.io 无(Ubuntu Server 自带 python3)
网络要求 要能拉取容器镜像(慢可配镜像加速器) 只需 pip 装依赖(已走清华镜像,见 §8)

两点说明:


8. 提交 .gitlab-ci.yml

milestone/m0(第一个里程碑分支)就建好这个文件,之后整学期不用改——它调用的是根目录的 demo.sh,而 demo.sh 随里程碑滚动扩充:

# .gitlab-ci.yml —— 每次 push 自动执行 demo.sh 一键自检
stages:
  - validate

variables:
  PIP_DISABLE_PIP_VERSION_CHECK: "1"
  PYTHONUNBUFFERED: "1"
  PIP_INDEX_URL: "https://pypi.tuna.tsinghua.edu.cn/simple"

demo:
  stage: validate
  image: python:3.11-slim        # shell 执行器会忽略本行
  script:
    - python3 -V
    - pip install -r requirements.txt -q
    - bash demo.sh
  rules:
    - if: $CI_COMMIT_BRANCH

shell 执行器的变体(去掉 image:,用 venv 隔离):

demo:
  stage: validate
  script:
    - python3 -m venv .ci-venv
    - .ci-venv/bin/pip install -r requirements.txt -q
    - source .ci-venv/bin/activate && bash demo.sh
  rules:
    - if: $CI_COMMIT_BRANCH

用 venv 变体时,记得把 .ci-venv/ 加进 .gitignore

YAML 的两个常见坑:


9. 验收:让构建日志出现

  1. 随便 push 一个 commit(或 git commit --allow-empty -m "ci: 触发首次 pipeline" 再 push)。
  2. 仓库左侧 Build → Pipelines 应出现一条新记录;点进去能看到完整 job 日志:装依赖、demo.sh 逐里程碑自检、最终退出码 0。
  3. 打开你保持 Open 的 MR——MR 页面现在会显示 pipeline 状态,助教一眼就能看到「这次提交是能跑通的」。
  4. 顺手把最近一次绿色 pipeline 的链接回填到 README.md 的里程碑进度表里。

10. 常见坑

现象 处理
runner 不接活 pipeline 一直 pending 创建 runner 时没勾 Run untagged jobs;到 Settings → CI/CD → Runners 里编辑勾上
令牌丢了 没有地方能找回 令牌只显示一次;删掉旧 runner,按 §5 重建一个即可
pip 超时 job 日志里装依赖失败 确认 .gitlab-ci.yml 里有 PIP_INDEX_URL 清华镜像变量
拉不动容器镜像 docker 执行器卡在 pulling 配置镜像加速器;或 sudo gitlab-runner unregister --name my-ubuntu2204 后改用 shell 执行器重注册
端口被占 第二次跑 demo.sh 失败 demo.sh 里起的服务要用 trap 收尾杀掉,各里程碑用不同端口
想「顺便」在 CI 里扫描外部目标 —— 绝对禁止:实验目标只允许 127.0.0.1,CI 里同样适用(这是课程红线)

11. 安全与诚信边界