跳至主要内容

从 Jenkins 迁移到 GitHub Actions

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

简介

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

使用指令

Jenkins 使用指令来管理声明式管道。这些指令定义了工作流的特性以及它的执行方式。下表演示了这些指令如何映射到 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
参数输入
输出
触发器
on.<event_name>.types
on.<push>.<branches|tags>
on.<pull_request>.<branches>
on.<push|pull_request>.paths
触发器 { upstreamprojects() }jobs.<job_id>.needs
Jenkins cron 语法on.schedule
阶段jobs.<job_id>
jobs.<job_id>.name
工具GitHub 托管运行器的规格
输入输入
何时jobs.<job_id>.if

使用顺序阶段

并行作业处理

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

Jenkins 并行GitHub Actions
并行jobs.<job_id>.strategy.max-parallel

矩阵

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

JenkinsGitHub Actions
strategy/matrix
上下文
stagessteps-context
排除

使用步骤执行任务

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')
  }
}

带有 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