ปัจจุบันเราได้ดำเนินการติดตั้งและตั้งค่าเริ่มต้น สำหรับระบบ Software Factory ตามแนวทาง Dedicated DevOps เสร็จสมบูรณ์แล้ว โดยประกอบด้วยเครื่องมือหลัก ดังนี้
| Tool |
หน้าที่ |
| GitLab |
ศูนย์กลางการจัดการ Source Code และจุดเริ่มต้นของ Pipeline |
| Jenkins |
เครื่องมือ CI Orchestration สำหรับควบคุม Build และ Deploy |
| SonarQube |
ระบบตรวจสอบคุณภาพ Code (Static Code Analysis) |
| Nexus |
Artifact Repository และ Private Docker Registry |
| SigNoz |
Full-stack Observability สำหรับ Tracing และ Monitoring ผ่าน OpenTelemetry |
เครื่องมือเหล่านี้จะทำหน้าที่ร่วมกันเพื่อสร้าง Automated Software Delivery Pipeline
ขั้นตอนถัดไป เพื่อให้เครื่องมือทั้งหมดข้างต้นสามารถทำงานสอดประสานกันได้อย่างไร้รอยต่อ เราจำเป็นต้องดำเนินการตั้งค่าการเชื่อมต่อในแต่ละส่วน ดังนี้
วัตถุประสงค์
- ให้ Jenkins รับรู้การเปลี่ยนแปลงของ Source Code
- ให้ GitLab Trigger Jenkins Pipeline ผ่าน Webhook
- ให้ Jenkins ส่งผลลัพธ์ Build กลับไปที่ GitLab
เมื่อเริ่มใช้งาน Jenkins ครั้งแรก ควรติดตั้ง Plugin สำคัญเพิ่มเติม สำหรับ Software Factory โดย Plugin ที่ต้องใช้ ได้แก่
- GitLab Plugin ช่วยให้ GitLab ส่ง Webhook มาที่ Jenkins เพื่อ Trigger Pipeline เมื่อมีการ Push Code
- Docker Pipeline ช่วยให้ Jenkins สามารถ Build และจัดการ Docker Image
- SonarQube Scanner ใช้สำหรับเชื่อมต่อกับ SonarQube เพื่อทำ Static Code Analysis
เพื่อให้ Jenkins Pipeline สามารถ
- Build Docker Image
- Run Container
- Push Image ไปยัง Registry
จำเป็นต้องให้ Jenkins สามารถเข้าถึง Docker Engine บนเครื่อง Host โดยปฏิบัติ ดังนี้
- ควรสร้าง User ใหม่ใน Jenkins (ผ่านเมนู Manage Jenkins > Users) โดยใช้ชื่อเดียวกันกับใน GitLab คือ jenkins_bot เหตุผล เพื่อแยกสิทธิ์การทำงานของระบบอัตโนมัติออกจากสิทธิ์สูงสุดของ root เวลาเกิดปัญหาหรือ Token หลุด เราจะสามารถจำกัดความเสียหายได้ง่ายกว่า
- รัน sudo chmod 666 /var/run/docker.sock บนเครื่อง Host เพื่อให้ User jenkins_bot สั่งงาน Docker ได้ หรือก็คือ คำสั่งนี้จะอนุญาตให้ Container ของ Jenkins สามารถเรียกใช้ Docker Engine ของ Host ได้
- สิ่งที่ต้องเช็ค ตรวจสอบว่า User jenkins_bot ใน Container มีสิทธิ์อ่าน/เขียนไฟล์ .sock หรือไม่ โดยเข้าสู่ Jenkins Container แล้วรันคำสั่ง "docker ps" ควรเห็นรายชื่อ Docker ที่รันในเครื่อง Host ทั้งหมด
หมายเหตุ เราใช้ 666 เฉพาะในขั้นตอนนี้เพื่อ Verify Connectivity ใน Dedicated Environment
การทดสอบสร้าง Pipeline ใน Jenkins
เพื่อให้ระบบบางส่วนมีความพร้อมสามารถรองรับการทำงานสอดประสานกันอย่างไร้รอยต่อ ดังนี้
- GitLab ↔ Jenkins
- Jenkins ↔ Docker Host
- Login เข้า GitLab ด้วยบัญชีที่ต้องการให้ไปคอมเมนต์ (แนะนำให้สร้าง User ชื่อ jenkins_bot (User Type: Regular และกำหนด Can create top-level group แนะนำให้ "เอาเครื่องหมายถูกออก") แยกต่างหาก)
- สร้าง Personal Access Token (jenkins_bot) คลิกที่รูปโปรไฟล์มุมขวาบน แล้วเลือกเมนู Preferences ที่แถบเมนูด้านซ้ายมือ (Sidebar) หาคำว่า Access Tokens แล้วคลิกเข้าไป
- คลิก Add new token แล้วตั้งค่าดังนี้
- Token name: Jenkins_CI_Token
- Expiration date: (เว้นว่างไว้ถ้าไม่อยากให้หมดอายุ หรือตั้งเผื่อไว้ 1 ปีครับ)
- Select scopes: ติ๊กถูกที่ช่อง api เพื่อให้ Jenkins สามารถเขียนคอมเมนต์และอัปเดตสถานะการ Build ได้
- คลิก Create personal access token
- ก๊อปปี้ Token ที่ปรากฏขึ้นมาเก็บไว้ทันที (เพราะมันจะแสดงแค่ครั้งเดียวครับ)
- เปิดหน้า Jenkins > Manage Jenkins > Credentials
- คลิกที่ Domain (global) > Add Credentials
- เลือก Kind เป็น GitLab API token (ถ้าไม่มีตัวเลือกนี้ แสดงว่ายังไม่ได้ติดตั้ง GitLab Plugin ใน Jenkins ครับ)
- API token วาง Token ที่ก๊อปมาจาก GitLab เมื่อครู่ลงไป
- ID ตั้งชื่อว่า gitlab_token_for_software_factory_project (หรือชื่อที่สื่อความหมาย)
- คลิก Create
- ไปที่ Manage Jenkins > System (หรือ Configure System ในรุ่นเก่า)
- เลื่อนหาหัวข้อ GitLab
- Connection name: ตั้งชื่อว่า GitLab_Panmodel
- GitLab host URL: ใส่ URL ของ GitLab (เช่น https://git.panmodel.com)
- Credentials: เลือก ID ที่เราเพิ่งสร้างไป
- คลิก Test Connection -> ถ้าขึ้นว่า Success แสดงว่า Jenkins พร้อมคอมเมนต์แล้ว
- ไปที่หน้าแรกของ Jenkins คลิก New Item
- ใส่ชื่อโปรเจกต์ เช่น test-docker-connectivity และเลือก Pipeline จากนั้นกด OK
- เลื่อนลงมาที่หัวข้อ Pipeline ในช่อง Definition เลือกเป็น Pipeline script
- วางโค้ดที่เตรียมไว้ลงไปได้เลย
pipeline {
agent any
stages {
stage('Verify Docker Connectivity') {
steps {
// คำสั่งนี้จะเรียกใช้ /var/run/docker.sock ที่เราเพิ่งแก้สิทธิ์เป็น 666
sh 'docker ps'
}
}
}
}
- กด Build Now และเลือกเมนู Console Output โดยในหน้า Console Output ควรที่จะเห็นตารางรายชื่อ Container เหมือนที่รันใน Terminal (เช่น จะเห็น jenkins, gitlab)
สรุป หลังจากขั้นตอนนี้ ระบบ Software Factory Pipeline จะสามารถรองรับการทำงานได้ดังนี้
"GitLab Push -> GitLab Webhook -> Jenkins Pipeline -> Build Docker Image -> Push Artifact / Deploy"
เพื่อให้ระบบทั้งชุดทำงานสอดประสานกันอย่างไร้รอยต่อ เราต้องตั้งค่า การเชื่อมต่อ (Integration) ระหว่างเครื่องมือสำคัญเพิ่ม ได้แก่ Jenkins ↔ SonarQube, Nexus, SigNoz