# Переход с Azure Pipelines на GitHub Actions

GitHub Actionsи Azure Pipelines совместно использовать несколько сходств конфигурации, что делает миграцию GitHub Actions относительно простой.

## Введение

Azure Pipelines и GitHub Actions позволяют создавать рабочие процессы, которые автоматически создают, тестируют, публикуют, выпускают и развертывают код. Azure Pipelines и GitHub Actions совместно использовать некоторые сходства в конфигурации рабочего процесса:

* Файлы конфигурации рабочего процесса записываются в YAML и хранятся в репозитории кода.
* В рабочем процессе может быть одно или несколько заданий.
* Задания включают один или несколько шагов или отдельных команд.
* Шаги или задачи можно повторно использовать и предоставлять сообществу.

Дополнительные сведения см. в разделе [Понимание GitHub Actions](/ru/actions/get-started/understand-github-actions).

## Основные отличия

При миграции с Azure Pipelines учитывайте следующие различия:

* Azure Pipelines поддерживает устаревший редактор *classic editor*, который позволяет задавать конфигурацию CI в GUI-редакторе вместо создания конвейера в YAML-файле.
  GitHub Actions использует файлы YAML для определения рабочих процессов и не поддерживает графический редактор.
* Azure Pipelines позволяет опустить некоторую структуру в определениях заданий. Например, если у вас есть только одно задание, вам не нужно определять само задание, достаточно определить его шаги.
  GitHub Actions требует явной конфигурации, а структура YAML не может быть опущена.
* Azure Pipelines поддерживает *stages* определённые в файле YAML, которые можно использовать для создания рабочих процессов развертывания.
  GitHub Actions требуется разделить этапы на отдельные файлы рабочих процессов YAML.
* Локальные агенты сборки Azure Pipelines могут быть выбраны с возможностями.
  GitHub Actions Локальные средства выполнения можно выбрать с помощью меток.

## Миграция заданий и шагов

Задания и шаги в Azure Pipelines очень похожи на задания и шаги.GitHub Actions В обеих системах задания имеют следующие характеристики.

* Задания содержат ряд шагов, которые выполняются последовательно.
* Задания выполняются на отдельных виртуальных машинах или в отдельных контейнерах.
* По умолчанию задания выполняются параллельно, но можно настроить их последовательное выполнение.

## Миграция шагов скрипта

Скрипт или команду оболочки можно выполнять как шаг рабочего процесса. В Azure Pipelines шаги скрипта можно задать с помощью клавиши `script` или клавишами `bash`, `powershell` или `pwsh`. Скрипты также можно указать в качестве входных данных [задачи Bash](https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/bash?view=azure-devops) или [задачи PowerShell](https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/powershell?view=azure-devops).

В GitHub Actionsэтом случае все скрипты указываются с помощью `run` ключа. Чтобы выбрать конкретную оболочку, можно указать ключ `shell` при предоставлении скрипта. Дополнительные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsrun).

Ниже приведен пример синтаксиса для каждой системы.

### синтаксис Azure Pipelines для шагов скрипта

```yaml
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 синтаксис для шагов скрипта

```yaml
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 настраивает оболочки на "сбой быстро", когда это возможно, что останавливает скрипт немедленно, если одна из команд в скрипте завершается с кодом ошибки. В отличие от этого, Azure Pipelines требует явной конфигурации для немедленного выхода при ошибке. Дополнительные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/reference/workflows-and-actions/workflow-syntax#exit-codes-and-error-action-preference).

## Отличия в стандартной оболочке на Windows

В Azure Pipelines году стандартной оболочкой для скриптов на Windows платформах является Command shell (*cmd.exe*). В GitHub Actionsоболочке по умолчанию для сценариев на платформах Windows используется PowerShell. PowerShell имеет некоторые различия во встроенных командах, расширении переменных и управлении потоком.

Если вы выполняете простую команду, то можете запустить скрипт командной оболочки в PowerShell без каких-либо изменений. Но в большинстве случаев вам потребуется обновить скрипт с помощью синтаксиса PowerShell или выполнить GitHub Actions скрипт с помощью командной оболочки вместо PowerShell. Это можно сделать, задав для `shell` значение `cmd`.

Ниже приведен пример синтаксиса для каждой системы.

### Синтаксис Azure Pipelines с использованием CMD по умолчанию

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

### GitHub Actions синтаксис для указания CMD

```yaml
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](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idstepsshell).

## Миграция условных выражений и синтаксис выражений

Azure Pipelines и GitHub Actions могут выполнять оба шага условно. В Azure Pipelines условные выражения задаются с помощью ключа `condition`. Условные GitHub Actionsвыражения указываются с помощью `if` ключа.

Azure Pipelines использует функции внутри выражений для условного выполнения шагов. Напротив, GitHub Actions использует нотацию infix. Например, необходимо заменить функцию `eq` в Azure Pipelines оператором`==`.GitHub Actions

Ниже приведен пример синтаксиса для каждой системы.

### синтаксис Azure Pipelines для условных выражений

```yaml
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 синтаксис для условных выражений

```yaml
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 }}
```

Дополнительные сведения см. в разделе [Оценка выражений в рабочих процессах и действиях](/ru/actions/reference/workflows-and-actions/expressions).

## Зависимости между заданиями

Оба Azure Pipelines и GitHub Actions позволяют задать зависимости для задания. В обеих системах задания по умолчанию выполняются параллельно, но зависимости заданий можно указывать явным образом. В Azure Pipelines это делается с помощью клавиши `dependsOn`. В GitHub Actionsэтом случае ключ выполняется.`needs`

Ниже приведен пример синтаксиса для каждой системы. Рабочие процессы запускают первое задание с именем `initial`, и после завершения этого задания будут выполняться два задания с именами `fanout1` и `fanout2`. И наконец, после завершения этих заданий, будет выполняться задание `fanin`.

### Синтаксис Azure Pipelines для зависимостей между работами

```yaml
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 синтаксис для зависимостей между заданиями

```yaml
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](/ru/actions/reference/workflows-and-actions/workflow-syntax#jobsjob_idneeds).

## Миграция задач в действия

Azure Pipelines использует *tasks* — это компоненты приложения, которые можно повторно использовать в нескольких рабочих процессах.
GitHub Actions использует *действия*, которые можно использовать для выполнения задач и настройки рабочего процесса. В обеих системах можно указать имя задачи или действия для выполнения, а также все необходимые входные данные в виде пар "ключ-значение".

Ниже приведен пример синтаксиса для каждой системы.

### синтаксис Azure Pipelines для задач

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

### GitHub Actions синтаксис для действий

```yaml
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](https://github.com/marketplace?type=actions)или создать собственные действия. Дополнительные сведения см. в разделе [Повторное выполнение автоматизации](/ru/actions/how-tos/reuse-automations).