🆚 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 |