การใช้งาน CI/CD Pipeline กับ PHP
ในบทก่อนหน้า เราได้เรียนรู้เกี่ยวกับการ Config Composer สำหรับ Project ขนาดใหญ่ เพื่อจัดการ Dependencies และเพิ่มประสิทธิภาพการโหลด Class ในโปรเจกต์ของเรา ในบทนี้ เราจะมาต่อยอดความรู้โดยการนำ CI/CD Pipeline มาใช้ เพื่อ Automate การ Build, Test และ Deploy โค้ด PHP ของเราอย่างมีประสิทธิภาพ
CI/CD คืออะไร และทำไมถึงสำคัญ?
CI/CD ย่อมาจาก Continuous Integration และ Continuous Delivery/Deployment เป็นแนวทางปฏิบัติในการพัฒนาซอฟต์แวร์ที่เน้นการ Automate กระบวนการตั้งแต่การ Build, Test, และ Deploy โค้ด เพื่อให้สามารถส่งมอบซอฟต์แวร์ที่มีคุณภาพได้อย่างรวดเร็วและสม่ำเสมอ
- Continuous Integration (CI): เน้นการรวมโค้ดจากนักพัฒนาหลายคนเข้าด้วยกันอย่างสม่ำเสมอ (เช่น ทุกวัน หรือทุกครั้งที่มีการ Commit โค้ด) พร้อมทั้งทำการ Build และ Test โค้ดโดยอัตโนมัติ เพื่อตรวจจับปัญหาตั้งแต่เนิ่นๆ
- Continuous Delivery (CD): เป็นการต่อยอดจาก CI โดย Automate กระบวนการ Release โค้ดไปยัง Staging Environment หรือ Production Environment ทำให้พร้อมที่จะ Deploy ได้ตลอดเวลา
- Continuous Deployment (CD): เป็นการ Automate กระบวนการ Deploy โค้ดไปยัง Production Environment โดยอัตโนมัติ เมื่อผ่านการ Test ทั้งหมดแล้ว
ทำไม CI/CD ถึงสำคัญ?
- ลดความเสี่ยง: ตรวจจับปัญหาตั้งแต่เนิ่นๆ ทำให้ลดความเสี่ยงในการ Deploy โค้ดที่มี Bug
- เพิ่มความเร็ว: Automate กระบวนการต่างๆ ทำให้ Deploy โค้ดได้เร็วขึ้น
- ปรับปรุงคุณภาพ: ทำการ Test อย่างสม่ำเสมอ ทำให้มั่นใจได้ว่าโค้ดมีคุณภาพ
- ลดภาระงาน: Automate งานที่น่าเบื่อ ทำให้ทีมพัฒนาสามารถโฟกัสกับงานที่สำคัญกว่าได้
เครื่องมือ CI/CD ที่นิยมใช้กับ PHP
มีเครื่องมือ CI/CD มากมายให้เลือกใช้ แต่ในบทนี้เราจะเน้นที่ 3 เครื่องมือที่นิยมใช้กับ PHP ได้แก่:
- Jenkins: เป็นเครื่องมือ CI/CD แบบ Open Source ที่ได้รับความนิยมมาอย่างยาวนาน มี Plugin มากมายให้เลือกใช้ และสามารถปรับแต่งได้หลากหลาย
- GitLab CI: เป็นเครื่องมือ CI/CD ที่รวมอยู่ใน GitLab Platform ทำให้สะดวกในการใช้งานสำหรับทีมที่ใช้ GitLab อยู่แล้ว
- GitHub Actions: เป็นเครื่องมือ CI/CD ที่รวมอยู่ใน GitHub Platform ทำให้สะดวกในการใช้งานสำหรับทีมที่ใช้ GitHub อยู่แล้ว
ตัวอย่างการใช้งาน Jenkins กับ PHP
Jenkins เป็นเครื่องมือ CI/CD ที่ต้องติดตั้งและ Config บน Server ของเราเอง (Self-Hosted) ซึ่งอาจจะยุ่งยากกว่าเครื่องมืออื่นๆ แต่ก็มีความยืดหยุ่นสูงกว่า
ขั้นตอนการใช้งาน Jenkins กับ PHP:
- ติดตั้ง Jenkins: ดาวน์โหลดและติดตั้ง Jenkins จาก https://www.jenkins.io/
- ติดตั้ง Plugin ที่จำเป็น: เช่น PHP, Composer, Git
- สร้าง Job ใหม่: ใน Jenkins ให้สร้าง Job ใหม่สำหรับ Project PHP ของเรา
- Config Source Code Management: กำหนดให้ Jenkins ดึงโค้ดจาก Git Repository ของเรา
- Config Build Steps: กำหนดขั้นตอนการ Build ที่ Jenkins จะต้องทำ เช่น:
- ติดตั้ง Dependencies ด้วย
composer install - รัน Unit Tests ด้วย
./vendor/bin/phpunit - รัน Static Analysis Tools
- ติดตั้ง Dependencies ด้วย
- Config Post-build Actions: กำหนดขั้นตอนหลังการ Build เช่น Deploy โค้ดไปยัง Staging Environment
- ทดสอบการ Build: กด Build Now เพื่อทดสอบว่า Jenkins สามารถ Build โค้ดของเราได้หรือไม่
ตัวอย่าง Jenkinsfile (Pipeline as Code):
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git 'https://github.com/your-username/your-repo.git'
}
}
stage('Install Dependencies') {
steps {
sh 'composer install'
}
}
stage('Run Tests') {
steps {
sh './vendor/bin/phpunit'
}
}
stage('Deploy to Staging') {
steps {
// Replace with your deployment script
sh 'echo "Deploying to staging..."'
}
}
}
}
คำอธิบาย:
agent any: กำหนดให้ Jenkins สามารถรัน Pipeline บน Agent ใดก็ได้stages: กำหนด Stage ต่างๆ ใน Pipelinestage('Checkout'): ดึงโค้ดจาก Git Repositorystage('Install Dependencies'): ติดตั้ง Dependencies ด้วย Composerstage('Run Tests'): รัน Unit Tests ด้วย PHPUnitstage('Deploy to Staging'): Deploy โค้ดไปยัง Staging Environment (ต้องปรับแต่งตาม Environment ของคุณ)
ตัวอย่างการใช้งาน GitLab CI กับ PHP
GitLab CI เป็นเครื่องมือ CI/CD ที่ใช้งานง่าย เพราะรวมอยู่ใน GitLab Platform อยู่แล้ว
ขั้นตอนการใช้งาน GitLab CI กับ PHP:
- สร้างไฟล์
.gitlab-ci.yml: สร้างไฟล์นี้ใน Root Directory ของ Project PHP ของเรา - กำหนด Stages: กำหนด Stage ต่างๆ ในไฟล์
.gitlab-ci.ymlเช่นbuild,test,deploy - กำหนด Jobs: กำหนด Job ต่างๆ ในแต่ละ Stage โดยระบุ Image Docker ที่จะใช้ และคำสั่งที่จะรัน
- Commit และ Push: Commit และ Push ไฟล์
.gitlab-ci.ymlไปยัง GitLab Repository - ตรวจสอบ Pipeline: GitLab จะทำการรัน Pipeline โดยอัตโนมัติ
ตัวอย่าง .gitlab-ci.yml:
image: php:7.4-cli
stages:
- build
- test
- deploy
build:
stage: build
script:
- composer install --no-interaction --prefer-dist
test:
stage: test
script:
- ./vendor/bin/phpunit
deploy:
stage: deploy
script:
# Replace with your deployment script
- echo "Deploying to production..."
only:
- master
คำอธิบาย:
image: php:7.4-cli: กำหนด Image Docker ที่จะใช้เป็น PHP 7.4 CLIstages: กำหนด Stage ต่างๆ ใน Pipelinebuild: Stage สำหรับการติดตั้ง Dependenciestest: Stage สำหรับการรัน Unit Testsdeploy: Stage สำหรับการ Deploy โค้ดไปยัง Production Environment (ต้องปรับแต่งตาม Environment ของคุณ)only: - master: กำหนดให้ Stagedeployรันเฉพาะเมื่อมีการ Push โค้ดไปยัง Branchmasterเท่านั้น
ตัวอย่างการใช้งาน GitHub Actions กับ PHP
GitHub Actions คล้ายกับ GitLab CI คือใช้งานง่ายและรวมอยู่ใน GitHub Platform อยู่แล้ว
ขั้นตอนการใช้งาน GitHub Actions กับ PHP:
- สร้าง Directory
.github/workflows: สร้าง Directory นี้ใน Root Directory ของ Project PHP ของเรา - สร้างไฟล์ YAML: สร้างไฟล์ YAML ใน Directory
.github/workflowsเช่นmain.yml - กำหนด Workflow: กำหนด Workflow ในไฟล์ YAML โดยระบุ Trigger, Jobs, และ Steps
- Commit และ Push: Commit และ Push ไฟล์ YAML ไปยัง GitHub Repository
- ตรวจสอบ Actions: GitHub จะทำการรัน Actions โดยอัตโนมัติ
ตัวอย่าง .github/workflows/main.yml:
name: PHP CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
extensions: mbstring, xml, mysql, intl, pdo, pdo_mysql
- name: Install Dependencies
run: composer install --no-interaction --prefer-dist
- name: Run Tests
run: ./vendor/bin/phpunit
คำอธิบาย:
name: PHP CI: กำหนดชื่อ Workflowon: กำหนด Trigger ที่จะทำให้ Workflow ทำงาน (เช่น Push หรือ Pull Request ไปยัง Branchmaster)jobs: กำหนด Jobs ต่างๆ ใน Workflowruns-on: ubuntu-latest: กำหนด Operating System ที่จะใช้รัน Jobsteps: กำหนด Steps ต่างๆ ในแต่ละ Jobuses: actions/checkout@v2: ใช้ Actionactions/checkout@v2เพื่อ Checkout โค้ดuses: shivammathur/setup-php@v2: ใช้ Actionshivammathur/setup-php@v2เพื่อ Setup PHPrun: composer install ...: รันคำสั่ง Composer เพื่อติดตั้ง Dependenciesrun: ./vendor/bin/phpunit: รันคำสั่ง PHPUnit เพื่อรัน Unit Tests
สรุป
การใช้งาน CI/CD Pipeline ช่วยให้เรา Automate กระบวนการ Build, Test, และ Deploy โค้ด PHP ของเราได้อย่างมีประสิทธิภาพ ทำให้สามารถส่งมอบซอฟต์แวร์ที่มีคุณภาพได้อย่างรวดเร็วและสม่ำเสมอ ในบทนี้เราได้เรียนรู้เกี่ยวกับ Jenkins, GitLab CI, และ GitHub Actions ซึ่งเป็นเครื่องมือ CI/CD ที่นิยมใช้กับ PHP คุณสามารถเลือกใช้เครื่องมือที่เหมาะสมกับ Project และทีมของคุณได้
ในบทถัดไป เราจะมาเรียนรู้เกี่ยวกับการทำ Security Audits สำหรับ PHP เพื่อตรวจสอบหาช่องโหว่ด้านความปลอดภัยในโค้ดของเรา