第四章:CI/CD引擎对决——Jenkins、GitLab CI、GitHub Actions、CircleCI、Drone CI,谁是你的菜?

说到CI/CD工具,我见过太多团队一上来就纠结选哪个。其实说白了,没有最好的工具,只有最适合你场景的引擎。今天我就把这五个主流选手拉出来遛遛,结合我这些年踩过的坑,帮你找到最趁手的那把刀。

4.1 Jenkins:老牌霸主,插件生态无人能敌

Jenkins我用了快十年。它最大的特点就是——啥都能干。你想想看,一个社区贡献了超过1800个插件,从代码检查到K8s部署,几乎没有它搞不定的。

核心优势:

  • 插件生态极其丰富,几乎覆盖所有工具链
  • Pipeline as Code(Jenkinsfile)成熟稳定
  • 支持Master/Agent分布式构建
  • 自托管,数据完全可控

但我得提醒你,Jenkins的坑也不少。我曾经在一个项目中,因为插件版本冲突导致整个CI流水线瘫痪了两天。嗯,这里要注意——插件越多,维护成本越高。

避坑指南:我曾经因为Jenkins的Groovy脚本写得太复杂,导致新同事接手时完全看不懂。后来我强制团队用声明式Pipeline,虽然灵活度降低了,但可读性提升了一大截。

// Jenkinsfile 声明式Pipeline示例
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'
            }
        }
        stage('Deploy') {
            steps {
                sh 'kubectl apply -f deployment.yaml'
            }
        }
    }
}

4.2 GitLab CI:一体化DevOps平台的标配

如果你团队已经在用GitLab管理代码,那GitLab CI几乎是零成本接入。我个人习惯把CI配置直接写在仓库里的.gitlab-ci.yml中,这样版本控制、代码审查、CI配置全在一个地方。

我的经验:GitLab CI的Runner可以跑在Kubernetes上,实现动态扩缩容。我在一个日构建量超过500次的项目中,用这个方案把构建等待时间从平均15分钟降到了3分钟以内。

特性 GitLab CI Jenkins
配置方式 YAML文件,仓库内管理 Jenkinsfile或UI配置
Runner管理 自带Runner,支持自动注册 需手动配置Agent
与代码仓库集成 原生集成,无缝衔接 需插件支持
适合场景 中小团队,追求一体化 大型企业,需要高度定制
# .gitlab-ci.yml 示例
stages:
  - build
  - test
  - deploy

build-job:
  stage: build
  script:
    - docker build -t myapp:$CI_COMMIT_SHORT_SHA .
    - docker push myapp:$CI_COMMIT_SHORT_SHA

test-job:
  stage: test
  script:
    - docker run myapp:$CI_COMMIT_SHORT_SHA npm test

deploy-job:
  stage: deploy
  script:
    - kubectl set image deployment/myapp myapp=myapp:$CI_COMMIT_SHORT_SHA
  only:
    - main

4.3 GitHub Actions:开源项目的首选

GitHub Actions这几年发展特别快。如果你项目托管在GitHub上,那它简直就是开箱即用。我特别喜欢它的Marketplace,里面有大量社区贡献的Action,很多常见的操作直接拿来用就行。

为什么推荐它?

  • 免费额度对开源项目非常友好(每月2000分钟)
  • 与GitHub生态深度集成(Issue、PR、Release)
  • 矩阵构建支持多版本测试
  • 自托管Runner可以跑在私有环境

但要注意,GitHub Actions的YAML语法有点啰嗦。我记得第一次写的时候,光是缩进就调了半天。还有,它的调试体验不如Jenkins直观,出错了得靠日志慢慢排查。

# GitHub Actions 工作流示例
name: CI Pipeline
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [14, 16, 18]
    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm ci
    - run: npm test

4.4 CircleCI:速度与简洁的平衡点

CircleCI给我的感觉就是——快。它的缓存机制做得特别好,我见过一个项目用CircleCI后,构建时间从20分钟缩短到了8分钟。而且它的配置文件.circleci/config.yml结构清晰,比GitHub Actions的YAML好读多了。

个人经验:CircleCI的Orb功能很强大,相当于可复用的配置模块。我曾经把一套通用的测试流程封装成Orb,然后在多个项目间共享,维护成本直接砍半。

不过CircleCI也有短板。它的免费额度只有每月6000分钟,对大型项目来说可能不够用。而且它不支持Windows Runner,如果你的项目需要Windows环境,那就得另想办法了。

# .circleci/config.yml 示例
version: 2.1
orbs:
  node: circleci/node@5.0.2

jobs:
  build-and-test:
    docker:
      - image: cimg/node:18.0
    steps:
      - checkout
      - node/install-packages
      - run: npm test
      - run: npm run build

workflows:
  version: 2
  build-test-deploy:
    jobs:
      - build-and-test

4.5 Drone CI:轻量级选手,K8s原生支持

Drone CI是我最近两年比较偏爱的工具。它用Go语言写的,一个二进制文件就能跑起来,资源占用极低。而且它原生支持Kubernetes,每个Pipeline步骤都跑在独立的容器里,隔离性特别好。

Drone CI的亮点:

  • 基于容器,每个步骤都是独立的Pod
  • 配置简单,YAML文件只有几十行
  • 支持多种代码托管平台(GitHub、GitLab、Gitea等)
  • 插件机制灵活,但生态不如Jenkins丰富

但说实话,Drone CI的社区规模还比较小。我曾经想找一个特定的插件,结果发现没有现成的,只能自己写。嗯,如果你团队有Go开发能力,那倒不是问题。

# .drone.yml 示例
kind: pipeline
type: kubernetes
name: default

steps:
- name: build
  image: node:18
  commands:
  - npm ci
  - npm run build

- name: test
  image: node:18
  commands:
  - npm test

- name: deploy
  image: plugins/kubectl
  settings:
    kubernetes_server: https://k8s.example.com
    kubernetes_token:
      from_secret: k8s_token
    template: deployment.yaml

4.6 选型决策指南

说了这么多,到底该怎么选?我根据实际项目经验,给你一个参考框架:

场景 推荐工具 理由
大型企业,已有Jenkins生态 Jenkins 插件丰富,定制能力强
中小团队,使用GitLab GitLab CI 一体化体验,维护成本低
开源项目,托管在GitHub GitHub Actions 免费额度,社区生态好
追求构建速度 CircleCI 缓存机制优秀,并行能力强
K8s原生环境,追求轻量 Drone CI 容器化,资源占用低

最后提醒一句:不要为了用工具而用工具。我曾经见过一个团队,明明只有5个人,非要上Jenkins+全套插件,结果光维护CI就占了一个人力的30%。选工具前,先想清楚你的核心需求是什么。

好了,这五个引擎的特点和适用场景我都讲清楚了。下一章我会深入讲CI/CD流水线的设计模式,包括如何做并行构建、缓存策略、以及如何优雅地处理失败重试。到时候见!