简介
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-on jobs.<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/matrix context |
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'
配置管道中的环境变量
包含环境变量的 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-16" }
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@v4
- uses: actions/setup-node@v3
with:
node-version: 16
- run: npm install -g bats
- run: bats tests
working-directory: ./scripts/myapp