GitHub Actions คืออะไร
GitHub Actions เป็นแพลตฟอร์มอัตโนมัติที่ช่วยให้คุณสามารถสร้าง Workflow เพื่อทดสอบ บิลด์ ปรับเปลี่ยน และปรับใช้โค้ดได้โดยอัตโนมัติ ทุกครั้งที่มีการ Push Code หรือสร้าง Pull Request บนลิงค์ GitHub ของคุณ โดยทั้งหมดนี้ทำงานภายในสภาพแวดล้อมที่ GitHub จัดเตรียม ไม่ต้องติดตั้งเครื่องมือเพิ่มเติมหรือตั้งค่าเซิร์ฟเวอร์เองเหมือนกับ CI/CD Platform อื่นๆ
ประโยชน์หลักของ GitHub Actions
- ประหยัดเวลาและแรงงาน โดยทำให้ขั้นตอนที่ซ้ำหรือซับซ้อนเป็นไปโดยอัตโนมัติ
- ลดข้อผิดพลาดจากการทำงานแบบ Manual ที่อาจทำผิดหรือลืมขั้นตอน
- ทำให้กระบวนการ CI/CD สม่ำเสมอ และสร้างความมั่นใจ (confidence) ในแต่ละการ Deploy
- รวมเข้ากับ GitHub โดยตรง ไม่ต้องใช้ Tool ภายนอก เอกสารการตั้งค่าจะอยู่ในเดียวกัน
- ฟรีสำหรับ Public Repository และมีชั่วโมงการใช้งานฟรี (2000 นาทีต่อเดือน) สำหรับ Private Repository
- สนับสนุน Multiple Runner Environments: Linux, Windows, macOS และ Self-hosted runners
- ความยืดหยุ่นสูง: สามารถเขียน Custom Actions หรือใช้ Actions ที่สร้างโดยชุมชน
Workflow
Workflow คือไฟล์ YAML ที่เก็บไว้ในโฟลเดอร์ .github/workflows/ ของ Repository ไฟล์นี้กำหนดว่าจะมีการทำงานอะไร เมื่อไหร่ และจะใช้ Resources อะไร ซึ่งเหมือนเล่มคำสั่งสำหรับหุ่นยนต์ที่บอกมันต้องทำอะไร
Event
Event คือสิ่งที่ทำให้ Workflow ทำงาน เช่น push (เมื่อมีการ Push Code), pull_request (เมื่อมีการสร้าง/Update Pull Request), schedule (ตามเวลาที่กำหนด), หรือ workflow_dispatch (ทำงานด้วยตนเองผ่าน UI)
Job
Job คือชุดขั้นตอนที่ทำงานในหน่วย Runner เดียว ตัวอย่างเช่น Job “build” อาจประกอบด้วยขั้นตอน: checkout, install dependencies, build, และ upload artifacts ซึ่งทั้งหมดทำงานบน Runner เดียวกัน
Step
Step คืองานแต่ละงานที่ดำเนินการตามลำดับภายใน Job ได้แก่ Shell Commands (เช่น npm install) หรือ Actions (เช่น actions/checkout)
Runner
Runner คือเครื่องที่เรียกใช้ Workflow ตัวเลือก GitHub-hosted runners ได้แก่ ubuntu-latest, windows-latest, และ macos-latest หรือคุณสามารถตั้งค่า Self-hosted runner บน ผู้ให้บริการโฮสติ้ง Cloud VPS ของคุณเพื่อให้เต็มไปด้วยความยืดหยุ่นและควบคุมมากขึ้น
Action
Action คือ Application ที่สร้างขึ้นเพื่อลดการทำซ้ำใน Workflow ตัวอย่างเช่น actions/checkout ใช้สำหรับ checkout code, actions/setup-node ใช้สำหรับติดตั้ง Node.js version ที่ต้องการ Actions นี้ช่วยให้ไม่ต้องเขียนคำสั่งเดียวกันซ้ำๆ
ตัวอย่างที่ 1: Workflow สำหรับ Node.js Application
นี่คือตัวอย่าง Workflow ง่ายๆ สำหรับแอปพลิเคชัน Node.js ที่ทำการทดสอบกับเวอร์ชันหลายตัว:
name: Build and Test
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build --if-present
- name: Run tests
run: npm test
Workflow นี้จะทำงานเมื่อมีการ Push หรือสร้าง Pull Request ไปยัง Branch main และจะทดสอบโค้ดกับ Node.js เวอร์ชัน 14, 16 และ 18 ทั้งหมด ถ้า test ผ่านทั้งหมด Workflow จะสำเร็จ หากผ่านไม่หมด Workflow จะล้มเหลวและบอกให้ Developer ทราบ
วิธีการ Trigger Workflow ต่างๆ
Workflow สามารถทำงานตามเงื่อนไขหลากหลาย ผ่านการกำหนด Event ที่แตกต่างกัน:
- Push Event: ทำงานเมื่อมีการ Push code ไปยัง branch ที่เลือก
- Pull Request Event: ทำงานเมื่อสร้าง Pull Request หรือ Update Pull Request
- Schedule Event (Cron): ทำงานตามเวลาที่กำหนด เช่น ทุกวัน 9 โมงเช้า UTC
- Manual Trigger (workflow_dispatch): ทำงานด้วยตนเองจาก GitHub UI
- Release Event: ทำงานเมื่อมีการสร้าง Release
- Issue Event: ทำงานเมื่อมีการสร้างหรือ Update Issue
ตัวอย่างที่ 2: Workflow ที่ซับซ้อนกับ Scheduled Runs
name: Scheduled Build and Deploy
on:
schedule:
# ทำงานทุกวันเวลา 2:00 AM UTC
- cron: '0 2 * * *'
workflow_dispatch:
# อนุญาตให้ทำงานด้วยตนเองจาก GitHub UI
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install and test
run: |
npm ci
npm test
npm run build
GitHub Marketplace Actions
GitHub Marketplace มี Action สำเร็จรูปมากมายที่ชุมชนได้พัฒนาไว้ คุณสามารถใช้งานได้เลยโดยไม่ต้องเขียนโค้ด ประกอบด้วย:
- Deploy Actions: สำหรับการ Deploy ไปยัง AWS, Google Cloud, Azure, Heroku, VPS และอื่นๆ
- Notification Actions: สำหรับการส่งบอกเตือนไปยังทีม เช่น Slack, Email, Discord
- Testing Actions: สำหรับการทดสอบและ Coverage Reports
- Security Actions: สำหรับการสแกนความปลอดภัยและ Vulnerability scanning
- Database Actions: สำหรับการ Setup Database environments สำหรับ Testing
ตัวอย่างที่ 3: Complete CI/CD Pipeline
นี่คือตัวอย่างที่ซับซ้อนมากขึ้นสำหรับการสร้าง CI/CD Pipeline ที่สมบูรณ์ ซึ่งรวมถึง Lint, Test, Build, และ Deploy:
name: Complete CI/CD Pipeline
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm ci
- run: npm run lint
test:
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm ci
- run: npm test
- name: Upload coverage
uses: codecov/codecov-action@v3
build:
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm ci
- run: npm run build
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: build-artifact
path: dist/
deploy:
runs-on: ubuntu-latest
needs: build
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- name: Download build artifacts
uses: actions/download-artifact@v3
with:
name: build-artifact
path: dist/
- name: Deploy to VPS
env:
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
DEPLOY_PATH: /var/www/myapp
run: |
mkdir -p ~/.ssh
echo "$DEPLOY_KEY" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no user@$DEPLOY_HOST \
"cd $DEPLOY_PATH && git pull && npm install && npm run build"
rm ~/.ssh/deploy_key
Pipeline นี้ประกอบด้วย 4 Jobs ที่ทำงานตามลำดับ: Lint → Test → Build → Deploy โดยแต่ละ Job จะต้องผ่านการตรวจสอบก่อนจะไปยัง Job ต่อไป ซึ่งช่วยให้มั่นใจว่าโค้ดที่ Deploy ไปนั้นมีคุณภาพสูง
ตั้งค่า Secrets และ Variables
เมื่อต้องการใช้ข้อมูลที่มีความสำคัญเช่น API Keys, SSH Keys, หรือ Credentials ให้เก็บไว้ใน GitHub Secrets เพื่อความปลอดภัย
วิธีการเพิ่ม Secret
- ไปที่ Repository Settings > Secrets and variables > Actions
- คลิก “New repository secret”
- ใส่ชื่อ Secret (เช่น API_KEY, DEPLOY_KEY) และค่า Secret
- คลิก “Add secret”
- ใช้ใน Workflow ผ่าน
${{ secrets.SECRET_NAME }}
ข้อดีของการใช้ Secrets คือไม่จะมีการแสดงค่าใน Workflow Logs หรือการแจกแจงกับคนอื่นโดยไม่ตั้งใจ
ติดตามความเป็นไปของ Workflow
เมื่อ Workflow ทำงาน คุณสามารถติดตามสถานะได้จากแท็บ Actions ในไฟล์ Repository Pull Request View จะแสดง Status ของ Checks ว่าผ่านหรือล้มเหลว
วิธี Troubleshooting
- คลิกไปที่ Action ที่ล้มเหลวเพื่อดูรายละเอียด
- ดู Log files เพื่อหาสาเหตุของข้อผิดพลาด
- ตรวจสอบว่า Secrets ถูกตั้งค่าอย่างถูกต้อง
- ตรวจสอบ Syntax ของไฟล์ YAML ให้ถูกต้อง
- ใช้ GitHub Actions debugger script เพื่อวิเคราะห์ปัญหาได้ลึกขึ้น
ตัวเลือกที่ 1: Deploy ผ่าน SSH
ใช้ SSH Key เพื่อเชื่อมต่อไปยัง VPS และทำการ Deploy โค้ดโดยตรง
ตัวเลือกที่ 2: Self-hosted Runner
ติดตั้ง GitHub Actions Runner บน ผู้ให้บริการโฮสติ้ง Cloud VPS เพื่อให้มีการควบคุมเต็มที่ของสภาพแวดล้อม
ตัวเลือกที่ 3: Webhooks
ใช้ GitHub Webhooks ร่วมกับ Git Hooks บน VPS เพื่อ Deploy อัตโนมัติ
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการ Deploy ไปยัง VPS ลองอ้างอิง ตั้งค่า Git บน VPS ให้ Deploy เว็บอัตโนมัติด้วย SSH หรือ Webhooks สำหรับ Auto Deploy
Best Practices สำหรับการใช้ GitHub Actions
- เก็บ Secrets ให้ปลอดภัย: อย่าฝัง Secrets ในไฟล์ Workflow ให้ใช้ GitHub Secrets เสมอ
- ใช้ version tags สำหรับ Actions: ใช้เวอร์ชันเฉพาะแทน latest เพื่อความเสถียร
- ทดสอบ Workflow ก่อน Deploy: ใช้ feature branches เพื่อทดสอบ Workflow ก่อนที่จะ Deploy ไปยัง Production
- Monitor Workflow Execution: ติดตามประสิทธิภาพและเวลา Execution ของ Workflow
- ปรับแต่งตามความต้องการ: แต่ละโปรเจกต์มีความต้องการที่แตกต่างกัน ปรับแต่ง Workflow ให้เหมาะสมกับโปรเจกต์ของคุณ
การเปรียบเทียบกับเครื่องมือ CI/CD อื่น
หากคุณต้องการเรียนรู้เกี่ยวกับวิธี CI/CD อื่นๆ สามารถอ้างอิง GitLab CI/CD Pipeline สำหรับ Deploy บน VPS หรือ Pre-commit Hook สำหรับการตรวจสอบอัตโนมัติ เพื่อให้เข้าใจวิธีการต่างๆ
สรุป
GitHub Actions เป็นเครื่องมือที่ทรงพลังและใช้งานง่ายสำหรับอัตโนมัติ CI/CD Pipeline ของคุณ ช่วยให้การพัฒนา Software มีประสิทธิภาพ น่าเชื่อถือได้มากขึ้น และลดข้อผิดพลาดจากการทำงานด้วยมือ ด้วยการรวมเข้ากับ GitHub โดยตรง ทำให้ง่ายต่อการตั้งค่าและจัดการ Workflow ผู้ให้บริการโฮสติ้ง Cloud VPS ให้บริการ Infrastructure ที่เหมาะสำหรับการรัน Self-hosted Runners และการ Deploy Applications ที่ต้องการการควบคุมเต็มที่ ด้วยการผสมผสาน GitHub Actions และ ผู้ให้บริการโฮสติ้ง Cloud VPS คุณจะมีระบบ CI/CD ที่สมบูรณ์และสามารถจัดการได้ตามต้องการ
