Итак, из своего небольшого профессионального опыта я понял, что если вы работаете с небольшой командой людей, то многие из них в итоге пишут множество запросов на обновление в X различных репозиториях организации, что иногда приводит к управлению несколькими PR-функциями одновременно.
Это иногда приводит к тому, что автор забывает обновлять свои ветки и тестировать код на самой стабильной (или последней) версии. Поскольку время жизни pull request может составлять от 1 дня до 1 недели, очень важно поддерживать свои ветки в актуальном состоянии. Но мы, разработчики, забываем делать это своевременно.
Это проблема не только небольших команд, но и проектов с открытым исходным кодом (будь то маленькие или большие).
Как исправить?
Я пошел дальше и сделал минимальное действие на github, чтобы решить вышеупомянутую проблему, напоминая соавторам о необходимости обновлять свои ветки каждый раз, когда базовая ветка получает новый коммит. Мы можем сделать это, просто оставив комментарий к запросам на исправление (вы можете увидеть демонстрацию в баннере этого поста).
Вот простой рабочий процесс, как настроить это действие
name: PR Update Reminder
on:
push:
branches:
- main
- dev
env:
# make sure to set this as env
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
jobs:
remind_authors:
runs-on: ubuntu-latest
name: Update PR Reminder Test
steps:
- uses: actions/checkout@v2
- uses: Bhupesh-V/update-pr-reminder-action@main
В приведенном выше рабочем процессе мы говорим github «следить» за ветками main
и dev
нашего репозитория на предмет новых вбросов и запускать соответствующее действие. Что же происходит за кулисами update-pr-reminder-action?
Мы используем простой shell-скрипт в сочетании с CLI-инструментом github, gh
и некоторыми shell-визардами ✨.
#!/bin/bash
all_open_prs=$(gh pr list --base "${GITHUB_REF#refs/*/}" --json author,number)
printf "%sn" "PRs with base ${GITHUB_REF#refs/*/}: $all_open_prs"
prs_count=$(echo "$all_open_prs" | jq length)
printf "%sn" "There are currently $prs_count open PRs"
for (( c=0; c<$prs_count; c++ )); do
pr_id=$(echo "$all_open_prs" | jq .["$c"].number)
author=$(echo "$all_open_prs" | jq .["$c"].author.login | tr -d '"')
printf "%sn" "Author for PR $pr_id is $author"
gh pr comment $pr_id --body "Hey @$author 👋🏽 friendly reminder to update your PR/branch because there was a recent commit ($(git rev-parse HEAD)) to the base branch"
done
Первое, что нам нужно сделать, это найти текущую ветку, что делается по ${GITHUB_REF#refs/*/}
, где GITHUB_REF
— переменная окружения, которая устанавливается автоматически при каждом действии на github.
Далее мы находим все открытые PR, открытые с помощью инструмента gh
.
gh pr list --base main --json author,number
Примечание:
gh
требует аутентификации, прежде чем вы сможете его использовать, мы уже сделали это, установив envGITHUB_TOKEN
.gh
использует этот токен для выполнения любых запросов API.
В результате мы получим json-файл со всеми открытыми PR, как показано ниже.
[
{
"author": {
"login": "Bhupesh-V"
},
"number": 400
},
{
"author": {
"login": "some-dev"
},
"number": 402
},
...
]
Для разбора json мы используем jq
,
# get pull request id
basename "$(echo "$all_open_prs" | jq .["$c"].number)"
Создать комментарий очень просто,
gh pr comment $pr_id --body "Comment body"
Если вы видите тело комментария в нашем действии, мы также ссылаемся на последний коммит базовой ветки с помощью git rev-parse HEAD
.
Hey @$author 👋🏽 friendly reminder to update your PR/branch because there was a recent merge ($(git rev-parse HEAD)) to the base branch
TODO
Чтобы уменьшить количество спама в случае, если запрос на слияние занимает больше времени, мы также можем проверить актуальность ветки, проверив, присутствует ли последний коммит базовой ветки HEAD
в авторском PR.
Заключительные размышления
В идеале эта функция должна существовать наряду с запланированными напоминаниями, тем не менее, я считаю, что это достаточно хорошее решение на данный момент.
Ресурсы
Множество ресурсов, которые помогли мне написать этот рабочий процесс
- Использование Github CLI в рабочих процессах
jq
шпаргалка