מי אישר את ה Pull Request שלי?

פוסט זה כולל טיפ קצר לעבודה יעילה יותר עם Git.
בשביל להבין את גיט לעומק אני ממליץ על קורס גיט שלנו כאן באתר.
בקורס תלמדו איך גיט עובד מתחת למכסה המנוע ואיך להשתמש בו בצורה יעילה מהבסיס ועד לנושאים המתקדמים.

בגיטהאב אנחנו יכולים להסתכל בממשק הגרפי אחורה ולראות את כל הדיונים שהיו על Pull Request וגם מי אישר כל PR. אבל אם נחליט לקחת את הפרויקט החוצה מגיטהאב, או אם אנחנו עובדים בגיט משורת הפקודה, המידע הזה כבר לא זמין.

לא מזמן כתבתי כאן על מנגנון הפתקים בגיט. היום אני רוצה להראות דוגמה לשימוש בהם כדי שכל פעם שמישהו מאשר Pull Request השם שלו ייכתב בתוך הקומיט בתור Note, כך שנוכל להיזכר אחרי מכל מקום.

1. קוד ה Action

הטריק מבוסס על Github Actions, שזה מנגנון ה CI הפנימי של גיטהאב. אנחנו יכולים להגדיר שכל פעם שקורה משהו תופעל אוטומטית מכונה וירטואלית ותעשה משהו. במקרה שלנו נגדיר שכל פעם שמישהו משאיר Approve על Pull Request, תופעל מכונה שתשאיר פתק על הקומיט העדכני ביותר באותו PR.

הקוד של ה Action נקרא Workflow והוא שמור בקובץ yml בשם .github/workflows/main.yml. אפשר ליצור יותר מקובץ workflow אחד, רק חשוב לשים את כולם בתיקיה הנכונה.

זה הקוד לדוגמה שלנו:

jobs:
  approved:
    if: github.event.review.state == 'approved'
    runs-on: ubuntu-latest
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
    - uses: actions/checkout@v2
    - run: |
        git config --global user.name 'Github Action'
        git config --global user.email '<>'
        echo "Pull Request ${{ github.event.pull_request.number }} was approved by ${{ github.event.review.user.login }}"
        echo "Approved By: ${{github.event.review.user.login }}" | git notes append -F - ${{ github.event.pull_request.head.sha }}

        git push origin "refs/notes/*"

בואו נראה את עיקרי הדברים:

  1. בחלק הראשון אני מגדיר מתי ה Workflow ירוץ, זה יהיה כל פעם שמישהו משאיר review על Pull Request.

  2. בחלק השני אני מגדיר מה לעשות.

  3. הפקודה if מגדירה תנאי על האירוע, בסיפור שלנו אנחנו רוצים לטפל רק ב Reviews מסוג Approve.

  4. הגדרת משתנה הסביבה GITHUB_TOKEN מאפשרת ל Action לעשות פעולות בשמנו בתוך הריפו. במקרה שלנו הפעולה היא הוספת פתק.

  5. הכיף האמיתי מתחיל בתוך פקודת ה run - אני מגדיר את שם המשתמש והאימייל, מפעיל git notes append כדי ליצור פתק ודוחף את כל הפתקים למאגר.

  6. גיטהאב מעביר לי את כל האינפורמציה בתור משתנים ודואג להחלפה לערכים המתאימים. המשתנים זה מה שמופיע בתוך סוגריים מסולסלים כפולים, למשל ${{github.event.review.user.login }} עבור שם המשתמש של מי שהשאיר את ה Review, ו ${{ github.event.pull_request.head.sha }} עבור ה sha של הקומיט האחרון ב PR. בתיעוד אפשר למצוא את המבנה של כל האוביקטים שלהם.

2. משיכת הפתקים וצפיה בלוג

אחרי הגשת Pull Request ואישור שלו אני יכול לראות בטאב Actions את הפלט של ה Workflow. מה שיותר מעניין זה כמובן הפתק. בהרצה רגילה fetch לא מושך את הפתקים. בשביל למשוך אותם אני כותב את הפקודה:

$ git fetch origin refs/notes/commits:refs/notes/commits

ואחרי זה הפעלה של git log מראה ליד הקומיט העדכני ביותר ב PR את הפתק עם שם המשתמש שאישר אותו.

שימו לב רק שהמנגנון כאן עדיין בסיסי ובגדר טיוטה. הוא לא מטפל במחיקה או עריכה של ביקורת ובטח יש עוד כמה בעיות שלא חשבתי עליהן. אני מקווה שהוא יעזור לכם בתור בסיס ל Workflows שתרצו לכתוב.