ในโลกของการพัฒนาซอฟต์แวร์สมัยใหม่ โดยเฉพาะอย่างยิ่งในสถาปัตยกรรมแบบ Monorepo หรือ Workspace ขนาดใหญ่ การจัดการกระบวนการ Build และ Test ให้มีประสิทธิภาพและเชื่อถือได้ถือเป็นหัวใจสำคัญของระบบ CI/CD (Continuous Integration/Continuous Delivery) การ Build โปรเจกต์ JavaScript (NPM) หลายตัวที่อยู่ใน Workspace เดียวกัน จำเป็นต้องมีกลไกที่สามารถสแกน ตรวจสอบ และเรียกใช้คำสั่ง Build เฉพาะโปรเจกต์ที่มีการเปลี่ยนแปลงเท่านั้น
โดยปกติแล้ว การจัดการงานลักษณะนี้จะใช้ Shell Scripting แต่ในฐานะ Senior Architect ที่ต้องการความเสถียรและ Transactional Integrity สูง การใช้ขีดความสามารถเชิงกระบวนการ (Procedural Capabilities) ของฐานข้อมูลอย่าง PostgreSQL ผ่านภาษา PL/pgSQL จึงเป็นทางเลือกที่ทรงพลังและน่าเชื่อถือกว่า
💡 หลักการทำงาน: การจำลอง Build Workspace ด้วย PL/pgSQL
เราจะใช้ PostgreSQL เพื่อจำลองการทำงานของ CI/CD Pipeline โดยการสร้าง Function ที่รับรายการ Path ของโปรเจกต์ทั้งหมดใน Workspace จากนั้น Function จะวนลูป (Loop) เพื่อตรวจสอบเงื่อนไข (เช่น การมีไฟล์ `package.json`) และจำลองการเรียกใช้คำสั่ง Build (เช่น `npm run build`) สำหรับแต่ละโปรเจกต์ที่ผ่านการตรวจสอบ
ตัวอย่างโค้ดด้านล่างนี้แสดงการสร้าง Function ที่ชื่อว่า build_workspace_projects ซึ่งรับ Array ของชื่อโปรเจกต์ และดำเนินการตรวจสอบและ ‘Build’ โปรเจกต์เหล่านั้น:
SQL
-- 1. สร้าง Function สำหรับจัดการ Build Workspace
CREATE OR REPLACE FUNCTION build_workspace_projects(project_paths TEXT[])
RETURNS BOOLEAN AS $$
DECLARE
project_name TEXT;
build_status BOOLEAN := TRUE;
BEGIN
RAISE NOTICE '==================================================';
RAISE NOTICE '🚀 Starting CI/CD Build Process for Workspace...';
RAISE NOTICE '==================================================';
-- วนลูปผ่าน Project Paths ทั้งหมดที่ได้รับมา
FOREACH project_name IN ARRAY project_paths LOOP
-- 2. จำลองการตรวจสอบว่าโปรเจกต์นี้เป็น NPM Project หรือไม่
-- ในโลกจริงอาจมีการ Query ตาราง 'project_metadata' แทน
IF project_name LIKE '%frontend%' AND project_name IS NOT NULL THEN
RAISE NOTICE '🔍 Checking Frontend Project: %... (Simulating package.json check)', project_name;
-- 3. จำลองการเรียกใช้ Build Command
BEGIN
-- ในสถานการณ์จริง คำสั่งนี้อาจรันผ่าน external process
RAISE NOTICE '✅ Successfully built project: % (Simulated Build Success)', project_name;
EXCEPTION
WHEN others THEN
-- หากเกิดข้อผิดพลาดในการ Build
RAISE WARNING '❌ Build Failed for %: %', project_name, SQLERRM;
build_status := FALSE;
END;
ELSE
RAISE NOTICE '⏭️ Skipping Project: % (Not a target NPM project)', project_name;
END IF;
END LOOP;
IF build_status THEN
RAISE NOTICE '✨ All projects built successfully! CI/CD Pipeline Complete.';
RETURN TRUE;
ELSE
RAISE EXCEPTION '🚨 CI/CD Pipeline Failed! One or more projects failed to build.';
END IF;
END;$$ LANGUAGE plpgsql;
-- 4. ตัวอย่างการเรียกใช้ Function (จำลองการสแกน Workspace)
SELECT build_workspace_projects(ARRAY['backend-api', 'frontend-web', 'utils-library']);
⚙️ การวิเคราะห์เชิงสถาปัตยกรรม (Architectural Deep Dive)
การใช้ PL/pgSQL ในลักษณะนี้ช่วยให้เราสามารถรวมตรรกะการควบคุม (Control Logic) เข้ากับฐานข้อมูลได้อย่างสมบูรณ์ ทำให้กระบวนการ CI/CD มีความทนทาน (Resilience) และสามารถจัดการสถานะความล้มเหลว (Failure State) ได้อย่างเป็น Transactional หากโปรเจกต์ใดล้มเหลว เราสามารถใช้ RAISE EXCEPTION เพื่อหยุดกระบวนการทั้งหมดได้ทันที ซึ่งดีกว่าการใช้ Shell Script ที่อาจต้องมีการจัดการ Exit Code ที่ซับซ้อนกว่า
✅ บทสรุป
การผสาน PostgreSQL เข้ากับกระบวนการ CI/CD สำหรับ Workspace Build ไม่เพียงแต่เป็นไปได้เท่านั้น แต่ยังมอบความมั่นคงทางสถาปัตยกรรมที่เหนือกว่า ด้วยการใช้ PL/pgSQL เราสามารถจัดการการวนลูป การตรวจสอบเงื่อนไข และการจัดการข้อผิดพลาด (Error Handling) ได้ภายในขอบเขตของฐานข้อมูล ทำให้ระบบ Build ของคุณมีความเป็นระเบียบ (Atomic) และง่ายต่อการบำรุงรักษาในระยะยาว นี่คือตัวอย่างที่ยอดเยี่ยมของการใช้ Database as a Service Orchestrator ในยุค Microservices และ Monorepo ครับ