รัน rubocop ก่อน commit
บทนำ
Git hooks ทรงพลังมากสำหรับการทำงานแบบอัตโนมัติและการบังคับใช้มาตรฐานการเขียนโค้ดใน Git repository หนึ่งใน use case ที่พบบ่อยของ Git hooks คือการรัน test อัตโนมัติและเครื่องมือวิเคราะห์โค้ดก่อนที่จะยอมให้ commit ผ่านได้ ในบทความนี้เราจะพูดถึง pre-commit hook วิธีข้ามมัน และวิธีตั้งค่า pre-commit hook เพื่อรัน Rubocop ซึ่งเป็นเครื่องมือวิเคราะห์โค้ด Ruby
Rubocop คืออะไร?
Rubocop คือเครื่องมือ static code analysis สำหรับ Ruby ที่ตรวจสอบโค้ดทั้งเรื่อง style และปัญหาด้านความปลอดภัย เป็นเครื่องมือยอดนิยมในหมู่นักพัฒนา Ruby เพื่อให้แน่ใจว่าโค้ดเป็นไปตาม Ruby style guide และ best practice ต่าง ๆ Rubocop สามารถรันด้วยมือได้ แต่การผูกมันเข้ากับ pre-commit hook จะช่วยให้โค้ดถูกตรวจสอบโดยอัตโนมัติก่อนทุก commit
คัดลอกโค้ดนี้ไปไว้ใน .git/hooks/pre-commit (ลบ .sample ออก)
#!/usr/bin/env ruby
require 'english'
require 'rubocop'
ADDED_OR_MODIFIED = /A|AM|^M/.freeze
changed_files = `git status --porcelain`.split(/\n/).
select { |file_name_with_status|
file_name_with_status =~ ADDED_OR_MODIFIED
}.
map { |file_name_with_status|
file_name_with_status.split(' ')[1]
}.
select { |file_name|
File.extname(file_name) == '.rb'
}.join(' ')
system("rubocop #{changed_files}") unless changed_files.empty?
exit $CHILD_STATUS.exitstatus
ทำให้ไฟล์รันได้
$ chmod +x .git/hooks/pre-commit
เท่านี้ก็พร้อมใช้งาน จากนี้ไปมันจะรัน rubocop กับการเปลี่ยนแปลงของคุณ และจะไม่ยอมให้ commit จนกว่าคุณจะแก้ offence ที่พบ
จะข้าม pre-commit ได้อย่างไร? แค่ส่ง -n ให้ git commit
$ git commit -n -m "[hotfix] blah blah"
Pre-Commit Hook คืออะไร?
pre-commit hook คือ Git hook ฝั่ง client ที่รันก่อนที่ commit จะถูกสร้าง มันคือสคริปต์ที่ทำได้หลายอย่าง เช่น รัน test อัตโนมัติ ตรวจสอบ style ของโค้ด หรือบังคับใช้มาตรฐานการเขียนโค้ด ถ้า pre-commit hook ล้มเหลว commit นั้นจะถูกยกเลิก และคุณต้องแก้ปัญหาก่อนจะ commit ใหม่อีกครั้ง
ทำไมต้องรัน Rubocop ก่อน Commit
การรัน Rubocop ก่อน commit มีข้อดีหลายอย่าง:
- คุณภาพโค้ด: Rubocop ตรวจสอบโค้ดทั้งเรื่อง style และปัญหาด้านความปลอดภัย ทำให้ codebase สม่ำเสมอและปลอดภัย
- ประหยัดเวลา: การรัน Rubocop โดยอัตโนมัติก่อน commit ช่วยให้จับปัญหาได้ตั้งแต่เนิ่น ๆ และไม่ต้องเสียเวลา debug ทีหลัง
- การทำงานร่วมกัน: การบังคับใช้มาตรฐานการเขียนโค้ดผ่าน pre-commit hook ช่วยส่งเสริมการทำงานร่วมกันและความสม่ำเสมอในทีม
วิธีตั้งค่า pre-commit hook
- ติดตั้ง Rubocop และเครื่องมือ pre-commit hook ที่คุณเลือก (เช่น Husky หรือ Pre-commit)
- สร้างไฟล์ใหม่ชื่อ pre-commit ในไดเรกทอรี .git/hooks
- เพิ่มคำสั่ง Rubocop ลงในไฟล์ pre-commit เช่น rubocop -a
- ทำให้ไฟล์ pre-commit รันได้ด้วยการรัน chmod +x .git/hooks/pre-commit
- ทดสอบ pre-commit hook ด้วยการรัน git commit -m “Test commit”
หมายเหตุ: ถ้าต้องการข้าม pre-commit hook ชั่วคราว ให้ใช้ตัวเลือก --no-verify กับคำสั่ง git commit เช่น git commit -m “Test commit” --no-verify