🆚 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