{"meta":{"title":"Migrating from Azure Pipelines to GitHub Actions","intro":"GitHub Actions и Azure Pipelines имеют несколько сходств конфигурации, что делает миграцию на GitHub Actions относительно простой.","product":"GitHub Actions","breadcrumbs":[{"href":"/ru/actions","title":"GitHub Actions"},{"href":"/ru/actions/tutorials","title":"Учебники"},{"href":"/ru/actions/tutorials/migrate-to-github-actions","title":"Миграция на GitHub Actions"},{"href":"/ru/actions/tutorials/migrate-to-github-actions/manual-migrations","title":"Миграция вручную"},{"href":"/ru/actions/tutorials/migrate-to-github-actions/manual-migrations/migrate-from-azure-pipelines","title":"Migrate from Azure Pipelines"}],"documentType":"article"},"body":"# Migrating from Azure Pipelines to GitHub Actions\n\nGitHub Actions и Azure Pipelines имеют несколько сходств конфигурации, что делает миграцию на GitHub Actions относительно простой.\n\n## Введение\n\nAzure Pipelines и GitHub Actions позволяют создавать рабочие процессы, которые автоматически строят, тестируют, публикуются, выпускают и развёртают код. Azure Pipelines и GitHub Actions имеют некоторые сходства в конфигурации рабочих процессов:\n\n* Файлы конфигурации рабочего процесса записываются в YAML и хранятся в репозитории кода.\n* В рабочем процессе может быть одно или несколько заданий.\n* Задания включают один или несколько шагов или отдельных команд.\n* Шаги или задачи можно повторно использовать и предоставлять сообществу.\n\nДополнительные сведения см. в разделе [Понимание GitHub Actions](/ru/actions/learn-github-actions/understanding-github-actions).\n\n## Основные отличия\n\nПри миграции с Azure Pipelines учитывайте следующие различия:\n\n* Azure Pipelines поддерживает устаревший редактор *classic editor*, который позволяет задавать конфигурацию CI в GUI-редакторе вместо создания конвейера в YAML-файле. GitHub Actions использует файлы YAML для определения рабочих процессов и не поддерживает графический редактор.\n* Azure Pipelines позволяет опустить некоторую структуру в определениях заданий. Например, если у вас есть только одно задание, вам не нужно определять само задание, достаточно определить его шаги. GitHub Actions требует явной настройки, и в структуре YAML нельзя делать пропуски.\n* Azure Pipelines поддерживает *stages* определённые в файле YAML, которые можно использовать для создания рабочих процессов развертывания. GitHub Actions требует разделять этапы на отдельные файлы рабочих процессов YAML.\n* Локальные агенты сборки Azure Pipelines могут быть выбраны с возможностями. Локальные средства выполнения GitHub Actions можно выбирать с определенными метками.\n\n## Миграция заданий и шагов\n\nВакансии и шаги в Azure Pipelines очень похожи на вакансии и шаги в GitHub Actions. В обеих системах задания имеют следующие характеристики.\n\n* Задания содержат ряд шагов, которые выполняются последовательно.\n* Задания выполняются на отдельных виртуальных машинах или в отдельных контейнерах.\n* По умолчанию задания выполняются параллельно, но можно настроить их последовательное выполнение.\n\n## Миграция шагов скрипта\n\nСкрипт или команду оболочки можно выполнять как шаг рабочего процесса. В 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).\n\nВ GitHub Actions все скрипты указываются с помощью ключа `run`. Чтобы выбрать конкретную оболочку, можно указать ключ `shell` при предоставлении скрипта. Дополнительные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun).\n\nНиже приведен пример синтаксиса для каждой системы.\n\n### Azure Pipelines syntax for script steps\n\n```yaml\njobs:\n  - job: scripts\n    pool:\n      vmImage: 'windows-latest'\n    steps:\n      - script: echo \"This step runs in the default shell\"\n      - bash: echo \"This step runs in bash\"\n      - pwsh: Write-Host \"This step runs in PowerShell Core\"\n      - task: PowerShell@2\n        inputs:\n          script: Write-Host \"This step runs in PowerShell\"\n```\n\n### Синтаксис GitHub Actions для шагов скрипта\n\n```yaml\njobs:\n  scripts:\n    runs-on: windows-latest\n    steps:\n      - run: echo \"This step runs in the default shell\"\n      - run: echo \"This step runs in bash\"\n        shell: bash\n      - run: Write-Host \"This step runs in PowerShell Core\"\n        shell: pwsh\n      - run: Write-Host \"This step runs in PowerShell\"\n        shell: powershell\n```\n\n## Различия в обработке ошибок скрипта\n\nВ Azure Pipelines скрипты могут быть настроены на ошибку, если какой-либо вывод отправляется в `stderr`. GitHub Actions не поддерживает эту конфигурацию.\n\nGitHub Actions настраивает оболочки для \"завершения работы при первой ошибке\", когда это возможно, поэтому если одна из команд в скрипте завершает работу с кодом ошибки, это приводит к немедленной остановке скрипта. В отличие от этого, Azure Pipelines требует явной конфигурации для немедленного выхода при ошибке. Дополнительные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/using-workflows/workflow-syntax-for-github-actions#exit-codes-and-error-action-preference).\n\n## Отличия в стандартной оболочке на Windows\n\nВ Azure Pipelines году стандартной оболочкой для скриптов на Windows платформах является Command shell (*cmd.exe*). В GitHub Actions стандартной оболочкой для скриптов на Windows платформах является PowerShell. PowerShell имеет некоторые различия во встроенных командах, расширении переменных и управлении потоком.\n\nЕсли вы выполняете простую команду, то можете запустить скрипт командной оболочки в PowerShell без каких-либо изменений. Но в большинстве случаев вам потребуется обновить скрипт с учетом синтаксиса PowerShell или указать GitHub Actions, что скрипт следует запускать с помощью командной оболочки вместо PowerShell. Это можно сделать, задав для `shell` значение `cmd`.\n\nНиже приведен пример синтаксиса для каждой системы.\n\n### Синтаксис Azure Pipelines с использованием CMD по умолчанию\n\n```yaml\njobs:\n  - job: run_command\n    pool:\n      vmImage: 'windows-latest'\n    steps:\n      - script: echo \"This step runs in CMD on Windows by default\"\n```\n\n### Синтаксис GitHub Actions для указания CMD\n\n```yaml\njobs:\n  run_command:\n    runs-on: windows-latest\n    steps:\n      - run: echo \"This step runs in PowerShell on Windows by default\"\n      - run: echo \"This step runs in CMD on Windows explicitly\"\n        shell: cmd\n```\n\nДополнительные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/using-workflows/workflow-syntax-for-github-actions#using-a-specific-shell).\n\n## Миграция условных выражений и синтаксис выражений\n\nAzure Pipelines и GitHub Actions могут выполнять шаги условно. В Azure Pipelines условные выражения задаются с помощью ключа `condition`. В GitHub Actionsусловные выражения задаются с помощью ключа `if`.\n\nAzure Pipelines использует функции внутри выражений для условного выполнения шагов. В отличие от этого, GitHub Actions использует нотацию infix. Например, необходимо заменить функцию `eq` в Azure Pipelines на оператор `==` в GitHub Actions.\n\nНиже приведен пример синтаксиса для каждой системы.\n\n### Azure Pipelines syntax for conditional expressions\n\n```yaml\njobs:\n  - job: conditional\n    pool:\n      vmImage: 'ubuntu-latest'\n    steps:\n      - script: echo \"This step runs with str equals 'ABC' and num equals 123\"\n        condition: and(eq(variables.str, 'ABC'), eq(variables.num, 123))\n```\n\n### Синтаксис GitHub Actions для условных выражений\n\n```yaml\njobs:\n  conditional:\n    runs-on: ubuntu-latest\n    steps:\n      - run: echo \"This step runs with str equals 'ABC' and num equals 123\"\n        if: ${{ env.str == 'ABC' && env.num == 123 }}\n```\n\nДополнительные сведения см. в разделе [Оценка выражений в рабочих процессах и действиях](/ru/actions/learn-github-actions/expressions).\n\n## Зависимости между заданиями\n\nИ Azure Pipelines, и GitHub Actions позволяют задавать зависимости для задачи. В обеих системах задания по умолчанию выполняются параллельно, но зависимости заданий можно указывать явным образом. В Azure Pipelines это делается с помощью клавиши `dependsOn`. В GitHub Actionsэто делается с помощью ключа `needs`.\n\nНиже приведен пример синтаксиса для каждой системы. Рабочие процессы запускают первое задание с именем `initial`, и после завершения этого задания будут выполняться два задания с именами `fanout1` и `fanout2`. И наконец, после завершения этих заданий, будет выполняться задание `fanin`.\n\n### Синтаксис Azure Pipelines для зависимостей между работами\n\n```yaml\njobs:\n  - job: initial\n    pool:\n      vmImage: 'ubuntu-latest'\n    steps:\n      - script: echo \"This job will be run first.\"\n  - job: fanout1\n    pool:\n      vmImage: 'ubuntu-latest'\n    dependsOn: initial\n    steps:\n      - script: echo \"This job will run after the initial job, in parallel with fanout2.\"\n  - job: fanout2\n    pool:\n      vmImage: 'ubuntu-latest'\n    dependsOn: initial\n    steps:\n      - script: echo \"This job will run after the initial job, in parallel with fanout1.\"\n  - job: fanin\n    pool:\n      vmImage: 'ubuntu-latest'\n    dependsOn: [fanout1, fanout2]\n    steps:\n      - script: echo \"This job will run after fanout1 and fanout2 have finished.\"\n```\n\n### Синтаксис GitHub Actions для зависимостей между заданиями\n\n```yaml\njobs:\n  initial:\n    runs-on: ubuntu-latest\n    steps:\n      - run: echo \"This job will be run first.\"\n  fanout1:\n    runs-on: ubuntu-latest\n    needs: initial\n    steps:\n      - run: echo \"This job will run after the initial job, in parallel with fanout2.\"\n  fanout2:\n    runs-on: ubuntu-latest\n    needs: initial\n    steps:\n      - run: echo \"This job will run after the initial job, in parallel with fanout1.\"\n  fanin:\n    runs-on: ubuntu-latest\n    needs: [fanout1, fanout2]\n    steps:\n      - run: echo \"This job will run after fanout1 and fanout2 have finished.\"\n```\n\nДополнительные сведения см. в разделе [Синтаксис рабочего процесса для GitHub Actions](/ru/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds).\n\n## Миграция задач в действия\n\nAzure Pipelines использует *tasks* — это компоненты приложения, которые можно повторно использовать в нескольких рабочих процессах. GitHub Actions использует *действия*, которые можно использовать для выполнения задач и настройки рабочего процесса. В обеих системах можно указать имя задачи или действия для выполнения, а также все необходимые входные данные в виде пар \"ключ-значение\".\n\nНиже приведен пример синтаксиса для каждой системы.\n\n### Azure Pipelines syntax for tasks\n\n```yaml\njobs:\n  - job: run_python\n    pool:\n      vmImage: 'ubuntu-latest'\n    steps:\n      - task: UsePythonVersion@0\n        inputs:\n          versionSpec: '3.7'\n          architecture: 'x64'\n      - script: python script.py\n```\n\n### Синтаксис GitHub Actions для действий\n\n```yaml\njobs:\n  run_python:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/setup-python@v5\n        with:\n          python-version: '3.7'\n          architecture: 'x64'\n      - run: python script.py\n```\n\nВы можете найти действия для использования в рабочих процессах в [GitHub Marketplace](https://github.com/marketplace?type=actions) или создать свои собственные действия. Дополнительные сведения см. в разделе [Повторное выполнение автоматизации](/ru/actions/creating-actions)."}