温馨提示×

如何在Linux系统中集成GitLab CI/CD

小樊
44
2025-11-14 22:50:23
栏目: 智能运维

在 Linux 上集成 GitLab CI/CD 的完整实践

一 架构与准备

  • 核心概念:用 Pipeline 编排多个 Stage(如 build、test、deploy),每个 JobRunner 上执行;Runner 可自托管(Shell、Docker、Kubernetes 等)。
  • 服务器准备:确保 Linux 主机具备 SSH(22)HTTP/HTTPS(80/443) 可达;如使用自托管 GitLab,需开放相应端口并配置 firewalld/ufw
  • Runner 选择:
    • Shell:直接在本机执行,适合简单场景,但环境一致性依赖运维。
    • Docker:环境隔离、可复用,适合标准化构建与测试。
    • Kubernetes:弹性伸缩,适合大规模与云原生交付。

二 安装与注册 GitLab Runner

  • 安装 Runner(Debian/Ubuntu 示例):
    curl -L --output /etc/apt/trusted.gpg.d/gitlab.asc https://packages.gitlab.com/install/repositories/runner/gitlab-runner/gpgkey
    echo "deb https://packages.gitlab.com/runner/gitlab-runner/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gitlab-runner.list
    sudo apt-get update && sudo apt-get install -y gitlab-runner
    sudo systemctl enable --now gitlab-runner
    
  • 注册 Runner(交互式,按提示填写):
    sudo gitlab-runner register
    # 依次输入:GitLab 实例地址(如 https://gitlab.com 或自托管地址)
    #         注册令牌(项目/群组 Settings > CI/CD > Runners 获取)
    #         描述、标签(如 ci,deploy)
    #         执行器(shell 或 docker)
    #         如选 docker:默认镜像(如 alpine:latest)
    
  • 常用注册参数(非交互一键示例):
    sudo gitlab-runner register \
      --url https://gitlab.com/ \
      --registration-token YOUR_TOKEN \
      --executor shell \
      --description "linux-shell-runner" \
      --tag-list "ci,deploy" \
      --run-untagged=false \
      --locked=false
    
  • 验证:在 GitLab 项目 Settings > CI/CD > Runners 看到 Runner 在线且标签匹配。

三 编写 .gitlab-ci.yml 与触发流水线

  • 最小可用示例(Node.js + 制品与缓存):
    stages:
      - build
      - test
      - deploy
    
    variables:
      NODE_VERSION: "18"
    
    cache:
      paths:
        - node_modules/
      key: ${CI_COMMIT_REF_SLUG}  # 按分支缓存依赖
    
    build_job:
      stage: build
      image: node:${NODE_VERSION}
      script:
        - npm ci
        - npm run build --if-present
      artifacts:
        paths:
          - dist/
        expire_in: 1 hour
    
    test_job:
      stage: test
      image: node:${NODE_VERSION}
      script:
        - npm test -- --ci
    
    deploy_job:
      stage: deploy
      image: alpine:latest
      before_script:
        - apk add --no-cache openssh-client rsync
        - mkdir -p ~/.ssh
        - echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
        - chmod 600 ~/.ssh/id_rsa
        - ssh-keyscan -H $DEPLOY_HOST >> ~/.ssh/known_hosts
      script:
        - rsync -avz --delete dist/ $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH
      only:
        - main
    
  • 触发与查看:将 .gitlab-ci.yml 提交到仓库后,每次 git push 都会触发流水线;在 CI/CD > Pipelines 查看作业状态与日志。

四 安全与网络配置要点

  • 敏感信息管理:在 Settings > CI/CD > Variables 添加如 SSH_PRIVATE_KEY、DEPLOY_HOST、DEPLOY_USER、DEPLOY_PATH 等变量,勾选 Masked 与(必要时)Protected,在脚本中通过 $VAR 引用。
  • Runner 安全:
    • 使用 Shell 执行器时,Runner 运行用户权限应最小化;必要时用 sudo 精细化授权。
    • 使用 Docker 执行器时,优先采用官方/可信镜像,避免在生产 Runner 上启用 privileged,按需配置 volumesservices
  • 防火墙与端口:开放 22/80/443;如使用自托管 GitLab,确保外部 URL 可达并配置 HTTPS/证书

五 进阶与常见问题

  • 使用 Docker 构建与推送镜像(示例片段):
    build_image:
      stage: build
      image: docker:24.0
      services:
        - docker:24.0-dind
      variables:
        DOCKER_HOST: tcp://docker:2375
        IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
      script:
        - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
        - docker build -t $IMAGE_TAG .
        - docker push $IMAGE_TAG
    
  • 性能优化:合理使用 cacheartifacts;按 stage 拆分耗时任务,必要时并行化;为常用命令准备轻量基础镜像。
  • 通知与质量门禁:集成 Slack/邮件/Webhook;在关键 Job 设置 when: on_failure 告警;结合 only/exceptrules 控制部署分支与触发条件。
  • 常见问题排查:Runner 离线检查 注册令牌/标签匹配/网络连通性;Job 失败优先查看 CI/CD 日志Runner 日志(journalctl -u gitlab-runner);SSH 部署失败核对 known_hosts 与权限。

0