Вопрос или проблема
У меня есть случай, когда для данной среды некоторые репозитории могут быть настроены на автоматическое развертывание, в то время как другие требуют ручного одобрения. Я выбрал подход с использованием другого параллельного задания для автоматического одобрения, когда это необходимо.
jobs:
job-before-staging:
# Любое задание перед заданием, возможно требующим одобрения.
# Нам нужно это, чтобы зафиксировать следующее два задания для параллельного выполнения.
# эта среда имеет правила защиты развертывания, требует ручного одобрения
deploy-staging:
needs: job-before-staging
env: STAGING
if: runStaging == true
# ... шаги развертывания здесь
# здесь не объявлена среда
staging-auto-approval:
needs: job-before-staging
if: runStaging == true && requireStagingApproval == false
steps:
- name: авто-одобрение-развертывания
run: <API для одобрения задания>
Используя API, будь то через gh api
или curl
, я могу получить env id
, job id
и pending_approvals
текущего задания. Я не могу заставить одобрение сработать.
Этот код работает, чтобы получить ожидающие развертывания:
gh api --verbose repos/$REPO/actions/runs/$RUNID/pending_deployments
Это возвращает данные в формате JSON, подтверждая, что он видит ожидающее развертывание.
Этот код для попытки одобрить ожидающее развертывание не срабатывает:
gh api --verbose \
repos/$REPO/actions/runs/$RUNID/pending_deployments \
--method POST \
-F "environment_ids[]=$ENVID" \
-f "state=approved" \
-f "comment=Авто-одобрено GitHub Actions"
Результат:
{
"comment": "Авто-одобрено GitHub Actions",
"environment_ids": [
11130481765
],
"state": "approved"
}
...
{
"message": "Ошибка валидации",
"errors": "Нет ожидающих запросов на развертывание для одобрения или отклонения",
"documentation_url": "https://docs.github.com/rest/actions/workflow-runs#review-pending-deployments-for-a-workflow-run",
"status": "422"
}
* Запрос занял 469.770458ms
gh: Нет ожидающих запросов на развертывание для одобрения или отклонения (Ошибка валидации)
Я также использую этот блок разрешений, без эффекта:
env:
GH_TOKEN: ${{ github.token }}
permissions:
checks: write
deployments: write
actions: write
Ответ или решение
Чтобы решить проблему с автоматическим утверждением развертывания через CLI или REST API в условиях, когда есть ожидающие развертывания, вам необходимо убедиться в нескольких аспектах вашего кода и логики работы с GitHub Actions.
-
Проверка состояния развертываний: Убедитесь, что ваше решение действительно получает ожидающее развертывание. Вы уже упомянули, что используете команду
gh api --verbose repos/$REPO/actions/runs/$RUNID/pending_deployments
, которая возвращает ожидающие развертывания. Это хороший первый шаг. Убедитесь, что перед тем как выполнять запрос на утверждение, вы действительно видите элементы вpending_deployments
. -
Правильный формат запроса на утверждение: В вашем текущем подходе к отправке запроса на утверждение развертывания через API вы используете неправильный формат. По документации GitHub, правильный формат запроса на утверждение должен включать JSON-тело. Исправьте ваш запрос следующим образом:
gh api --verbose \
repos/$REPO/actions/runs/$RUNID/pending_deployments \
--method POST \
-f state=approved \
-f comment="Auto-Approved by GitHub Actions" \
-F environment_ids[]=$ENVID
- Проверка прав доступа: Убедитесь, что ваш токен доступа (
GH_TOKEN
) имеет необходимые разрешения для выполнения операций с развертываниями. Вы уже добавили блок разрешений, но убедитесь, что токен действительно обладает этими правами:
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
permissions:
actions: write
deployments: write
checks: write
-
Параметризация: Убедитесь, что значения переменных
$REPO
,$RUNID
, и$ENVID
устанавливаются правильно и что на момент выполнения команды они содержат ожидаемые значения. -
Отладка ответа: Если после всех изменений вы все еще получаете сообщение "Validation Failed", добавьте дополнительный вывод информации для отладки. Например, выведите содержимое переменной
pending_deployments
, чтобы напечатать их и удостовериться, что вы работаете с правильными идентификаторами. -
Убедитесь, что вы подключены в правильной среде: Ваша GitHub Actions может запускаться в разных контекстах или ветках. Убедитесь, что вы работаете в том же контексте, где развертывания требуют вручного утверждения.
Надеюсь, эти рекомендации помогут вам успешно автоматизировать процесс утверждения развертывания через CLI или API. Если проблема будет сохраняться, рекомендуется обратиться в службу поддержки GitHub для дальнейшей помощи.