GitHub Actions คืออะไร? เริ่มต้น CI/CD อย่างง่าย

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 ที่สมบูรณ์และสามารถจัดการได้ตามต้องการ