Вопрос или проблема
Я пытаюсь отфильтровать запросы на извлечение в Github. Если определенный PR существует, нам не нужно создавать PR для этого. Я включил код ниже, но получаю ошибку line 61: syntax error: unexpected end of file
Обычное название PR должно быть таким: = Проверка отклонения в ресурсе: $RESOURCE
echo "Проверяем, существует ли запрос на извлечение для '$RESOURCE'"
existing_pr=$(curl -s -H "Authorization: Bearer $(pat-token)" \
https://github.mytab.com/api/v3/repos/rep/rep-infra/pulls?state=open&head=drift-rep-${RESOURCE} \
| jq '.[] | select(.title | test("Проверка отклонения в ресурсе: '"$RESOURCE"'"))')
if [ -n "$existing_pr" ]; then
echo "Запрос на извлечение для '$RESOURCE' уже существует. Пропускаем создание PR."
else
echo "Создаем запрос на извлечение"
Возможные фатальные ошибки:
- Вам, похоже, не хватает
fi
послеif
. - Вам, похоже, есть некоторые
&
в нецитируемой строке. - Мне кажется, что
"$RESOURCE"
в командеjq
не будет отображаться в двойных кавычках для jq.
Другие соображения:
jq
имеет флаг--exit-status
, который, вероятно, более подходящий, чем[ -n "$existing_pr" ]
.- Подумайте о том, чтобы передать
RESOURCE
вjq
как переменную. - Вы уверены, что не хотите использовать
gh
для этого?
Возможно:
echo "Проверяем, существует ли запрос на извлечение для '$RESOURCE'"
gh_token=$(pat-token)
url="https://github.mytab.com/api/v3/repos/rep/rep-infra/pulls?state=open&head=drift-rep-${RESOURCE}"
jq='.[] |
select(.title |
test("Проверка отклонения в ресурсе: $resource"))'
json=$(curl -sfH "Authorization: Bearer $gh_token" "$url")
if jq --exit-status --arg resource "$RESOURCE" "$jq"; then
echo "Запрос на извлечение для '$RESOURCE' уже существует. Пропускаем создание PR."
else
echo 'Создаем запрос на извлечение сейчас'
fi
.
Ответ или решение
Для эффективного фильтрации запросов на вливание (Pull Requests) в GitHub, важно учитывать несколько ключевых аспектов в коде и логике, которые вы предоставили. Рассмотрим вашу задачу, а также предложим улучшенный вариант скрипта, избегая текущих ошибок и недочетов.
Анализ существующего кода
Ваш текущий код имеет критические проблемы:
-
Отсутствие
fi
: Каждое условиеif
в Shell должно завершаться соответствующимfi
. Вы пропустили этот элемент, что является причиной возникновения ошибкиsyntax error: unexpected end of file
. -
Неправильное использование символа
&
: В URL, который вы составляете, символ&
должен быть представлен как&
без HTML кода (&
). Это может вызывать проблемы с обработкой запроса. -
Передача переменной в
jq
: Ваша переменная$RESOURCE
не будет доступна вjq
, если вы передаете её как строку. Рекомендуется передавать её в качестве аргумента, используя--arg
. -
Опция
--exit-status
вjq
: Использование этой опции упрощает вашу логику, так какjq
сам будет возвращать статус, в зависимости от наличия искомого запроса на вливание.
Улучшенный код
Предлагаемая версия кода с исправлениями:
echo "Проверка существования запроса на вливание для '$RESOURCE'..."
gh_token=$(pat-token)
url="https://github.mytab.com/api/v3/repos/rep/rep-infra/pulls?state=open&head=drift-rep-${RESOURCE}"
jq_filter='.[] | select(.title | test("Проверка отклонения в ресурсе: $resource"))'
# Получаем JSON с запросами на вливание
json=$(curl -sfH "Authorization: Bearer $gh_token" "$url")
# Проверяем наличие существующего PR
if echo "$json" | jq --exit-status --arg resource "$RESOURCE" "$jq_filter"; then
echo "Запрос на вливание уже существует для '$RESOURCE'. Пропускаем создание PR."
else
echo 'Создание запроса на вливание...'
# Здесь добавьте код для создания PR
fi
Объяснение улучшений:
-
Структура и логика: Мы структурировали код для лучшего понимания. Каждая логическая часть выполняет свою функцию, и контрольные точки четко обозначены.
-
Экспрессия jq: Мы передаем значение переменной
RESOURCE
вjq
с помощью--arg
, что позволяет избежать проблем с интерполяцией. -
Проверка PR: Использование
echo "$json"
для передачи результата вjq
упрощает проверку наличия существующего PR и делает код более лаконичным.
Итоговые рекомендации
-
Используйте библиотеку GitHub CLI (gh): Это может значительно упростить интеграцию с GitHub и управление запросами на вливание. Если возможно, рассмотрите переход на использование
gh
. -
Логирование и отладка: Добавление логирования для ваших шагов поможет лучше идентифицировать проблемы при выполнении скрипта.
-
Тестирование и процесс CI/CD: Запускайте скрипты в тестовой среде перед интеграцией в производственный процесс. Это поможет избежать неожиданных ошибок.
Следуя этим рекомендациям, вы сможете успешно управлять запросами на вливание в вашем проекте GitHub, избегая распространенных ошибок и повышая качество работы вашего кода.