跳至主要内容

从 Azure Pipelines 迁移到 GitHub Actions

GitHub Actions 和 Azure Pipelines 共享一些配置相似之处,这使得迁移到 GitHub Actions 相对简单。

简介

Azure Pipelines 和 GitHub Actions 都允许您创建自动构建、测试、发布、发布和部署代码的工作流。Azure Pipelines 和 GitHub Actions 在工作流配置方面有一些相似之处。

  • 工作流配置文件是用 YAML 编写的,并存储在代码的存储库中。
  • 工作流包括一个或多个作业。
  • 作业包括一个或多个步骤或单个命令。
  • 步骤或任务可以重复使用并与社区共享。

更多信息,请参阅“了解 GitHub Actions”。

主要区别

从 Azure Pipelines 迁移时,请考虑以下区别:

  • Azure Pipelines 支持旧版经典编辑器,允许您在 GUI 编辑器中定义 CI 配置,而不是在 YAML 文件中创建管道定义。GitHub Actions 使用 YAML 文件定义工作流,并且不支持图形编辑器。
  • Azure Pipelines 允许您省略作业定义中的一些结构。例如,如果您只有一个作业,则无需定义作业,只需定义其步骤即可。GitHub Actions 需要显式配置,并且不能省略 YAML 结构。
  • Azure Pipelines 支持在 YAML 文件中定义的阶段,可用于创建部署工作流。GitHub Actions 要求您将阶段分成单独的 YAML 工作流文件。
  • 本地 Azure Pipelines 构建代理可以使用功能进行选择。GitHub Actions 自托管运行器可以使用标签进行选择。

迁移作业和步骤

Azure Pipelines 中的作业和步骤与 GitHub Actions 中的作业和步骤非常相似。在这两个系统中,作业都具有以下特征:

  • 作业包含一系列按顺序运行的步骤。
  • 作业在单独的虚拟机或单独的容器上运行。
  • 作业默认情况下并行运行,但可以配置为顺序运行。

迁移脚本步骤

您可以在工作流中运行脚本或 shell 命令作为步骤。在 Azure Pipelines 中,可以使用script键或bashpowershellpwsh键指定脚本步骤。脚本也可以作为Bash 任务PowerShell 任务的输入来指定。

在 GitHub Actions 中,所有脚本均使用run键指定。要选择特定的 shell,可以在提供脚本时指定shell键。有关更多信息,请参阅“GitHub Actions 的工作流语法”。

以下是每个系统的语法示例。

脚本步骤的 Azure Pipelines 语法

jobs:
  - job: scripts
    pool:
      vmImage: 'windows-latest'
    steps:
      - script: echo "This step runs in the default shell"
      - bash: echo "This step runs in bash"
      - pwsh: Write-Host "This step runs in PowerShell Core"
      - task: PowerShell@2
        inputs:
          script: Write-Host "This step runs in PowerShell"

脚本步骤的 GitHub Actions 语法

jobs:
  scripts:
    runs-on: windows-latest
    steps:
      - run: echo "This step runs in the default shell"
      - run: echo "This step runs in bash"
        shell: bash
      - run: Write-Host "This step runs in PowerShell Core"
        shell: pwsh
      - run: Write-Host "This step runs in PowerShell"
        shell: powershell

脚本错误处理的差异

在 Azure Pipelines 中,如果任何输出发送到stderr,则可以将脚本配置为出错。GitHub Actions 不支持此配置。

GitHub Actions 尽可能将 shell 配置为“快速失败”,如果脚本中的一个命令以错误代码退出,则会立即停止脚本。相比之下,Azure Pipelines 需要显式配置才能在错误时立即退出。有关更多信息,请参阅“GitHub Actions 的工作流语法”。

Windows 系统上默认 shell 的差异

在 Azure Pipelines 中,Windows 平台上脚本的默认 shell 是命令 shell (cmd.exe)。在 GitHub Actions 中,Windows 平台上脚本的默认 shell 是 PowerShell。PowerShell 在内置命令、变量扩展和流程控制方面存在一些差异。

如果您运行的是简单命令,则可能无需任何更改即可在 PowerShell 中运行命令 shell 脚本。但在大多数情况下,您需要使用 PowerShell 语法更新脚本,或指示 GitHub Actions 使用命令 shell 而不是 PowerShell 运行脚本。您可以通过将shell指定为cmd来实现。

以下是每个系统的语法示例。

默认使用 CMD 的 Azure Pipelines 语法

jobs:
  - job: run_command
    pool:
      vmImage: 'windows-latest'
    steps:
      - script: echo "This step runs in CMD on Windows by default"

