Вопрос или проблема
Я создал простой рабочий процесс GitHub Actions для развертывания в тестовый слот моего приложения ASP.NET Core, который срабатывает при коммите в ветку master.
Теперь я хотел бы иметь возможность возвращаться к определенному рабочему процессу на экране истории действий и вручную инициировать развертывание тех же артефактов в производственный слот.
Это возможно? Единственный способ, который сейчас работает наполовину, это ручной триггер ‘workflow_dispatch’, но он не связан с кодом на данном коммите, под которым изначально запускался рабочий процесс. Он будет пересобирать и развертывать на актуальном состоянии основной ветки.
Я столкнулся с этой проблемой месяц назад, когда реализовывал конвейер GitHub Actions, который должен был собирать проект при каждом коммите, но развертывать только вручную.
Я решил это, добавив шаг в рабочий процесс, который проверяет, существует ли изображение с таким хешем коммита в реестре, и если да, то пропускать все этапы сборки. Таким образом, вы запускаете весь рабочий процесс каждый раз, но если необходимая сборка уже существует, будет выполняться только часть рабочего процесса, относящаяся к развертыванию.
Ответ или решение
Да, вам действительно может понадобиться реализовать деплой существующих тестовых сборок вашего приложения на Azure App в производственную среду с использованием GitHub Actions. Давайте подробно рассмотрим ваш сценарий и возможные пути его реализации.
Проблема
Вы уже настроили рабочий процесс GitHub Actions для автоматического развертывания вашего ASP.NET Core приложения в тестовом слоте при каждом коммите в ветку master
. Однако теперь вы хотите вручную триггерить развертывание этой же сборки в продакшн-слот, основываясь на конкретном хеш-commit, который использовался ранее, а не на последней версии кода.
Возможные Решения
-
Использование
workflow_dispatch
с параметрами
Вы можете использовать возможность GitHub Actionsworkflow_dispatch
, которая позволяет вам вручную запускать рабочий процесс, добавляя необходимые параметры. Вы можете передавать хеш коммита в качестве параметра и использовать его в вашем действии развертывания. Вот пример того, как это может выглядеть:on: workflow_dispatch: inputs: commit_hash: description: 'Commit hash for the build to deploy' required: true
Затем в вашем рабочем процессе вы можете использовать этот параметр для извлечения ранее собранного артефакта:
jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout specific commit uses: actions/checkout@v2 with: ref: ${{ github.event.inputs.commit_hash }} - name: Use existing artifact run: | # Коды для развертывания вашего приложения, используя артефакт
-
Проверка наличия артефакта в реестре
Как вы упомянули, есть другой вариант, который заключается в добавлении шага, который проверяет, существует ли уже образ с данным хешем в реестре. Если он существует, можно пропустить шаги сборки и перейти сразу к шагам развертывания. Это может быть реализовано следующим образом:jobs: deploy: runs-on: ubuntu-latest steps: - name: Check if the image exists run: | if ! docker images | grep -q "${{ github.sha }}"; then echo "Image not found, proceeding with build..." # команды для сборки образа else echo "Image already exists, skipping build." fi - name: Deploy run: | # команды для развертывания вашего приложения
Заключение
Существует несколько способов вручную инициировать развертывание конкретной сборки в Azure с использованием GitHub Actions. Использование workflow_dispatch
с параметрами, передающими хеш конкретного коммита, и проверка наличия уже собранного артефакта — оба этих подхода позволяют более гибко управлять процессом развертывания.
Эти методы помогут вам избежать повторной сборки и ускорить процесс развертывания, что особенно важно для производственных сред, где время простоя может быть критичным.
Если вам нужна дополнительная помощь или есть другие вопросы по настройке вашего рабочего процесса, пожалуйста, дайте знать!