Skip to main content

从 Jenkins 迁移到 GitHub Actions

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

Note

GitHub Enterprise Server 目前不支持 GitHub 托管的运行器。 可以在 GitHub public roadmap 上查看有关未来支持计划的更多信息。

简介

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

using 指令

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
toolsGitHub 托管的运行器规范
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 按 stagessteps 分组在一起。 每个步骤都可以是脚本、函数或命令等。 同样,GitHub Actions 使用 jobs 来执行特定的 steps 组。

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