IT General
น้องๆ หลายคนอาจจะเคยได้ยินคำว่า CI/CD Pipeline กันมาบ้างแล้ว แต่ยังไม่ค่อยเข้าใจว่ามันคืออะไรกันแน่ เอาแบบง่ายๆ เลยนะ CI/CD มันคือระบบที่เราเอาไว้ทำ Automation ให้กับการพัฒนาโปรแกรมของเรา ตั้งแต่เริ่มเขียนโค้ด จนถึงเอาขึ้นไปให้ User ใช้งานกันจริงๆ
สมัยผมทำร้านเน็ต SiamCafe ใหม่ๆ เนี่ย การ Deploy โปรแกรมแต่ละทีนี่คือ "กรรม" เลย ต้องนั่ง FTP ไฟล์ขึ้นไปทีละไฟล์ แก้ Config ทีละบรรทัด แถมบางทีก็พลาด ลืมแก้บ้างอะไรบ้าง พอมี CI/CD เข้ามา ชีวิตมันง่ายขึ้นเยอะมากๆ
CI หรือ Continuous Integration คือการที่เราเอารวมโค้ดของทุกคนในทีมมาไว้ด้วยกันบ่อยๆ แล้วก็มีการ Test อัตโนมัติ เพื่อให้มั่นใจว่าโค้ดที่ทุกคนเขียนมามันไม่ตีกัน ไม่พัง
CD หรือ Continuous Delivery/Deployment คือการที่เราเอาโค้ดที่ Test ผ่านแล้ว ไปขึ้น Server ให้ User ใช้งานแบบอัตโนมัติ ไม่ต้องมานั่งทำเองทีละขั้นตอน
แล้วทำไมมันถึงสำคัญน่ะเหรอ? ก็เพราะว่ามันช่วยให้เรา:
ก่อนจะไปลงมือทำ CI/CD Pipeline ด้วย Github Actions กันจริงๆ ก็ต้องมีพื้นฐานกันนิดหน่อย จะได้ไม่งง
อันนี้พื้นฐานเลยนะ Git คือ Version Control System ที่เราใช้เก็บโค้ดของเรา Github ก็คือ Platform ที่เราเอาไว้ฝากโค้ด Git ของเราขึ้นไปบน Cloud
Github Actions ใช้ไฟล์ YAML ในการกำหนด Workflow หรือขั้นตอนการทำงานต่างๆ ดังนั้นเราต้องรู้จัก Syntax ของ YAML บ้างนิดหน่อย ไม่ต้องถึงกับ Expert แค่พออ่านออกเขียนได้ก็พอ
# ตัวอย่างไฟล์ YAML
name: My Workflow
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run a script
run: echo "Hello, world!"
ในตัวอย่างข้างบน เราบอกว่า Workflow นี้จะทำงานเมื่อมีการ Push โค้ดขึ้น Branch main แล้วก็จะ Run Script echo "Hello, world!" บน Ubuntu Server
ถ้าโปรเจคของเราใช้ Docker ก็จะยิ่งดี เพราะเราสามารถสร้าง Container Image ของโปรเจคเรา แล้วเอาไป Deploy ได้ง่ายขึ้น แต่ถ้ายังไม่เคยใช้ Docker ก็ไม่เป็นไร เรียนรู้ไปพร้อมๆ กันได้
Github Actions ใช้งานง่ายมาก แค่สร้างไฟล์ YAML ไว้ใน Folder .github/workflows ใน Repository ของเรา Github มันก็จะจัดการให้เอง
เริ่มจากสร้าง Folder .github/workflows ใน Root Directory ของโปรเจคเรา แล้วสร้างไฟล์ YAML ขึ้นมา เช่น main.yml
# .github/workflows/main.yml
name: Deploy to Production
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install Dependencies
run: npm install
- name: Build
run: npm run build
- name: Deploy to Server
run: |
# SSH เข้า Server แล้วสั่ง Deploy
ssh user@your-server "cd /var/www/your-project && git pull && npm install && npm run build && pm2 restart all"
Code ข้างบนเป็นตัวอย่างง่ายๆ ของ Workflow ที่จะ:
อย่าลืมแก้ user@your-server และ /var/www/your-project ให้เป็นข้อมูล Server ของเราจริงๆ ด้วยนะ
หลังจากที่เราสร้างไฟล์ YAML เสร็จแล้ว ก็ Commit และ Push ขึ้น Github ได้เลย Github Actions มันก็จะเริ่มทำงานเองอัตโนมัติ
เราสามารถเข้าไปดู Status ของ Workflow ได้ใน Tab "Actions" ใน Repository ของเรา จะเห็น Log ต่างๆ ว่า Workflow มันทำงานอะไรบ้าง สำเร็จหรือล้มเหลว
ถ้า Workflow ล้มเหลว ก็เข้าไปดู Log แล้วแก้ปัญหาซะ แล้วก็ Push ขึ้นไปใหม่ Github Actions มันก็จะ Run ใหม่อีกรอบ
ลองเข้าไปอ่านบทความอื่นๆ เกี่ยวกับ IT ได้ที่ SiamCafe Blog นะครับ มีอะไรดีๆ อีกเยอะเลย
ดูวิดีโอเพิ่มเติมเกี่ยวกับCicd Pipeline Github Actions:
Github Actions ไม่ใช่เครื่องมือ CI/CD ตัวเดียวในโลก ยังมีตัวเลือกอื่นๆ อีกมากมาย เช่น:
แต่ละตัวก็มีข้อดีข้อเสียแตกต่างกันไป ลองดูตารางเปรียบเทียบด้านล่างนี้:
| เครื่องมือ | ข้อดี | ข้อเสีย |
|---|---|---|
| Github Actions | ใช้งานง่าย, ฟรีสำหรับ Open Source, Integrated กับ Github | อาจจะไม่ Flexible เท่า Jenkins |
| Jenkins | Flexible มาก, มี Plugin เยอะ, Open Source | Setup ยาก, ต้อง Maintain เอง |
| Gitlab CI | Integrated กับ Gitlab, ใช้งานง่าย | อาจจะไม่ Powerful เท่า Jenkins |
| CircleCI | ใช้งานง่าย, Cloud-based | มีค่าใช้จ่าย |
สุดท้ายแล้วว่าจะเลือกใช้ตัวไหนก็ขึ้นอยู่กับความต้องการและความถนัดของแต่ละคน ลองศึกษาดูแล้วเลือกใช้ตัวที่เหมาะกับเราที่สุดครับ
ถ้าอยากรู้เรื่อง IT เจ๋งๆ อีก ไปตามอ่านกันได้ที่ SiamCafe Blog เลย
เอาล่ะน้องๆ มาถึงส่วนสำคัญแล้ว เรื่อง Best Practices หรือเคล็ดลับที่ผมสั่งสมมาจากการทำ CI/CD ด้วย Github Actions มานานโข สมัยผมทำร้านเน็ตนี่นะ กว่าจะได้อัพเดทเกมแต่ละที เลือดตาแทบกระเด็น ต้องมานั่งก็อปปี้ไฟล์ทีละเครื่อง ถ้ามี CI/CD ตั้งแต่ตอนนั้นนะ ชีวิตคงดีกว่านี้เยอะเลย
เทคนิคที่ผมจะบอกต่อไปนี้ เป็นสิ่งที่ผมใช้จริง และเห็นผลจริง ลองเอาไปปรับใช้กันดูนะ
อันนี้สำคัญมาก! น้องต้องแยก Environment ให้ชัดเจน ไม่ว่าจะเป็น Development, Staging, Production อย่าเอาทุกอย่างมารวมกันมั่วซั่ว สมัยก่อนผมเคยพลาดเอาโค้ด Development ไป Deploy ขึ้น Production ผลคือ... ร้านเกมเจ๊งไปครึ่งวัน เพราะบั๊กเพียบ
name: Deploy to Production
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
environment: production # ระบุ Environment ตรงนี้
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Deploy to server
run: echo "Deploying to production server..."
Test ให้เยอะที่สุดเท่าที่จะทำได้! ไม่ว่าจะเป็น Unit Test, Integration Test, End-to-End Test เขียน Test ครอบคลุมทุก Functionality ของโปรเจค น้องๆ อย่าขี้เกียจเขียน Test นะครับ เชื่อผมเถอะ มันช่วยชีวิตน้องได้เยอะเลย สมัยก่อนผมไม่ค่อย Test พออัพเดทโปรแกรมทีไร ต้องวิ่งวุ่นแก้บั๊กทุกที
name: Run Tests
on:
push:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test # คำสั่ง Run Test ของน้องๆ
พวก API Key, Password, Database Credentials อะไรพวกนี้ ห้าม Commit ขึ้น Github เด็ดขาด! ให้ใช้ Github Secrets แทน และจำกัดสิทธิ์การเข้าถึง Secrets ให้ดี สมัยก่อนผมเคยโดน Hack เพราะดัน Commit API Key ขึ้น Github ตั้งแต่นั้นมา เข็ดเลย
วิธีใช้ Secrets ใน Github Actions:
name: Deploy to Production
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Deploy to server
run: |
echo "Deploying with API Key: ${{ secrets.API_KEY }}" # เรียกใช้ Secrets
# ... คำสั่ง Deploy ...
เตรียมแผน Rollback เอาไว้เสมอ เผื่อ Deploy แล้วเกิดปัญหาอะไรขึ้นมา จะได้ Rollback กลับไป Version ก่อนหน้าได้อย่างรวดเร็ว สมัยผมทำร้านเน็ต เคย Deploy Patch เกมแล้วเกมเน่าทั้งร้าน ต้อง Rollback กลับไป Version เดิมแทบไม่ทัน
Github Actions มี Free Tier ให้ใช้ แต่ถ้าใช้เกิน Limit ก็ต้องเสียเงินเพิ่ม ลองเช็ครายละเอียด Pricing ใน Github Docs ดูนะ
ไม่จริง! Github Actions สามารถใช้ได้กับโปรเจคทุกขนาด ตั้งแต่โปรเจคเล็กๆ ไปจนถึงโปรเจคใหญ่ๆ ที่ซับซ้อน
มีเยอะแยะเลย เช่น Gitlab CI, Jenkins, CircleCI ลองศึกษาดูว่า Tool ไหนเหมาะกับโปรเจคของน้องมากที่สุด
CI/CD ด้วย Github Actions เป็น Tool ที่มีประโยชน์มาก ช่วยให้น้องๆ สามารถ Automate Process การ Build, Test, และ Deploy ได้อย่างมีประสิทธิภาพ ลองเอาไปปรับใช้กับโปรเจคของน้องๆ ดูนะครับ แล้วชีวิตจะง่ายขึ้นเยอะเลย SiamCafe Blog มีบทความดีๆ อีกเยอะ ลองเข้าไปอ่านกันดูนะ
อย่าลืมว่า Practice makes perfect! ลองทำ ลองผิด ลองถูก แล้วน้องๆ จะเก่งขึ้นเอง iCafeForex