ตั้งค่า GitLab CI/CD Pipeline สำหรับ Deploy บน VPS
GitLab CI/CD Pipeline: ตั้งค่า Automation สำหรับ Deploy บน VPS
GitLab CI/CD Pipeline เป็นระบบที่ทรงพลังสำหรับการสร้างกระบวนการ Build, Test, และ Deploy ให้เป็นอัตโนมัติ ผ่านไฟล์ .gitlab-ci.yml ที่วางไว้ที่ Root ของ Repository โดยให้ทีมของคุณสามารถจัดการการ Deploy บน VPS หรือ Server ใดๆ ได้อย่างปลอดภัยและมีประสิทธิภาพ
GitLab CI/CD Pipeline คืออะไร?
GitLab CI/CD Pipeline ช่วยให้คุณสามารถสร้างกระบวนการ Build, Test, และ Deploy ให้เป็นอัตโนมัติ ผ่านไฟล์ .gitlab-ci.yml ที่วางไว้ที่ Root ของ Repository บนเซิร์ฟเวอร์ GitLab ของคุณบน VPS ทุกครั้งที่มีการ Push Code ไป Repository จะเรียกใช้ Pipeline โดยอัตโนมัติ และทำการทดสอบตลอดจนการปรับใช้งานให้เป็นไปตามขั้นตอนที่กำหนด
ประโยชน์หลักของ GitLab CI/CD Pipeline
- สร้างและทดสอบโค้ดโดยอัตโนมัติ: เมื่อมีการ Push Code ไป Repository จะมีการสร้าง Build และรัน Test โดยอัตโนมัติทันที
- ลดข้อผิดพลาดจากการทำงานแบบ Manual: หากระบบทำงานแบบอัตโนมัติ จะลดอัตราการเกิดข้อผิดพลาดจากการทำงานด้วยมือของมนุษย์
- เพิ่มความเร็วในการ Deploy: ไม่จำเป็นต้องทำการ Deploy ด้วยตนเอง สามารถทำให้เป็นไปอัตโนมัติ ลดเวลาในการปรับใช้งาน
- สามารถควบคุมการ Deploy ได้อย่างเต็มที่: มีการตั้งค่าตัวแปร Secrets และการรักษาความปลอดภัยในระดับสูง
- มีความยืดหยุ่นในการตั้งค่า Pipeline: สามารถกำหนด Stage ต่างๆ ได้ตามความต้องการ และสามารถเพิ่ม Condition หรือ Rules ได้
- เฝ้าระวังคุณภาพโค้ด: รัน Unit Tests, Integration Tests, Code Coverage เพื่อแน่ใจว่า Code มีคุณภาพสูง
- ประมวลผล Artifacts: เก็บไฟล์ที่สร้างจาก Build เพื่อนำไปใช้ในขั้นตอน Deploy
โครงสร้างพื้นฐาน .gitlab-ci.yml
ไฟล์ .gitlab-ci.yml อยู่ที่ Root ของ Repository และกำหนด Pipeline ของคุณ โครงสร้างพื้นฐานมีดังนี้:
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- echo "Building application..."
- npm install
- npm run build
test_job:
stage: test
script:
- echo "Running tests..."
- npm test
deploy_job:
stage: deploy
script:
- echo "Deploying to VPS..."
- scp -r dist/* user@vps.example.com:/var/www/app/
only:
- main
Stages และลำดับการทำงาน
GitLab Pipeline จะทำงานตามลำดับ Stages ที่กำหนด ในตัวอย่างด้านบนมี 3 Stages:
- Build Stage: รวบรวม Code และสร้าง Artifact เพื่อให้พร้อม Deploy เช่น Compilation หรือ Bundling JavaScript
- Test Stage: เรียกใช้ Unit Tests, Integration Tests, E2E Tests และการตรวจสอบ Code Quality
- Deploy Stage: อัปโหลด Application ไปยัง VPS หรือ Server ปลายน้ำ โดยใช้ SSH หรือวิธีอื่นๆ
หากแต่ละ Stage ประสบความสำเร็จ Pipeline จะไปยัง Stage ถัดไป หากขั้นตอนใดล้มเหลว Pipeline จะหยุดและแจ้งเตือนให้ผู้พัฒนารู้ว่า มีปัญหาที่ต้องแก้ไข
SSH Deploy ไปยัง VPS: ปลอดภัยและเป็นที่นิยม
สำหรับการ Deploy ปลอดภัย ให้ใช้ SSH Keys แทน Password ซึ่งช่วยเพิ่มความปลอดภัยอย่างมาก และลดความเสี่ยงจากการเปิดเผยรหัสผ่าน
ขั้นตอนการตั้งค่า SSH Deploy:
- สร้าง SSH Key pair: สร้าง SSH Key ในเครื่องของคุณ โดยใช้คำสั่ง ssh-keygen หรือใช้ key ที่มีอยู่เดิม
- เพิ่ม Public Key ไปยัง VPS: เพิ่ม Public Key ไปยัง ~/.ssh/authorized_keys บน VPS เพื่อให้ GitLab Runner สามารถเชื่อมต่อได้
- บันทึก Private Key ใน GitLab CI/CD Variables: ใส่ Private Key ลงใน GitLab CI/CD Variables โดยตั้งชื่อเป็น DEPLOY_KEY เพื่อความปลอดภัย
- ใช้ Private Key ใน Pipeline Script: เรียกใช้ Private Key ใน Pipeline Script เพื่อเชื่อมต่อและ Deploy โดยไม่ต้องเข้า Password
Environment Variables สำหรับ Secrets และ Configuration
ใช้ GitLab CI/CD Variables เพื่อเก็บข้อมูลสำคัญอย่างปลอดภัย เช่น SSH Keys, Database Passwords, API Keys และข้อมูลอื่นๆ ที่ไม่ควรแสดงในโค้ด
deploy_to_vps:
stage: deploy
script:
- mkdir -p ~/.ssh
- echo "$DEPLOY_KEY" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 700 ~/.ssh/id_rsa
- ssh-keyscan -H $VPS_HOST >> ~/.ssh/known_hosts
- scp -r build/* $VPS_USER@$VPS_HOST:$VPS_PATH/
only:
- main
ตัวแปร DEPLOY_KEY, VPS_HOST, VPS_USER และ VPS_PATH ต้องถูกตั้งค่าไว้ใน Project Settings > CI/CD > Variables โดยมี Visibility ตั้งเป็น Protected และ Masked เพื่อความปลอดภัยสูงสุด
ตัวอย่าง Complete Pipeline สำหรับ Node.js Application
นี่คือตัวอย่างที่สมบูรณ์ของ Pipeline สำหรับการ Build, Test และ Deploy Node.js Application บน VPS:
image: node:16
stages:
- build
- test
- deploy
variables:
VPS_HOST: "your-vps.example.com"
VPS_USER: "deploy"
VPS_PATH: "/var/www/app"
build:
stage: build
script:
- npm install
- npm run build
artifacts:
paths:
- build/
expire_in: 1 week
test:
stage: test
script:
- npm install
- npm test
coverage: '/Coverage: (\d+\.\d+)%/'
deploy:
stage: deploy
script:
- mkdir -p ~/.ssh
- echo "$DEPLOY_KEY" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $VPS_HOST >> ~/.ssh/known_hosts 2>/dev/null
- ssh -i ~/.ssh/id_rsa $VPS_USER@$VPS_HOST "cd $VPS_PATH && git pull origin main && npm install && npm run build"
only:
- main
when: manual
Artifacts และ Caching เพื่อเร่งความเร็ว Pipeline
GitLab Pipeline สามารถเก็บไฟล์ Artifacts เพื่อใช้ใน Stage ต่อไป และใช้ Caching เพื่อเร่งความเร็ว Build โดยไม่ต้องดาวน์โหลด Dependencies ใหม่ทุกครั้ง
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
build:
stage: build
script:
- npm ci
- npm run build
artifacts:
paths:
- dist/
expire_in: 7 days
ด้วยการตั้งค่า Cache สำหรับโฟลเดอร์ node_modules/ คุณสามารถลดเวลา Build ได้อย่างมาก เนื่องจาก npm dependencies จะถูกเก็บไว้และนำกลับมาใช้ได้ถ้ายังไม่มีการเปลี่ยนแปลง package.json
การแจ้งเตือน (Notifications) เมื่อ Pipeline เสร็จสิ้น
GitLab สามารถส่งการแจ้งเตือนไปยัง Slack หรือ Email เมื่อ Pipeline ประสบความสำเร็จหรือล้มเหลว ช่วยให้ทีมคุณทราบสถานะการ Deploy ทันทีที่เสร็จสิ้น
notify_slack:
stage: deploy
script:
- 'curl -X POST -H "Content-type: application/json" --data "{\"text\":\"Deployment completed\"}" $SLACK_WEBHOOK'
when: on_success
Rules และ Conditions: ควบคุมเมื่อไหร่ที่ Pipeline ควร Run
คุณสามารถตั้งค่า Rules เพื่อควบคุมว่า Job ไหนควร Run เมื่อไหร่ โดยใช้เงื่อนไขต่างๆ เช่น branch, tags, merge requests หรือเหตุการณ์อื่นๆ
deploy:
stage: deploy
script:
- ./deploy.sh
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
when: always
- when: never
การเปรียบเทียบกับ GitHub Actions
หากคุณต้องการเรียนรู้เกี่ยวกับ CI/CD เครื่องมืออื่น ลองดู GitHub Actions CI/CD ซึ่งมีวิธีการคล้ายกันแต่รวมเข้ากับ GitHub โดยตรง สำหรับผู้ที่ใช้ GitHub Repository
การตั้งค่า Self-Hosted Runner สำหรับการควบคุมเต็มที่
หากต้องการควบคุมสภาพแวดล้อม Build ได้เต็มที่ คุณสามารถติดตั้ง Self-Hosted GitLab Runner บน VPS ของตนเอง ให้ Runner ทำงานในสภาพแวดล้อมที่คุณจัดเตรียมไว้ โดยไม่ต้องพึ่งพา Shared Runners จาก GitLab.com
ตัวอย่าง Webhook Auto Deploy
สำหรับการ Deploy อัตโนมัติเมื่อมีการ Push ให้ใช้ Webhooks สำหรับ Auto Deploy หรือ Git VPS Auto Deploy ผ่าน SSH เพื่อให้ทุกครั้งที่มี Commit ใหม่เข้ามา ระบบจะ Deploy โดยอัตโนมัติ
Best Practices สำหรับ GitLab CI/CD Pipeline
- แบ่ง Pipeline ออกเป็น Stages: ทำให้ Pipeline ชัดเจนและสามารถจัดการได้ง่าย
- ใช้ Caching: ลดเวลา Build โดยการ Cache Dependencies
- ตั้งค่า Timeout: ป้องกันไม่ให้ Job ทำงานนานเกินไปและหยุด Pipeline
- ใช้ Protected Variables: เก็บรหัสผ่านและ API Keys อย่างปลอดภัย
- ทำการ Test อย่างครบถ้วน: รัน Unit Tests และ Integration Tests เพื่อแน่ใจว่า Code มีคุณภาพ
- Monitor Pipeline Performance: ดูว่า Pipeline ใช้เวลานานแค่ไหนและจำนวน Resource ที่ใช้
- Documentation: เขียนเอกสารอธิบายขั้นตอนต่างๆ ใน Pipeline เพื่อให้ทีมเข้าใจ
Cloud VPS ที่เหมาะสำหรับ GitLab CI/CD Pipeline
Dot Enterprise มี บริการ Cloud VPS ที่เหมาะสำหรับการรัน GitLab CI/CD Pipeline ด้วยสเปค Hardware ที่พอ และสนับสนุนการตั้งค่า Server ให้คำแนะนำโดยทีมผู้เชี่ยวชาญ ทีมของคุณสามารถตั้งค่า Self-Hosted GitLab Runner บน VPS ได้อย่างง่ายดาย
สรุป
GitLab CI/CD Pipeline ช่วยให้การ Deploy ไปยัง VPS เป็นไปอย่างอัตโนมัติและปลอดภัย ลดความเสี่ยงจากการทำงานแบบ Manual ด้วยการตั้งค่า .gitlab-ci.yml อย่างถูกต้อง คุณสามารถสร้างระบบ CI/CD ที่เชื่อถือได้และเร็วพอ Dot Enterprise มี บริการ Cloud VPS ที่เหมาะสำหรับการรัน GitLab CI/CD Pipeline ด้วยสเปค Hardware ที่พียง และสนับสนุนการตั้งค่า Server ให้คำแนะนำโดยทีมผู้เชี่ยวชาญ ช่วยให้คุณเริ่มต้นการใช้งาน CI/CD ได้อย่างมั่นใจและมีประสิทธิภาพ
บทความที่เกี่ยวข้อง
- CI/CD Pipeline GitHub Actions
- Webhooks Auto Deploy
- ตั้งค่า Git VPS Deploy
- Deployment Pipeline Multiple Environments