Core Pipeline & Control
วางรากฐานสัญชาตญาณทางวิศวกรรมให้แน่นหนา: เข้าใจ Failure Domain ระหว่าง Controller กับ Agent, กฎเกณฑ์ Declarative Pipeline ไร้ข้อผิดพลาด, การส่งต่อ Dynamic Parameters, SCM Triggers และการเก็บรักษา Artifacts
"เปลี่ยนโปรแกรมเมอร์ที่รันมือ ให้กลายเป็นวิศวกรที่คุมไปป์ไลน์อัตโนมัติได้อย่างปลอดภัย"
หลังจบ Phase 1 คุณจะไม่เขียน Pipeline แบบเดาสุ่ม ไม่ปล่อยให้ Workspace ดิสก์เต็ม และเข้าใจอย่างถ่องแท้ว่าโค้ดทุกบรรทัดใน Jenkinsfile ถูกรันอยู่ที่ไหนและทำไม
ห้ามเปิดด้วยศัพท์เทคนิค ทุกบทเรียนจะเปรียบเทียบ Mental Model ในชีวิตจริงก่อนพาลงมือแกะไวยากรณ์ 3 ระดับ
แผนผัง Spaced Repetition Cumulative Quizzes (75 ข้อ)
ในแต่ละวันจะมี Interactive MCQ 15 ข้อ ซึ่งดึงเนื้อหาวันก่อนหน้ามาทดสอบซ้ำตามอัตราส่วน เพื่อล็อกความจำระยะยาว
| Day / Topic | New Material (วันปัจจุบัน) | Cumulative Active Recall (ทบทวนวันก่อน) | Total MCQs |
|---|---|---|---|
| D1 Controller & Agent Architecture | 15 ข้อ (100%) — Architecture, Failure Domain, Labels | — (วันเริ่มต้น) | 15 |
| D2 Declarative Pipeline Syntax | 10 ข้อ (67%) — Directives, Post Actions, cleanWs | 5 ข้อ (33%) — ทบทวน Day 1 (Controller/Agent) | 15 |
| D3 Environment & Parameters | 9 ข้อ (60%) — env vars, Parameters, String interpolation | 6 ข้อ (40%) — ทบทวน Day 1 (3 ข้อ) + Day 2 (3 ข้อ) | 15 |
| D4 SCM Integration & Triggers | 9 ข้อ (60%) — Webhooks, Git checkout, Poll vs H-Cron | 6 ข้อ (40%) — ทบทวน Day 1 (2 ข้อ) + Day 2 (2 ข้อ) + Day 3 (2 ข้อ) | 15 |
| D5 Artifacts & Test Reporting | 9 ข้อ (60%) — archiveArtifacts, Fingerprint, JUnit XML | 6 ข้อ (40%) — ทบทวนรวบยอด Day 1 - Day 4 (Phase 1 Cap) | 15 |
แผนการเรียนรู้ 5 วันแบบ Interactive Timeline
Jenkins Controller & Agent Architecture
ผ่าโครงสร้างสมองกลจัดคิว (Controller) แยกขาดจากแรงงานลงมือรัน (Agent) ป้องกันระบบกลางล่มเมื่อเจอเวิร์กลามหนัก พร้อมจำลอง Label Allocation Matching
Jenkins คือผู้จัดการฝ่ายปฏิบัติการอัตโนมัติ คอยรับออเดอร์โค้ดใหม่ แล้วจ่ายงานให้เครื่องจักรลูกน้องไปรันเทสต์ คอมไพล์ และส่งระบบ โดยโปรแกรมเมอร์ไม่ต้องกดมือทีละสเต็ป
ครัวภัตตาคาร: Controller คือหัวหน้าเชฟที่ยืนคอยรับออเดอร์และแจกโพย ไม่ลงมือย่างเนื้อเอง | Agent คือเชฟผู้ช่วยประจำแต่ละเตาที่คอยรับคำสั่งไปทำอาหาร
ถ้าไม่มี: ทุกคนรันบิลด์บนเครื่องโน้ตบุ๊กตัวเอง เจอปัญหา "เครื่องฉันรันผ่าน ทำไมเครื่องเธอพัง" | ถ้ามี: รันบนสภาพแวดล้อมมาตรฐานกลางของ Agent ตัดปัญหาเรื่องความไม่เสถียรของเครื่องส่วนตัว
บริษัทปล่อยให้บิลด์ Maven ขนาดใหญ่ 10 โปรเจกต์รันตรงบน Controller ผลคือ Controller ติดอาการ OOMKilled ดับทั้งระบบ Web UI ล่ม ทุกทีมในบริษัทหยุดชะงัก
agent any — รับงานให้เครื่องใดก็ได้ที่ว่างagent { node { label 'linux-build-node' } } — เจาะจง Label ที่ถูกต้องagent none — บังคับแยก Agent ต่อ Stage เพื่อความปลอดภัยสูงสุดDeclarative Pipeline Core Syntax & Post Actions
ทำความเข้าใจกฎเกณฑ์ของ Declarative Pipeline: ลำดับขั้นตอน `pipeline`, `agent`, `stages`, `steps` และวงจรการปิดงานด้วย `post` actions (`always`, `failure`, `cleanup`)
Declarative Pipeline คือแม่แบบข้อตกลงที่เข้มงวด บังคับให้ทุกคนเขียนไปป์ไลน์ในรูปแบบเดียวกัน ป้องกันไม่ให้เขียนสคริปต์ Groovy มั่วตามอำเภอใจจนระบบพัง
คู่มือประกอบตู้ IKEA: มีขั้นตอนชัดเจน (1. ตอกหมุด -> 2. ยึดบานพับ) พร้อมกฎเหล็กว่า "ก่อนกลับบ้านต้องเก็บกวาดเศษขยะเสมอ" (post { always { cleanWs() } })
ถ้าไม่มี: เขียน Scripted pipeline ปนตรรกะอิสระ พอบิลด์พังกลางทาง ขยะไฟล์ค้างในเครื่อง Agent ดิสก์เต็มเงียบๆ | ถ้ามี: บล็อก `post` จะทำงานเสมอแม้สเตจก่อนหน้าจะพัง ล้างดิสก์สะอาด 100%
ไปป์ไลน์ทดสอบสร้างไฟล์แคชขนาด 10GB ต่อรอบ แต่ไม่มีบล็อก cleanup เมื่อรันไปได้ 50 บิลด์ ฮาร์ดดิสก์ของเครื่อง Agent เต็มสนิท ทำให้บิลด์ของทุกโปรเจกต์ในระบบถูก Abort ทั้งหมด
echo "Pipeline steps" ภายใต้ stage เดียวsh './gradlew test'post { always { cleanWs() } failure { notifySlack() } }Environment Variables & Parameterized Builds
สร้างไปป์ไลน์ที่มีความยืดหยุ่นด้วย Built-in Environment (`env.BUILD_NUMBER`), Custom `environment` directives และการส่งพารามิเตอร์แบบคลิกเลือก (`choice`, `string`, `booleanParam`)
Environment & Parameters คือระบบส่งข้อมูลแบบยืดหยุ่น เพื่อให้ไปป์ไลน์ไฟล์เดียวสามารถนำไปรันได้ทุกสิ่งแวดล้อม (Dev, Staging, Prod) โดยไม่ต้องฮาร์ดโค้ดค่าใดๆ ลงในไฟล์
แบบฟอร์มเอกสารใบสั่งงาน: มีช่องกรอกระบุตัวเลือก เช่น เลือกระดับความเร่งด่วน หรือปลายทางจัดส่ง โดยไม่ต้องพิมพ์แบบฟอร์มใหม่ทุกครั้ง
ถ้าไม่มี: ฮาร์ดโค้ด IP/Database URL ลงใน Jenkinsfile อยากเปลี่ยนทีต้องแก้โค้ด Commit ใหม่ | ถ้ามี: ป้อนค่าผ่านหน้าจอ UI เพียงคลิกเดียว หรือดึงจาก Environment อัตโนมัติ
โปรแกรมเมอร์เผลอฮาร์ดโค้ดตัวแปรเชื่อมต่อ Production Database ลงในสคริปต์เทสต์ เมื่อบิลด์ฝั่ง Test ทำงาน จึงสั่ง Drop Table ในฐานข้อมูลจริงของลูกค้าจนระบบล่ม
${env.BUILD_NUMBER} และ ${env.JOB_NAME}environment { APP_ENV = 'staging' }parameters { choice(name: 'DEPLOY_ENV', choices: ['dev', 'prod']) }SCM Integration, Git Triggers & Polling
เชื่อมต่อ Source Control Management (SCM): กลยุทธ์ Git checkout, Branch specifiers, และความแตกต่างระหว่าง Webhook vs. Poll SCM vs. H-Hash Cron triggers
SCM Triggers คือเซนเซอร์ตรวจจับความเปลี่ยนแปลงของโค้ด เพื่อสั่งให้ Jenkins ตื่นขึ้นมาทำงานทันทีที่มีคนส่งโค้ดใหม่เข้า Git โดยไม่ต้องมีคนกดปุ่มบิลด์
กริ่งหน้าบ้านอัตโนมัติ (Webhook) vs คนเดินไปดูตู้ไปรษณีย์ทุก 5 นาที (Poll SCM): การใช้กริ่งช่วยประหยัดแรงและเร็วกว่าการเดินไปตรวจเองซ้ำๆ
ถ้าไม่มี: Developer ต้องโทรหาทีม DevOps เพื่อให้กดรันบิลด์ให้ เสียเวลารอเป็นชั่วโมง | ถ้ามี: GitHub Webhook ปลุก Jenkins ทันทีในเสี้ยววินาทีเมื่อ Commit โค้ด
ทีมตั้งค่า Poll SCM ทุกๆ 30 วินาทีพร้อมกัน 250 โปรเจกต์ จนส่ง Request ถล่ม GitHub Enterprise จนโดนระบบรักษาความปลอดภัยสั่งแบน IP เซิร์ฟเวอร์ของบริษัท
checkout scmtriggers { cron('H 2 * * *') }'main'Artifacts Archiving & Test Reporting
บันทึกผลผลิตอย่างปลอดภัย: การจัดเก็บไฟล์ Binary ด้วย `archiveArtifacts`, การสืบค้นย้อนกลับด้วย Fingerprinting, การออกรายงาน JUnit XML และสรุปปิด Phase 1
Artifacts คือไฟล์ผลลัพธ์สำคัญ (เช่น .jar, .zip, .apk) ที่ได้จากการคอมไพล์ ซึ่งต้องถูกส่งไปเก็บไว้บน Controller อย่างปลอดภัย ก่อนที่เครื่อง Agent จะลบพื้นที่ทิ้ง
ตู้เซฟรับฝากของพร้อมใบเสร็จ: ช่างทำเฟอร์นิเจอร์เสร็จ ก็นำของมาฝากไว้ในตู้เซฟส่วนกลางพร้อมปั๊มตรารับรอง (Fingerprint) ใครจะมาเบิกไปใช้ต่อก็ตรวจสอบได้
ถ้าไม่มี: บิลด์เสร็จแต่ลืมดึงไฟล์ออกมา พอคำสั่ง cleanWs() ทำงาน ไฟล์หายสาบสูญ ต้องสั่งบิลด์ใหม่เสียเวลา | ถ้ามี: มีปุ่มดาวน์โหลดไฟล์ Binary ตรงหน้า Dashboard ประวัติบิลด์
ทีมใช้วิธี SCP ข้ามเซิร์ฟเวอร์แบบดิบๆ ระหว่างบิลด์ ปรากฏว่าเน็ตเวิร์กสะดุดไฟล์ส่งไปแค่ครึ่งเดียว แต่บิลด์ขึ้นสีเขียวผ่าน เมื่อนำไฟล์พิการขึ้น Production ระบบแอปพลิเคชันจึงพังทันที
archiveArtifacts 'target/*.jar'junit '**/build/test-results/**/*.xml'fingerprint: true พร้อมตั้งเงื่อนไข onlyIfSuccessful: trueพร้อมเริ่มต้น Day 1 หรือยัง?
เริ่มก้าวแรกสู่วิศวกรระดับมืออาชีพด้วยสถาปัตยกรรม Controller & Agent พร้อม Interactive Simulator และควิซชุดแรก 15 ข้อ