Skip to main content

从 Jenkins 迁移到 GitHub Actions

GitHub Actions 和 Jenkins 共享多个相似之处,这使得迁移到 GitHub Actions 相对简单。

注意

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
agentjobs.<job_id>.runs-on
jobs.<job_id>.container
post
stagesjobs
stepsjobs.<job_id>.steps

使用指令

Jenkins 使用指令来管理 Declarative Pipelines。 这些指令定义工作流程的特性及其执行方式。 下表展示了这些指令如何对应到 GitHub Actions 中的概念。

Jenkins 指令GitHub Actions
environmentjobs.<job_id>.env
jobs.<job_id>.steps[*].env
optionsjobs.<job_id>.strategy
jobs.<job_id>.strategy.fail-fast
jobs.<job_id>.timeout-minutes
parametersinputs
outputs
triggerson
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
stagejobs.<job_id>
jobs.<job_id>.name
tools
[
GitHub托管运行器的规格](/actions/using-github-hosted-runners/about-github-hosted-runners#supported-software)
inputinputs
whenjobs.<job_id>.if

使用连续阶段

并行任务处理

Jenkins 可以并行运行 stagessteps,而 GitHub Actions 当前仅并行运行作业。

Jenkins ParallelGitHub Actions
paralleljobs.<job_id>.strategy.max-parallel

Matrix

GitHub Actions 和 Jenkins 都允许你使用矩阵来定义各种系统组合。

JenkinsGitHub Actions
axisstrategy/matrix
context
stagessteps-context
excludes

通过步骤执行任务

Jenkins 将 steps 分组在 stages 中。 每个步骤都可以是脚本、函数或命令等。 同样,GitHub Actions使用jobs来执行特定的steps组。

JenkinsGitHub Actions
stepsjobs.<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