אם נשאל היום מפתחים מה כלי הפיתוח שהם לא יוכלו לחיות בלעדיו, כנראה שהתשובה הנפוצה תהיה Git.
גיט כולל בתוכו המון פיצ׳רים למעט השימוש העיקרי שלו, אחד מהפיצ׳רים השימושיים ביותר הוא Git Hooks.
הקדמה
כאשר עובדים בצוות על אותו הקוד, Git הוא כלי חובה אשר מאפשר לנו גם את האפשרות לעבוד ביחד על אותו ה-Code Base וגם לראות תיעוד של כל השינויים שהקוד עבר לאורך הזמן 👵🏽.
עבודה בצוות מביאה איתה אתגרים רבים, את חלקם ניתן לפתור ע״י הגדרת נהלים, אך ישנם אתגרים אשר ניתן לאכוף בצורה פשוטה יחסית, לדוגמא הרצת Unit Tests או פרמוט הקוד לפי Code Convensions של החברה.
מכיוון שאנחנו רוצים לשאוף למצב שתמיד הקוד שנמצא ב-Git יהיה איכותי ותקין, אנו צריכים לוודא לפני דחיפת הקוד כי הוא עומד בסטנדרטים.
ניתן להגדיר לכל מפתח בצוות שהוא מחוייב להריץ את הטסטים ולוודא שהקוד נצמד לסטנדרטים של החברה, אך ביננו, אי אפשר להסתמך על זה, כי גם אנשים שוכחים לאורך הזמן וגם כי תמיד אפשר פשוט להתעלם מזה ולדחוף את הקוד AS IS.
וכאן בדיוק נכנס Git Hooks!
מה זה Git Hooks?
Git Hooks הם אירועים אשר Git חושפים לנו על מנת שנוכל להאזין להם ולבצע פעולות לפני ואחרי שהם בוצעו. כאשר אנו עושים Commit לקוד, גיט יודיע לנו לפני שהפעולה מבוצעת וגם אחרי, ואנו נוכל להאזין לפעולות אלו ולהגדיר שקוד מסויים ירוץ 🏃🏽♂️.
לדוגמא, אם נרצה להריץ סגנון (Styling) של קוד לפני שמבוצע ה-Commit, נוכל להאזין לאירוע pre-commit
ולהגדיר לו להריץ את Prettier או כל ספרייה אחרת בה אנו משתמשים.
ישנם שני סוגי Hooks – צד לקוח וצד שרת:
- צד לקוח – אלו הוקים אשר רצים כאשר אנחנו כמפתחים מבצעים פעולות, כגון: Commit, Push וכד׳.
- צד שרת – אלו הוקים אשר רצים על שרת ה-Git שלנו, כגון: קבלת דחיפות קוד (Push).
לרשימת ה-Git Hooks הזמינים והסבר על כל אחד מהם אני ממליץ לעיין בדוקומנטציה הרשמית.
איך להשתמש ב-Git Hooks?
כאשר אנו מריצים את הפקודה git init
או כאשר אנו מבצעים Clone של ריפו למחשב שלנו, תחת תיקיית .git
תהיה תיקייה שנקראת hooks
אשר לרוב תכלול מספרי קבצי .sample
אשר כוללים פעולות לדוגמא אותן ניתן להריץ.
על מנת להשתמש ב-Git Hooks עלינו ליצור קובץ ללא סיומת אשר השם של הקובץ הוא ה-Hook אליו אנו רוצים להאזין, לדוגמא pre-commit
או pre-psuh
.
בתוך כל אחד מהקבצים הללו, אנו יכולים לכתוב פקודות Shell, קוד Python או Ruby וכד׳. בכללי אפשרי בכמעט כל שפת תכנות שקיימת.
מה זה Husky?
Husky הינה סיפרייה קלילה (6kb בקירוב) אשר מאפשרת לנו לנהל ולתחזק את הסקריטים שאנו רוצים שירוצו בצורה אוטומטית כאשר אירוע מסויים קורה, בפשטות ובסטייל 🐶.
שימוש ב-Husky מאפשר למפתחים ליצור תהליכים אוטומטיים ולהצמיד אותם לאירועים על מנת להקל על תהליך הפיתוח ולאפשר להם להתרכז בעיקר שהוא כתיבת קוד.
Husky נמצאת בשימוש בפרוייקטים נפוצים מאוד כמו Webpack, Angular, Rollup ועוד. הפשטות שלה והקלילות של חבילה זו גרמה לכך שמרבית התעשייה אימצה אותה ומשתמשת בה בתהליכי הפיתוח היום-יומיים.
התקנת Husky
על מנת להתקין את Husky נוכל להריץ פקודה אשר תעדכן את package.json
ותיצור לנו קובץ Hook של pre-commit
.
נפתח את הטרמינל וננווט לתיקייה של הפרוייקט שלנו ונריץ את הפקודה הבאה:
npx husky-init && npm install
לאחר סיום ההתקנה נוכל לראות כי נוספה לנו תיקייה בשם .husky
אשר כוללת קובץ pre-commit
.
הגדרת Git Hook
על מנת להגדיר Git Hooks, אנו יכולים ליצור ידנית קבצים תחת התיקייה .husky
או פשוט להשתמש ב-CLI ולהריץ פקודה במבנה הבא:
npx husky add .husky/[git-hook-name] '[my-command]'
לדוגמא:
npx husky add .husky/pre-commit 'echo "Hello World!"'
כעת כאשר נעשה Commit, ממש לפני שהפעולה תבוצע, אנחנו נראה בטרמינל את ההודעה "Hello World!".
שימושים נפוצים עם Husky
ישנם המון מקרים אשר נרצה להשתמש ב-Git Hooks בתהליכי הפיתוח שלנו, בהתאם לשפה בה אנחנו כותבים או לסיפריות בהן אנו משתמשים בקוד שלנו. להלן רשימה של כמה מקרים נפוצים אשר נפוצים בתעשייה 🤓.
שימוש ב-ESLint
במידה ויש לנו פרוייקט הכתוב ב-JavaScript או TypeScript ונרצה לוודא שהקוד שכתבנו עומד בסטנדרטים שהוגדרו ולוודא שאין בעיות, נוכל להשתמש ב-ESLint.
אנו נרצה לוודא שאנחנו כותבים קוד תקין ומסוגנן, על מנת לבצע זאת נוכל להאזין לאירוע pre-commit
על מנת למנוע מצב שמבוצע Commit במידה והקוד לא תקין או לפי נהלי ה-Code Conventions של הארגון.
# via NPM
npx husky add .husky/pre-commit 'npm run lint:js'
# Or
npm hsuky add .husky/pre-commit 'eslint .'
הרצת Unit Tests
כתיבת Unit Tests הם חלק בלתי נפרד מתהליך הפיתוח השוטף, אנו תמיד נרצה לשאוף לקוד עם כיסוי מקסימלי של טסטים. במידה ואנו כותבים פרוייקט ב-PHP, לרוב נשתמש ב-PHPUnit לכתיבה והרצה של Unit Tests.
רגע לפני דחיפת הקוד לשרת ה-Git המרוחק, אנו נרצה להריץ את ה-Unit Tests על מנת לוודא שלא שברנו משהו בקוד, לכן נגדיר האזנה לאירוע pre-push
.
# via Composer
npx husky add .husky/pre-psuh 'composer run test:unit'
# Or
npx husky add .husky/pre-push 'phpunit ./tests'
התקנת תלויות עדכניות
בתהליך עבודה מסודר לפני שאנו יוצרים בראנץ׳ חדש או בתחילת יום העבודה, אנו נבקש למשוך את השינויים משרת ה-Git המרוחק ע״י פעולת Pull.
בפרוייקטים גדולים ייתכנו שינויים בתלויות באופן שוטף, לכן על מנת לוודא שיש לנו את התלויות הכי עדכניות נרצה להתקין את התלויות העדכניות לאחר משיכה של הקוד, נוכל להאזין לאירוע post-merge
.
npx husky add .husky/post-merge 'npm ci'
סיכום
Git Hooks הוא פיצ׳ר נחמד אשר יכול להקל על עבודה הפיתוח היום-יומית שלנו, ולמנוע מאיתנו לדחוף קוד לא תקין ושבור.
שתפו בתגובות מה אתם עושים עם Git Hooks בעבודה היום-יומית שלכם 💪🏽.