简介
Jenkins 和 GitHub Actions 都允许您创建工作流,这些工作流可以自动构建、测试、发布、发布和部署代码。Jenkins 和 GitHub Actions 在工作流配置方面有一些相似之处
- Jenkins 使用声明式管道创建工作流,这类似于 GitHub Actions 工作流文件。
- Jenkins 使用阶段来运行一系列步骤,而 GitHub Actions 使用作业来对一个或多个步骤或单个命令进行分组。
- Jenkins 和 GitHub Actions 支持基于容器的构建。有关更多信息,请参阅“创建 Docker 容器操作”。
- 步骤或任务可以重复使用并与社区共享。
有关更多信息,请参阅“了解 GitHub Actions”。
主要区别
- Jenkins 有两种创建管道的语法:声明式管道和脚本式管道。GitHub Actions 使用 YAML 创建工作流和配置文件。有关更多信息,请参阅“GitHub Actions 的工作流语法”。
- Jenkins 部署通常是自托管的,用户在自己的数据中心维护服务器。GitHub Actions 提供混合云方法,通过托管自己的运行器来运行作业,同时还支持自托管运行器。有关更多信息,请参阅 关于自托管运行器。
比较功能
分发构建
Jenkins 允许您将构建发送到单个构建代理,或者将它们分布到多个代理。您还可以根据各种属性(例如操作系统类型)对这些代理进行分类。
同样,GitHub Actions 可以将作业发送到 GitHub 托管或自托管运行器,并且可以使用标签根据各种属性对运行器进行分类。有关更多信息,请参阅“了解 GitHub Actions”和“关于自托管运行器”。
使用部分组织管道
Jenkins 将其声明式管道拆分为多个部分。同样,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 使用指令来管理声明式管道。这些指令定义了工作流的特性以及它的执行方式。下表演示了这些指令如何映射到 GitHub Actions 中的概念。
使用顺序阶段
并行作业处理
Jenkins 可以并行运行 stages
和 steps
,而 GitHub Actions 目前仅并行运行作业。
Jenkins 并行 | GitHub Actions |
---|---|
并行 | jobs.<job_id>.strategy.max-parallel |
矩阵
GitHub Actions 和 Jenkins 都允许您使用矩阵来定义各种系统组合。
Jenkins | GitHub Actions |
---|---|
轴 | strategy/matrix 上下文 |
stages | steps-context |
排除 | 无 |
使用步骤执行任务
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')
}
}
带有 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@v4
with:
node-version: 16
- run: npm install -g bats
- run: bats tests
working-directory: ./scripts/myapp