풀 요청을 업데이트하도록 기여자에게 자동으로 알림

그래서 짧은 전문 경험을 통해 소규모 개인 팀과 함께 작업하는 경우 많은 사람들이 결국 조직의 X개의 서로 다른 리포지토리에 걸쳐 여러 개의 풀 요청을 작성하게 되며, 이는 때때로 한 번에 여러 기능 PR을 관리하게 된다는 것을 깨달았습니다. 시각.

이로 인해 작성자가 브랜치를 업데이트하고 가능한 가장 안정적인(또는 최신) 버전으로 코드를 테스트하는 것을 잊어버릴 수 있습니다. 풀 리퀘스트의 수명은 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



위의 작업 흐름에서 우리는 저장소의 maindev 분기를 "감시"하여 새 푸시에 대해 해당 작업을 실행하도록 github에 지시합니다. 그렇다면 update-pr-reminder-action의 뒤에서 무슨 일이 벌어지고 있을까요?

우리는 github’s CLI tool, gh 과 일부 쉘 위자드라이와 결합된 간단한 쉘 스크립트를 사용합니다 ✨

#!/bin/bash

all_open_prs=$(gh pr list --base "${GITHUB_REF#refs/*/}" --json author,number)
printf "%s\n" "PRs with base ${GITHUB_REF#refs/*/}: $all_open_prs"
prs_count=$(echo "$all_open_prs" | jq length)
printf "%s\n" "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 "%s\n" "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 작업에서 자동으로 설정되는 environment variable입니다.

다음으로 gh 도구를 사용하여 열린 모든 공개 PR을 찾습니다.

gh pr list --base main --json author,number



Note: gh needs to authenticate before you can use it, we have already done this by setting the env GITHUB_TOKEN. gh uses this token to make any API requests



이것은 이와 같은 모든 열린 PR의 json 출력을 반환합니다.

[
  {
    "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



할 것



풀 리퀘스트가 병합되는 데 시간이 오래 걸리는 경우 스팸을 줄이기 위해 작성자 PR 내에 기본 브랜치 최신HEAD이 있는지 확인하여 브랜치가 최신인지 확인할 수도 있습니다.

마무리 생각



이상적으로는 이 기능이 scheduled reminders과 함께 존재해야 하지만 지금으로서는 충분한 솔루션이라고 생각합니다.

자원



이 워크플로를 작성하는 데 도움이 된 많은 리소스
  • Using Github CLI in workflows
  • jq cheatsheet
  • 좋은 웹페이지 즐겨찾기