رهگیری زمان با کامیت در گیت‌لب

چطور با یک دستور ضمن کامیت، زمان اجرای کار رو هم در گیت‌لب ثبت کنیم؟

یکی از ویژگی‌های گیت‌لب، امکان ثبت زمان تخمین و اجرای کارهاست. این کار به سادگی به کمک Quick Actionها انجام می‌شه. مثلاً اگر تخمین شما برای اجرای یک کار، یک ساعته به راحتی با کامنت گذاشتن عبارت زیر می‌تونید این زمان تخمینی رو به اون وظیفه (Issue) متصل کنید.

/estimate 1h

و برای اضافه کردن زمان واقعی اجرا هم از دستور سریع spend به شکل زیر می‌تونید استفاده کنید. در این مثال فرض می‌کنیم اجرای واقعی کار ۴۰ دقیقه طول کشیده.

/spend 40m

نمونه ثبت و نمایش رهگیری زمان در گیت‌لب

از اونجایی که از طریق commit message می‌شه بعضی کارها مثل مرتبط کردن و بستن اتوماتیک Issue در صورت Merge شدن commit رو در گیت‌لب انجام داد (در گیت‌هاب و سایرین هم کمابیش همینطوره) چندین ساله که درخواست شده امکان استفاده از قابلیت‌های رهگیری زمان اجرای کارها هم به commit messageها اضافه بشه ولی فعلاً پشتیبانی محدودی برای Quick Action وجود داره.

راه حل جایگزین Quick Action

برای اینکه بتونید این قابلیت رو داشته باشید که همزمان با commit کردن اطلاعات دیگه‌ای هم اضافه کنید، یک راه حل استفاده از Gitlab CLI به همراه تعریف یک function برای استفاده از قابلیت‌های CLI است.

بعد نصب CLI باید به Gitlab متصل بشید که بسته به اینکه از نسخه ابری استفاده می‌کنید یا نسخه self-hosted می‌تونید از روش OAuth یا Personal Access Token استفاده کنید که توضیحاتش در Readme پروژه CLI اومده.

حالا فرض کنید می‌خواهید همچین ساختاری داشته باشید:

gcptt 129 "actual commit message" 30m

که gcptt اسم اون function است که تعریف می‌کنیم و می‌تونه چند تا پارامتر ورودی داشته باشه:

پارامتر اول: شناسه Issue روی گیت‌لب.
پارامتر دوم: commit message که می‌خواهید ارسال کنید.
پارامتر سوم: زمانی که پیاده‌سازی کد طول کشیده و می‌خواهید در گیت‌لب ثبت کنید.

gcptt() {
    git add --all
    git commit -m "resolve #$1 $2"
    git push
    glab issue note $1 -m "/spend $3"
}

نمونه کد که می‌تونید توی فایل .zshrc قرار بدین.

حالا وقتی توی ترمینال روی repository هستین به راحتی می‌تونید با یک دستور هم commit و هم push و هم زمان رو ثبت کنید.

اگر بخواهید همزمان با push کردن یک Merge Request هم ایجاد کنید، به جای git push در خط چهارم می‌تونید از دستور git push -o merge_request.create --set-upstream origin HEAD استفاده کنید. من برای این هم یک alias تعریف کردم به اسم gmr و بعد به جای git push اون gmr رو قرار دادم.