简介
Jenkins 和 GitHub Actions 都允许您创建能自动构建、测试、发布、发行和部署代码的工作流程。 Jenkins 和 GitHub Actions 的工作流程配置有一些相似之处:
- Jenkins 使用 Declarative Pelines 创建工作流,这些工作流类似于 GitHub Actions 工作流文件。
- Jenkins 使用阶段运行步骤集合,而 GitHub Actions 则使用作业对一个或多个步骤或单个命令进行分组。
- Jenkins 和 GitHub Actions 支持基于容器的构建。 有关详细信息,请参阅“创建 Docker 容器操作”。
- 步骤或任务可以重复使用并与社区共享。
有关详细信息,请参阅“了解 GitHub Actions”。
主要差异
- Jenkins 有两种类型的语法用来创建管道:Declarative Pipeline 和 Scripted Pipeline。 GitHub Actions 使用 YAML 创建工作流程和配置文件。 有关详细信息,请参阅“GitHub Actions 的工作流语法”。
- Jenkins 部署通常是自托管的,用户在自己的数据中心维护服务器。 GitHub Actions 通过托管自己可用于运行作业的运行器提供混合云方法,同时也支持自托管运行器。 有关详细信息,请参阅“自托管运行程序”。
比较功能
分发版本
Jenkins 可让您发送版本到单个构建代理,或者您可以在多个代理之间进行分发。 您也可以根据不同的属性(例如操作系统类型)对这些代理进行分类。
同样, GitHub Actions 可以向 GitHub 托管或自托管的运行器发送作业,您可以根据不同的属性使用标签对运行器分类。 有关详细信息,请参阅 了解 GitHub Actions 和 自托管运行程序。
使用区段组织管道
Jenkins 将其 Declarative Pipelines 分为多个区段。 同样,GitHub Actions 也将其工作流程分成单独的部分。 下表比较了Jenkins 区段与 GitHub Actions 工作流程。
| Jenkins 指令 | GitHub Actions | 
|---|---|
| agent | jobs.<job_id>.runs-onjobs.<job_id>.container | 
| post | 无 | 
| stages | jobs | 
| steps | jobs.<job_id>.steps | 
using 指令
Jenkins 使用指令来管理 Declarative Pipelines。 这些指令定义工作流程的特性及其执行方式。 下表演示这些指令如何映射到 GitHub Actions 中的概念。
使用连续阶段
并行作业处理
Jenkins 可以并行运行 stages 和 steps,而 GitHub Actions 目前只能并行运行作业。
| Jenkins Parallel | GitHub Actions | 
|---|---|
| parallel | jobs.<job_id>.strategy.max-parallel | 
Matrix
GitHub Actions 和 Jenkins 都允许你使用矩阵来定义各种系统组合。
| Jenkins | GitHub Actions | 
|---|---|
| axis | strategy/matrixcontext | 
| stages | steps-context | 
| excludes | 无 | 
使用步骤执行任务
Jenkins 按 stages 将 steps 分组在一起。 每个步骤都可以是脚本、函数或命令等。 同样,GitHub Actions 使用 jobs 来执行特定的 steps 组。
| Jenkins | GitHub Actions | 
|---|---|
| steps | jobs.<job_id>.steps | 
常见任务示例
计划管道以与 cron 一起运行
包含 cron 的 Jenkins 管道
pipeline {
  agent any
  triggers {
    cron('H/15 * * * 1-5')
  }
}
包含 cron 的 GitHub Actions 工作流
on:
  schedule:
    - cron: '*/15 * * * 1-5'
有关 schedule 事件和接受的 cron 语法的详细信息,请参阅“触发工作流的事件”。
配置管道中的环境变量
包含环境变量的 Jenkins 管道
pipeline {
  agent any
  environment {
    MAVEN_PATH = '/usr/local/maven'
  }
}
包含环境变量的 GitHub Actions 工作流
jobs:
  maven-build:
    env:
      MAVEN_PATH: '/usr/local/maven'
从上游项目构建
从上游项目生成的 Jenkins 管道
pipeline {
  triggers {
    upstream(
      upstreamProjects: 'job1,job2',
      threshold: hudson.model.Result.SUCCESS
    )
  }
}
从上游项目生成的 GitHub Actions 工作流
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]
使用多个操作系统构建
使用多个操作系统生成的 Jenkins 管道
pipeline {
  agent none
  stages {
    stage('Run Tests') {
      matrix {
        axes {
          axis {
            name: 'PLATFORM'
            values: 'macos', 'linux'
          }
        }
        agent { label "${PLATFORM}" }
        stages {
          stage('test') {
            tools { nodejs "node-20" }
            steps {
              dir("scripts/myapp") {
                sh(script: "npm install -g bats")
                sh(script: "bats tests")
              }
            }
          }
        }
      }
    }
  }
}
使用多个操作系统生成的 GitHub Actions 工作流
name: demo-workflow
on:
  push:
jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest]
    steps:
      - uses: actions/checkout@v5
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm install -g bats
      - run: bats tests
        working-directory: ./scripts/myapp