温馨提示×

如何利用GitLab进行持续集成

小樊
50
2025-11-22 22:16:47
栏目: 编程语言

使用 GitLab 实现持续集成

一 核心概念与工作机制

  • Pipeline:一次完整的 CI 流程,通常由多个 Stage 组成,响应 PushMerge Request 等事件自动触发。
  • Stage:阶段,如 build → test → deploy,按定义顺序串行执行;任一阶段失败,后续阶段不再执行。
  • Job:阶段内的具体任务,同一阶段的多个 Job 可并行;只有该阶段所有 Job 成功,阶段才算成功。
  • GitLab Runner:真正执行 Job 的代理,可安装在虚拟机、物理机或容器中;分为 共享型(Shared Runner)私有型(Specific Runner),由项目或管理员注册到 GitLab 后使用。

二 快速上手步骤

  1. 在仓库根目录创建 .gitlab-ci.yml,定义 stagesjobsscript
  2. 安装并注册 GitLab Runner(选择合适的 Executor,如 shell、docker)。
  3. 将代码推送到 GitLab,自动触发 Pipeline 并在 UI 查看 作业日志 与结果。
  4. 根据需要在项目 Settings → CI/CD → Variables 配置变量(如密钥、镜像仓库凭据),并在作业中使用。

三 示例 .gitlab-ci.yml

# 示例:Node.js + 缓存 + 产物 + 部署到测试环境
stages:
  - build
  - test
  - deploy

variables:
  NODE_VERSION: "18"
  PRODUCTION: "false"

build_job:
  stage: build
  image: node:$NODE_VERSION
  script:
    - npm ci
    - npm run build --if-present
  artifacts:
    paths:
      - dist/
    expire_in: 1 week
  cache:
    paths:
      - node_modules/

test_job:
  stage: test
  image: node:$NODE_VERSION
  script:
    - npm test -- --ci
  dependencies:
    - build_job

deploy_staging:
  stage: deploy
  image: alpine:latest
  before_script:
    - apk add --no-cache openssh-client rsync
    - mkdir -p ~/.ssh && chmod 700 ~/.ssh
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    - ssh-keyscan -H $STAGING_HOST >> ~/.ssh/known_hosts
  script:
    - rsync -avz --delete -e ssh dist/ $STAGING_USER@$STAGING_HOST:/var/www/myapp/
  environment:
    name: staging
    url: https://staging.example.com
  rules:
    - if: $CI_COMMIT_BRANCH == "main" && $PRODUCTION == "false"

deploy_prod:
  stage: deploy
  image: alpine:latest
  before_script:
    - apk add --no-cache openssh-client rsync
    - mkdir -p ~/.ssh && chmod 700 ~/.ssh
    - echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    - ssh-keyscan -H $PROD_HOST >> ~/.ssh/known_hosts
  script:
    - rsync -avz --delete -e ssh dist/ $PROD_USER@$PROD_HOST:/var/www/myapp/
  environment:
    name: production
    url: https://example.com
  when: manual
  only:
    - main
  • 要点说明:
    • 使用 image 指定执行环境;artifacts 传递构建产物;cache 加速依赖安装。
    • dependencies 显式声明作业依赖,避免重复构建。
    • environment 标记部署目标;rules / only / when: manual 控制触发条件与人工审批。

四 运行与优化要点

  • Runner 选择与隔离:构建密集型任务建议使用独立 Specific RunnerDocker Executor,避免影响 GitLab 服务性能;共享 Runner 适合通用任务。
  • 缓存与产物:对 node_modulesmaven 本地仓库等使用 cache;对编译结果、打包文件使用 artifacts 在阶段间传递。
  • 安全与合规:敏感信息放入 CI/CD Variables(Masked、Protected),必要时使用 HashiCorp Vault 等外部密钥管理;为生产部署配置 manual 审批与受限分支。
  • 可视化与优化:利用 Pipeline 图作业日志性能指标定位瓶颈;合并请求时仅运行必要阶段(如仅 test),通过 rules 精细化触发。
  • 容器化实践:优先使用 Docker 镜像统一环境;需要数据库/缓存依赖时,用 services(如 postgres、redis)在作业中启动配套服务。

五 常见问题排查

  • Pipeline 未触发:检查仓库根目录是否存在 .gitlab-ci.yml,以及项目 Settings → CI/CD → Runners 是否有可用且未 paused 的 Runner,并确认 tags 匹配。
  • Runner 不可用或权限不足:在 Runner 机器确认服务运行(如 systemd 状态)、网络可达 GitLab,注册时选择正确的 Executor 与标签。
  • Job 失败排查:打开 CI/CD → Jobs → 查看日志,关注脚本退出码、环境变量、依赖下载与权限问题;必要时在本地复现命令。
  • 变量未生效或泄露:确认变量作用域(项目/组/实例)、Masked/Protected 配置与分支保护策略;避免在日志中打印密钥。

0