Git

ตั้งค่า 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 ได้อย่างมั่นใจและมีประสิทธิภาพ

บทความที่เกี่ยวข้อง

แท็กGit