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才是硬菜。