
บทความนี้ผมจะมาแชร์ประสบการณ์ในการทำ CI/CD สำหรับเว็บไซต์ PHP Application จากที่ได้ลองทำมาหลาย Stack แล้ว ผมคิดว่า Stack ที่ผมทำปัจจุบันน่าจะ OK ที่สุดละ (เข้าข้างตัวเอง)
โดยจะขอยกตัวอย่างสำหรับ Laravel 5 ทำหน้าเว็บไซต์ ซึ่งถ้าเป็น php framework อื่นก็น่าจะแนวๆ เดียวกันได้

สังเกตุจาก diagram ด้านบนทำให้เราสามารถแยก scale เฉพาะ nignx หรือ phpfpm ได้เลย โดยผมได้ทำ code ตัวอย่างไว้ให้แล้วตามนี้
สามารถ clone มาลองดูได้
หลังจาก clone มาแล้วผมจะทำการอธิบายเพิ่มสำหรับไฟล์ข้างในว่าส่วนไหนไว้ทำอะไร แต่ผมจะยังไม่ลงลึกถึงการเขียนไฟล์ .gitlab-ci.yml
นะ ไว้คราวหลังจะมาอธิบายแยกอีกครั้ง
โครงสร้าง Project
.
├── config/
├── Dockerfile-nginx
├── Dockerfile-php
├── .git
├── .gitignore
├── .gitlab-ci.yml
├── k8s/
├── laravel/
└── README.md
config/
โฟลเดอร์นี้ไว้เก็บ config ไฟล์ของ nginx และ phpk8s/
โฟลเดอร์นี้ไว้เก็บไฟล์ deployment และ service ของ k8slaravel/
โพลเดอร์นี้ไว้เก็บ app ของเรา ด้านในจะเป็น code ของ laraveldockerfile-nginx
และdockerfile-php
จะเป็นการทำ docker image.gitlab-ci.yml
ไว้เขียน CI/CD บน gitlab
โฟลเดอร์ k8s/
k8s/
├── deploy.yml
└── svc.yml
ในนี้ผมจะเก็บไฟล์ yml ของ k8s ไว้โดยจะมีสองไฟล์คือ deploy.yml
และ svc.yml
โฟลเดอร์ config/
config/
├── nginx/
│ └── default.conf
└── php/
└── php.ini
ในนี้ผมจะแยกไฟล์ config ไว้ของ nginx
และ php
โดยจุดสังเกตุที่จะให้ดูก็คือในส่วนของ nginx/default.conf
เพราะผมได้ทำการเขียนแบบ upstream เอาไว้โดยให้วิ่งไปหา nginx service ของ k8s ดังโค็ดด้านล่าง
upstream phpfpm {
server svc-laravel-nginx-phpfpm-k8s-php:9000;
}
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name _;
...
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass phpfpm;
...
สังเกตุ fastcgi_pass phpfpm;
จะชื่อตรงกับ upstream phpfpm
แล้วค่าใน upstream
จะเป็นชื่อของ service php ตามด้วย port 9000
ไฟล์ .gitlab-ci.yml
เป็นไฟล์ที่เอาไว้เขียน ci/cd บน gitlab ซึ่งถ้าเรา push ขึ้น gitlab เมื่อไรมันจะทำการอ่านไฟล์นี้เสมอ

อย่างที่ได้กล่าวไว้แล้ว ผมจะไม่อธิบายโค็ดในไฟล์นี้เพราะมันเยอะ ไว้ค่อยทำบทความแยกออกมาอีก แต่จะให้ดูไฟล์รูปด้านบน ผมได้ทำการเขียนไว้มี 2 stages สำหรับ project นี้คือ
- Build ไว้สำหรับทำการติดตั้ง component ของพวก composer และ npm จากนั้นทำ caching folder พวก
vendor/
และnode_modules/
ไว้ - Release ไว้สำหรับสร้าง Docker image แยกเลยสำหรับ nginx และ php โดยแต่ละ Job จะทำการโหลด caching folder ที่ผมทำการแยกไว้ Build stage มาด้วย
จริงๆ ต้องมี Deploy stage ด้วยแต่เอาไว้ก่อน ตอนนี้เรามา deploy เองด้วยมือกัน
วิธีใช้งาน
สร้าง deployment และ service
⚡ kubectl create -f k8s/
ทดสอบเรียกหน้าเว็บ
⚡ kubectl port-forward svc/svc-laravel-nginx-phpfpm-k8s-nginx 8080:80
จากนั้นเข้า http://localhost:8080
จะเจอหน้า laravel พื้นฐาน