Автоматически напоминать участникам о необходимости обновления их запросов на доработку

Итак, из своего небольшого профессионального опыта я понял, что если вы работаете с небольшой командой людей, то многие из них в итоге пишут множество запросов на обновление в 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 требует аутентификации, прежде чем вы сможете его использовать, мы уже сделали это, установив env GITHUB_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 шпаргалка

Оцените статью
devanswers.ru
Добавить комментарий