注意
GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。
简介
Jenkins 和 GitHub Actions 两者都允许你创建可自动生成、测试、发布、发布和部署代码的工作流。 Jenkins 并在 GitHub Actions 工作流配置中共享一些相似之处:
- Jenkins 使用 _声明性管道_创建工作流,这类似于 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-on jobs.<job_id>.container |
post | 无 |
stages | jobs |
steps | jobs.<job_id>.steps |
使用指令
Jenkins 使用指令来管理 Declarative Pipelines。 这些指令定义工作流程的特性及其执行方式。 下表展示了这些指令如何对应到 GitHub Actions 中的概念。
| Jenkins 指令 | GitHub Actions |
|---|---|
environment | jobs.<job_id>.env jobs.<job_id>.steps[*].env |
options | jobs.<job_id>.strategy jobs.<job_id>.strategy.fail-fast jobs.<job_id>.timeout-minutes |
parameters | inputs outputs |
triggers | on on.<event_name>.types on.<push>.<branches|tags> on.<pull_request>.<branches> on.<push|pull_request>.paths |
triggers { upstreamprojects() } | jobs.<job_id>.needs |
| Jenkins cron 语法 | on.schedule |
stage | jobs.<job_id> jobs.<job_id>.name |
tools | |
| [ | |
| GitHub托管运行器的规格](/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software) | |
input | inputs |
when | jobs.<job_id>.if |
使用连续阶段
并行任务处理
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/matrix context |
stages | steps-context |
excludes | 无 |
通过步骤执行任务
Jenkins 将 steps 分组在 stages 中。 每个步骤都可以是脚本、函数或命令等。 同样,GitHub Actions使用jobs来执行特定的steps组。
| Jenkins | GitHub Actions |
|---|---|
steps | jobs.<job_id>.steps |
常见任务示例
计划管道以与 cron 一起运行
包含 cron 的 Jenkins 管道
pipeline {
agent any
triggers {
cron('H/15 * * * 1-5')
}
}
GitHub Actions 工作流(使用 cron)
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@v6
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm install -g bats
- run: bats tests
working-directory: ./scripts/myapp