从 Jenkins 迁移到 GitHub Actions

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

简介

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

使用指令

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|pull_request>.<branches|tags>
on.<push|pull_request>.paths
triggers { upstreamprojects() }jobs.<job_id>.needs
Jenkins cron syntaxon.schedule
阶段,暂存jobs.<job_id>
jobs.<job_id>.name
tools
GitHub 托管的运行器的规格
inputinputs
whenjobs.<job_id>.if

使用连续阶段

并行作业处理

Jenkins 可以并行运行 stagessteps,而 GitHub Actions 目前只能并行运行作业。

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

构建矩阵

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

JenkinsGitHub Actions
axisstrategy/matrix
context
stagessteps-context
excludes

使用步骤执行任务

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

Jenkins 步骤GitHub Actions
scriptjobs.<job_id>.steps

常见任务示例

计划与 cron 一起运行的管道

Jenkins Pipeline GitHub Actions 工作流程
pipeline {
  agent any
  triggers {
    cron('H/15 * * * 1-5')
  }
}
on:
  schedule:
    - cron: '*/15 * * * 1-5'

配置管道中的环境变量

Jenkins Pipeline GitHub Actions 工作流程
pipeline {
  agent any
  environment {
    MAVEN_PATH = '/usr/local/maven'
  }
}
jobs:
  maven-build:
    env:
      MAVEN_PATH: '/usr/local/maven'

从上游项目构建

Jenkins Pipeline GitHub Actions 工作流程
pipeline {
  triggers {
    upstream(
      upstreamProjects: 'job1,job2',
      threshold: hudson.model.Result.SUCCESS
    )
  }
}
jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

使用多个操作系统构建

Jenkins Pipeline GitHub Actions 工作流程
pipeline {
  agent none
  stages {
    stage('Run Tests') {
      matrix {
        axes {
          axis {
            name: 'PLATFORM'
            values: 'macos', 'linux'
          }
        }
        agent { label "${PLATFORM}" }
        stages {
          stage('test') {
            tools { nodejs "node-12" }
            steps {
              dir("scripts/myapp") {
                sh(script: "npm install -g bats")
                sh(script: "bats tests")
              }
            }
          }
        }
      }
    }
  }
}
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@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 12
      - run: npm install -g bats
      - run: bats tests
        working-directory: scripts/myapp

此文档对您有帮助吗?

隐私政策

帮助我们创建出色的文档!

所有 GitHub 文档都是开源的。看到错误或不清楚的内容了吗?提交拉取请求。

做出贡献

或者, 了解如何参与。