简介
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
键或 bash
、powershell
或 pwsh
键指定脚本步骤。脚本也可以作为 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
来实现。
以下是每个系统的语法示例。
Azure Pipelines 默认使用 CMD 的语法
jobs:
- job: run_command
pool:
vmImage: 'windows-latest'
steps:
- script: echo "This step runs in CMD on Windows by default"
GitHub Actions 指定 CMD 的语法
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
的第一个作业,当该作业完成后,两个名为 fanout1
和 fanout2
的作业将运行。最后,当这些作业完成后,作业 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 中找到可以在工作流中使用的操作,也可以创建自己的操作。有关更多信息,请参阅“创建操作”。