ในโลกของการพัฒนาซอฟต์แวร์สมัยใหม่ การรักษาคุณภาพโค้ด (Code Quality) และการตรวจจับข้อผิดพลาดตั้งแต่เนิ่นๆ เป็นสิ่งสำคัญอย่างยิ่ง เครื่องมือวิเคราะห์แบบคงที่ (Static Analysis Tools) เช่น ShellCheck ได้กลายเป็นมาตรฐานในการตรวจสอบสคริปต์ Bash เพื่อให้มั่นใจว่าทุกคำสั่งทำงานได้อย่างถูกต้องและปลอดภัย บทความนี้จะเจาะลึกวิธีการบูรณาการกระบวนการ Linting ของ ShellScript เข้ากับ GitHub Actions CI Pipeline อย่างเป็นระบบ ทำให้คุณสามารถรันการตรวจสอบเหล่านี้ได้โดยอัตโนมัติเมื่อมีการ Push หรือ Pull Request ใด ๆ
ทำไมต้องใช้ ShellCheck ใน CI/CD
Shell scripts คือหัวใจหลักของงาน Automation บน Linux แต่เนื่องจากภาษานี้มีไวยากรณ์ที่ไม่เข้มงวดเท่าภาษาโปรแกรมระดับสูงอื่น ๆ ข้อบกพร่องเล็กน้อยเพียงจุดเดียวก็อาจทำให้ Job ล่มหรือเกิดช่องโหว่ด้านความปลอดภัยตามมา
ShellCheck จะเข้ามาช่วยจำลองบทบาทของผู้รีวิวโค้ดที่มีประสบการณ์ โดยมันไม่ได้แค่แจ้งเตือนเรื่อง Syntax Error เท่านั้น แต่มักชี้ถึง Best Practices, Potential Security Vulnerabilities รวมถึงรูปแบบโครงสร้างที่ไม่แนะนำ ซึ่งเป็นการยกระดับมาตรฐานโค้ดของเราก่อนที่จะเข้าสู่ Production Environment จริง นี่คือแนวคิดของการ Shift-Left Testing ที่เราต้องการนำไปปฏิบัติ.
ขั้นตอนที่ 1: การตั้งค่า Workflow YAML สำหรับ GitHub Actions
ในการเริ่มใช้งาน เราจำเป็นต้องกำหนดไฟล์ workflow ย่อยในตำแหน่ง `.github/workflows/
name: Linting & Code Quality Check
on: [push] # หรือ pull_request หากคุณต้องการรันเฉพาะเมื่อมีการ PR เข้ามา
jobs: check_scripts: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # ดึง Source code มายัง Runner ก่อนเสมอ - name: Install ShellCheck Script Dependencies (Optional) # ติดตั้งเครื่องมือถ้าไม่แน่ใจว่างานมีอยู่แล้ว t r u c k l i n g dependencies:: run: | package man a autoconf libtool shellcheck
การใช้ `uses: actions/checkout@v4` เป็นสิ่งสำคัญที่สุด เพราะมันรับประกันว่าโค้ดทั้งหมดที่เราจะตรวจสอบนั้นถูกส่งไปยังสภาพแวดล้อมของ CI Worker อย่างสมบูรณ์ จากนั้นเราจึงเข้าสู่ขั้นตอนของการเรียกใช้คำสั่งจริง.
ขั้นตอนที่ 2: การกำหนดสคริปต์เพื่อรัน ShellCheck
หลังจากติดตั้ง Dependency แล้ว เราต้องเขียนบล็อก Step เพื่อให้ระบบรู้ว่าจะนำ Tool นี้ไปประมวลผลกับไฟล์ใดบ้าง สมมติว่าโปรเจกต์ของเราประกอบด้วยโฟลเดอร์ scripts และภายในมีหลายฟังก์ชันย่อย:
- name: Run Shell Check on Scripts Directory
run: shellcheck ./scripts/**/*.sh > lint_report.txt && cat lint_report.txt || echo