GitLab CI/CD 简介

GitLab CI/CD 是 GitLab 内置的持续集成/持续部署工具,它允许开发者在代码提交后自动执行一系列任务,如构建、测试和部署。通过配置 CI/CD 流程,可以大大提高开发效率,减少人为错误,并确保代码质量。

CI/CD 核心概念

  • 持续集成 (CI): 开发人员频繁地将代码集成到主分支,每次集成都通过自动化构建和测试来验证,从而尽早发现问题。
  • 持续交付 (CD): 确保代码随时可以部署到生产环境,通常包括自动化测试和部署流程。
  • 持续部署 (CD): 将持续交付更进一步,自动将通过测试的代码部署到生产环境。

.gitlab-ci.yml 配置文件

GitLab CI/CD 的核心是 .gitlab-ci.yml 文件,它定义了 CI/CD 流水线的结构和行为。该文件需要放在项目的根目录下。

基本结构

# 定义阶段
stages:
  - build
  - test
  - deploy

# 定义作业
build_job:
  stage: build
  script:
    - echo "Building the app"
    - make build

test_job:
  stage: test
  script:
    - echo "Running tests"
    - make test

deploy_job:
  stage: deploy
  script:
    - echo "Deploying the app"
    - make deploy
  only:
    - master

关键组件

  1. stages: 定义流水线的阶段,按顺序执行。
  2. jobs: 定义在特定阶段执行的任务。
  3. script: 在作业中执行的命令。
  4. only/except: 控制作业何时运行(例如,只在特定分支上运行)。

GitLab Runner

GitLab Runner 是执行 CI/CD 作业的代理,它可以安装在不同的环境中,如 Linux、Windows、macOS 等。

安装 GitLab Runner

# 在 Linux 上安装
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt-get install gitlab-runner

# 在 macOS 上安装
brew install gitlab-runner

注册 Runner

sudo gitlab-runner register

注册过程中,需要提供 GitLab 实例的 URL 和注册令牌,以及 Runner 的标签和执行器类型。

高级配置

环境变量

variables:
  DATABASE_URL: "postgres://postgres:postgres@postgres:5432/my_database"

job_name:
  variables:
    DATABASE_URL: "postgres://postgres:postgres@postgres:5432/my_test_database"
  script:
    - echo $DATABASE_URL

缓存和构件

cache:
  paths:
    - node_modules/

job_name:
  artifacts:
    paths:
      - dist/
    expire_in: 1 week

依赖关系

job_name:
  stage: deploy
  dependencies:
    - build_job
  script:
    - echo "Deploying the app"

实际应用示例

Node.js 项目

image: node:14

stages:
  - build
  - test
  - deploy

cache:
  paths:
    - node_modules/

build:
  stage: build
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/

test:
  stage: test
  script:
    - npm run test

deploy_staging:
  stage: deploy
  script:
    - npm install -g firebase-tools
    - firebase use staging
    - firebase deploy --token $FIREBASE_TOKEN
  only:
    - develop

deploy_production:
  stage: deploy
  script:
    - npm install -g firebase-tools
    - firebase use production
    - firebase deploy --token $FIREBASE_TOKEN
  only:
    - master
  when: manual

Python 项目

image: python:3.9

stages:
  - test
  - deploy

before_script:
  - pip install -r requirements.txt

test:
  stage: test
  script:
    - pytest

deploy:
  stage: deploy
  script:
    - pip install awscli
    - aws s3 sync ./dist s3://my-bucket/
  only:
    - master

CI/CD 最佳实践

  1. 保持流水线简单:只包含必要的步骤,避免过度复杂化。
  2. 使用缓存:缓存依赖项可以显著提高构建速度。
  3. 并行执行:将独立的任务并行执行以节省时间。
  4. 环境变量管理:使用 GitLab 的变量功能安全地存储敏感信息。
  5. 分支策略:为不同的分支配置不同的 CI/CD 行为。

故障排除

常见问题

  1. Runner 无法连接:检查网络设置和 Runner 注册信息。
  2. 构建失败:查看日志以确定失败原因,可能是依赖项问题或脚本错误。
  3. 权限问题:确保 Runner 有足够的权限执行所需操作。

调试技巧

job_name:
  script:
    - set -x  # 启用调试模式
    - env     # 打印环境变量
    - ls -la  # 列出文件

结论

GitLab CI/CD 是一个强大的工具,可以自动化软件开发的各个阶段。通过正确配置 .gitlab-ci.yml 文件,可以实现代码的自动构建、测试和部署,提高开发效率和代码质量。随着对 CI/CD 实践的深入理解,可以进一步优化流水线,使其更加高效和可靠。