文章
Jenkins、GitLab CI/CD 和 GitHub Actions
Jenkins、GitLab CI/CD 和 GitHub Actions 都是 DevOps 自动化工具,但它们在设计理念、语法、功能强度和场景适配方面有一些关键区别
目录
🆚 Jenkins vs GitLab CI/CD vs GitHub Actions 对比一览表#
| 项目 | Jenkins | GitLab CI/CD | GitHub Actions |
| 配置文件 | `Jenkinsfile`(Groovy DSL) | `.gitlab-ci.yml` | `.github/workflows/*.yml` |
| 平台绑定 | 任意 Git 仓库 | GitLab | GitHub |
| 触发方式 | Push、定时、Webhook、PR 等 | Push、MR、Tag、Schedule | Push、PR、Dispatch、Schedule |
| Agent 支持 | Master/Agent 模式,灵活可扩展 | GitLab Runner(内置/自建) | GitHub Hosted Runner(有分钟数限制) |
| 插件生态 | 最丰富(上千插件) | 一般 | 极其丰富(Actions Marketplace) |
| 并发控制 | 自控(需部署 Agent) | 自建 Runner 可扩展 | 免费额度限制(2k\~6k 分钟/月) |
| 学习曲线 | 高(Groovy DSL 较复杂) | 中(YAML 简洁) | 低(YAML 灵活好上手) |
| 适用场景 | 企业私有部署、大型定制流水线 | GitLab 用户和 DevOps 一体化 | 开源项目、轻量构建、GitHub 原生仓库 |
| 文件结构 | 单文件,Jenkinsfile 在根目录或指定路径 | 单一 `.yml` 文件 | 多 `.yml` 可按任务分拆 |
🚀 一、Jenkins 示例#
📄 Jenkinsfile 示例(构建 Java + Docker)#
pipeline {
agent any
environment {
IMAGE_NAME = "myapp"
IMAGE_TAG = "${env.BUILD_NUMBER}"
REGISTRY = "registry.example.com"
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build JAR') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Build Docker Image') {
steps {
sh '''
docker build -t $REGISTRY/$IMAGE_NAME:$IMAGE_TAG .
echo $DOCKER_PASSWORD | docker login -u $DOCKER_USERNAME --password-stdin $REGISTRY
docker push $REGISTRY/$IMAGE_NAME:$IMAGE_TAG
'''
}
}
}
}
🚀 二、GitLab CI/CD 示例#
📄 .gitlab-ci.yml 示例(构建 Java + Docker)#
stages:
- build
- docker
variables:
MAVEN_OPTS: "-DskipTests"
build_jar:
stage: build
image: maven:3.9-openjdk-17
script:
- mvn clean package $MAVEN_OPTS
artifacts:
paths:
- target/*.jar
docker_image:
stage: docker
image: docker:latest
services:
- docker:dind
script:
- docker build -t registry.example.com/myapp:$CI_COMMIT_SHORT_SHA .
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin registry.example.com
- docker push registry.example.com/myapp:$CI_COMMIT_SHORT_SHA
🚀 三、GitHub Actions 示例#
📄 .github/workflows/build.yml#
name: Build and Deploy
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Build JAR
run: mvn clean package -DskipTests
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: app-jar
path: target/*.jar
docker:
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build & Push Docker Image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: yourname/app:latest
🔐 四、Secrets 管理#
| 工具 | Secret 存储方式 |
| Jenkins | 通过 Web 界面或文件配置 Credentials |
| GitLab | 项目设置 \> **CI/CD \> Variables** |
| GitHub | 仓库设置 \> **Settings \> Secrets and variables** |
🛠️ 五、使用场景推荐#
| 场景 | 推荐平台 |
| 企业自建平台、老项目迁移、大规模流水线 | ✅ Jenkins |
| GitLab 用户、内网 DevOps 一体化部署 | ✅ GitLab CI/CD |
| GitHub 仓库、开源项目、快速集成 | ✅ GitHub Actions |
| 插件生态丰富、部署平台灵活 | Jenkins / GitHub Actions |
| 低成本、小团队使用 | GitLab CI/CD / GitHub Actions |
🧠 总结#
GitHub Actions 是当前轻量 CI/CD 最佳选择;GitLab CI/CD 适合 GitLab 用户;Jenkins 是最成熟但运维成本最高的方案,适合对构建控制粒度要求极高的企业使