指定 CMD 的 GitHub Actions 语法

jobs:
  run_command:
    runs-on: windows-latest
    steps:
      - run: echo "This step runs in PowerShell on Windows by default"
      - run: echo "This step runs in CMD on Windows explicitly"
        shell: cmd

有关更多信息,请参阅“GitHub Actions 的工作流语法”。

迁移条件和表达式语法

Azure Pipelines 和 GitHub Actions 都可以有条件地运行步骤。在 Azure Pipelines 中,条件表达式使用condition键指定。在 GitHub Actions 中,条件表达式使用if键指定。

Azure Pipelines 在表达式中使用函数来有条件地执行步骤。相比之下,GitHub Actions 使用中缀表示法。例如,必须将 Azure Pipelines 中的eq函数替换为 GitHub Actions 中的==运算符。

以下是每个系统的语法示例。

条件表达式的 Azure Pipelines 语法

jobs:
  - job: conditional
    pool:
      vmImage: 'ubuntu-latest'
    steps:
      - script: echo "This step runs with str equals 'ABC' and num equals 123"
        condition: and(eq(variables.str, 'ABC'), eq(variables.num, 123))

条件表达式的 GitHub Actions 语法

jobs:
  conditional:
    runs-on: ubuntu-latest
    steps:
      - run: echo "This step runs with str equals 'ABC' and num equals 123"
        if: ${{ env.str == 'ABC' && env.num == 123 }}

有关更多信息,请参阅“评估工作流和操作中的表达式”。

作业之间的依赖关系

Azure Pipelines 和 GitHub Actions 都允许您为作业设置依赖关系。在这两个系统中,作业默认情况下并行运行,但可以显式指定作业依赖关系。在 Azure Pipelines 中,这是使用dependsOn键完成的。在 GitHub Actions 中,这是使用needs键完成的。

以下是每个系统的语法示例。工作流启动名为initial的第一个作业,当该作业完成后,将运行名为fanout1fanout2的两个作业。最后,当这些作业完成后,将运行作业fanin

作业之间依赖关系的 Azure Pipelines 语法

jobs:
  - job: initial
    pool:
      vmImage: 'ubuntu-latest'
    steps:
      - script: echo "This job will be run first."
  - job: fanout1
    pool:
      vmImage: 'ubuntu-latest'
    dependsOn: initial
    steps:
      - script: echo "This job will run after the initial job, in parallel with fanout2."
  - job: fanout2
    pool:
      vmImage: 'ubuntu-latest'
    dependsOn: initial
    steps:
      - script: echo "This job will run after the initial job, in parallel with fanout1."
  - job: fanin:
    pool:
      vmImage: 'ubuntu-latest'
    dependsOn: [fanout1, fanout2]
    steps:
      - script: echo "This job will run after fanout1 and fanout2 have finished."

作业之间依赖关系的 GitHub Actions 语法

jobs:
  initial:
    runs-on: ubuntu-latest
    steps:
      - run: echo "This job will be run first."
  fanout1:
    runs-on: ubuntu-latest
    needs: initial
    steps:
      - run: echo "This job will run after the initial job, in parallel with fanout2."
  fanout2:
    runs-on: ubuntu-latest
    needs: initial
    steps:
      - run: echo "This job will run after the initial job, in parallel with fanout1."
  fanin:
    runs-on: ubuntu-latest
    needs: [fanout1, fanout2]
    steps:
      - run: echo "This job will run after fanout1 and fanout2 have finished."

有关更多信息,请参阅“GitHub Actions 的工作流语法”。

将任务迁移到操作

Azure Pipelines 使用任务,这是可以在多个工作流中重复使用的应用程序组件。GitHub Actions 使用操作,可用于执行任务并自定义您的工作流。在这两个系统中,您可以指定要运行的任务或操作的名称,以及任何必需的输入作为键/值对。

以下是每个系统的语法示例。

任务的 Azure Pipelines 语法

jobs:
  - job: run_python
    pool:
      vmImage: 'ubuntu-latest'
    steps:
      - task: UsePythonVersion@0
        inputs:
          versionSpec: '3.7'
          architecture: 'x64'
      - script: python script.py

操作的 GitHub Actions 语法

jobs:
  run_python:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-python@v5
        with:
          python-version: '3.7'
          architecture: 'x64'
      - run: python script.py

您可以在GitHub Marketplace中找到可在工作流中使用的操作,也可以创建自己的操作。有关更多信息,请参阅“共享自动化”。