4、持续集成(CI)基础:Jenkins Pipeline入门、GitHub Actions配置、GitLab CI/CD、多平台构建

持续集成,说白了就是让代码每次提交后自动跑一遍构建和测试。我见过太多团队还在手动编译、手动部署,出问题了才拍大腿。嗯,这一章我们就把四个主流CI工具掰开揉碎讲清楚。

4.1 Jenkins Pipeline:老牌工具依然能打

Jenkins虽然界面看着有点年代感,但Pipeline能力是真的强。我个人习惯用声明式Pipeline,结构清晰,团队协作起来也方便。

核心概念:Pipeline = 流水线,Stage = 阶段,Step = 步骤

先看一个最简单的例子:

pipeline {
    agent any
    stages {
        stage('拉取代码') {
            steps {
                git 'https://github.com/example/my-app.git'
            }
        }
        stage('编译') {
            steps {
                sh 'mvn clean package'
            }
        }
        stage('测试') {
            steps {
                sh 'mvn test'
            }
        }
    }
}

我在项目中遇到过一个问题:Pipeline写得太长,几百行挤在一个Jenkinsfile里。后来我拆成了多个共享库,每个库负责一个独立功能。你想想看,维护起来是不是轻松多了?

我的建议:把常用的构建逻辑封装成Shared Library,团队直接引用就行。比如Docker构建、K8s部署这些,写一次到处用。

4.2 GitHub Actions:云原生时代的宠儿

GitHub Actions的好处是跟仓库深度集成。你不需要额外搭建CI服务器,直接在仓库里写YAML就行。

为什么会这么流行?说白了就是零运维。我刚开始用的时候还有点怀疑,后来发现真香。

一个典型的Node.js CI配置:

name: Node.js CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: 使用Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
    - run: npm ci
    - run: npm test
    - run: npm run build

避坑指南:我曾经在GitHub Actions里直接写死密钥,结果被扫描到后仓库被锁了。记住,敏感信息一定要用Secrets,别偷懒。

GitHub Actions的Marketplace里有很多现成的Action,比如部署到AWS、发送Slack通知。我个人习惯先搜一下有没有现成的,没有才自己写。

4.3 GitLab CI/CD:一体化DevOps平台

GitLab CI/CD跟GitLab仓库深度绑定,从代码管理到CI/CD到容器镜像仓库,全在一个平台里。我建议团队如果用了GitLab,就别折腾其他CI工具了。

它的核心是.gitlab-ci.yml文件,放在项目根目录:

stages:
  - build
  - test
  - deploy

build-job:
  stage: build
  script:
    - echo "编译代码"
    - mvn clean package
  artifacts:
    paths:
      - target/*.jar

test-job:
  stage: test
  script:
    - echo "运行测试"
    - mvn test

deploy-job:
  stage: deploy
  script:
    - echo "部署到服务器"
  only:
    - main

你想想看,一个文件搞定所有流程,是不是很清爽?我在项目中遇到过团队把CI配置写得特别复杂,各种include嵌套。后来我定了个规矩:不超过3层嵌套,超过就拆成独立项目。

关键点:GitLab Runner可以部署在Kubernetes上,实现动态扩缩容。构建任务多的时候自动加Pod,任务结束自动回收,省钱又省心。

4.4 多平台构建:一次编写,到处运行

现在的项目很少只跑在一个平台上。我见过最夸张的一个项目,要同时构建Linux、Windows、macOS三个平台的二进制文件。手动搞?累死你。

多平台构建的核心思路:用矩阵构建(Matrix Build)

在GitHub Actions里这样写:

jobs:
  build:
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        node: [16, 18, 20]
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node }}
    - run: npm ci
    - run: npm test

这段代码会生成9个构建任务(3个操作系统 × 3个Node版本)。并行跑,效率拉满。

Jenkins里用matrix指令:

pipeline {
    agent none
    stages {
        stage('多平台构建') {
            matrix {
                axes {
                    axis {
                        name 'PLATFORM'
                        values 'linux', 'windows', 'mac'
                    }
                    axis {
                        name 'NODE_VERSION'
                        values '16', '18', '20'
                    }
                }
                stages {
                    stage('构建') {
                        agent { label "${PLATFORM}" }
                        steps {
                            sh "node-${NODE_VERSION} --version"
                        }
                    }
                }
            }
        }
    }
}

我的经验:多平台构建时,Docker是最好的朋友。把构建环境打包成镜像,到哪都一样。我曾经在Windows上折腾了三天环境问题,换成Docker后半小时搞定。

GitLab CI/CD的多平台构建用parallel:matrix

build:
  parallel:
    matrix:
      - OS: linux
        NODE: "16"
      - OS: linux
        NODE: "18"
      - OS: windows
        NODE: "18"
  script:
    - echo "构建平台:$OS,Node版本:$NODE"

4.5 选型建议

说了这么多,到底选哪个?我个人的建议是这样的:

场景 推荐工具 理由
代码在GitHub上 GitHub Actions 零运维,社区Action丰富
代码在GitLab上 GitLab CI/CD 一体化体验,K8s集成好
已有Jenkins基础设施 Jenkins Pipeline 插件生态成熟,定制能力强
多平台、多架构构建 任意工具 + Docker Docker保证环境一致性

最后提醒一句:CI工具只是手段,不是目的。别为了用工具而用工具。我见过一个团队,三个工具同时用,最后维护成本比手动构建还高。选一个,用透它。

嗯,这一章的内容就到这。下一章我们聊聊持续交付(CD),把构建好的东西真正部署到生产环境。到时候你会看到,CI只是开胃菜,CD才是硬菜。