- เป็นการตั้งค่า CI แบบง่ายที่เพิ่ม
post-receivehook ลงใน bare Git repository บนเซิร์ฟเวอร์ส่วนตัว เพื่อทำการทดสอบ บิลด์ และย้ายไฟล์โดยอัตโนมัติ - CI แบบเดิมมีการตั้งค่า YAML ที่ซับซ้อน การรันที่ช้า และการโฮสต์เองที่ยุ่งยาก ขณะที่ไม่ได้ต้องการถึงขั้นการแยกสภาพแวดล้อมบิลด์อย่างสมบูรณ์หรือการจัดการข้อมูลลับ
- หากรันงานโดยตรงใน hook เมื่อเกิดความล้มเหลว push อาจถูกปฏิเสธ หรือการเสร็จสิ้นอาจล่าช้า จึงใช้คิวงานขนาดเล็ก
nqเพื่อประมวลผลในแบ็กกราวด์ - hook จะเรียกเพียง
nqเท่านั้น และตรวจสอบล็อกด้วยssh server nqtail -aทำให้ดูแลระบบได้รวดเร็วและเรียบง่าย - หากจำเป็น สามารถแยกบิลด์ด้วย landdown·Podman และจัดการข้อมูลลับด้วย sops หรือขยายวิธีพัฒนาด้วย Git email patch,
git-shell,git http-backendได้
การตั้งค่า post-receive hook และ nq
- บนเซิร์ฟเวอร์ส่วนตัว สร้าง repository ด้วย
ssh server git init --bare repoแล้ว clone ด้วยgit clone server:repo - ใส่
post-receivehook ในรูปแบบสคริปต์ shell ลงในไดเรกทอรี hooks ของ bare repository เพื่อเริ่ม CI ทุกครั้งที่มีการ push - หากรันงานโดยตรงใน hook จะเกิดปัญหาสองอย่าง
- หากสคริปต์ล้มเหลว push จะถูกปฏิเสธ
- หากการรันสคริปต์ช้า การเสร็จสิ้นของ push ก็จะล่าช้าไปด้วย
- ใน hook จะเรียกคิวงานขนาดเล็ก
nqเพื่อเพิ่มงานเข้า คิวแบ็กกราวด์- ตรวจสอบล็อกด้วย
ssh server nqtail -a - ดูขั้นตอนการตั้งค่าได้ใน tutorial สั้น ๆ
- ตรวจสอบล็อกด้วย
1 ความคิดเห็น
ความคิดเห็นบน Lobste.rs
CI มีปัญหาอย่างน้อยสองอย่าง
ปัญหาง่ายคือการรัน
make testเมื่อมีการเปลี่ยนแปลงโค้ด ส่วนปัญหายากคือการรันmake testบน Linux, Windows และ Mac ทั้งหมดไม่พอใจกับ developer experience และความสามารถในการดีบักของเอนจินที่มีอยู่ซึ่งมักถูกมองข้าม จึงกำลังสร้างระบบ CI ที่ https://ci.pico.sh ไม่ชอบ DSL ด้วย และ YAML แบบซ้อนเป็นลำดับชั้นให้ความรู้สึกเหมือนค่อย ๆ ดูดพลังชีวิตออกไป
เคยสร้างสิ่งนี้บน gitolite แล้วส่งต่อไปยัง Temporal เพื่อควบคุมกระบวนการบิลด์ได้โดยไม่มีข้อจำกัด
หากรันล้มเหลวก็สามารถปฏิเสธการ push ได้ แต่โดยทั่วไปจะปล่อยให้ผ่าน hook ก่อนแล้วค่อยจัดการความล้มเหลวแยกต่างหาก ซึ่งการตั้งค่าก็เรียบง่ายและสนุกดี
มี CI แบบมินิมอลอีกตัวที่เน้นการรัน shell script คือ laminar CI และยังมี เว็บ UI ให้ด้วย
นานมาแล้ว ในสภาพแวดล้อมองค์กรที่ใช้ Windows เท่านั้น เคยวาง Mac mini เป็น เซิร์ฟเวอร์ CI ภายในเครื่อง ที่ทั้งทีมใช้ เพื่อบิลด์แอป iOS และเป็นหนึ่งในวิธีใช้ Git ที่ลองทำตั้งแต่ช่วงแรก ๆ
พบจาก https://mccd.space/git/ และดูเหมือนจะใช้ fork ของ stagit
จนถึงไม่กี่เดือนก่อนเคยรัน Forgejo กับ Woodpecker แต่ฟีเจอร์ส่วนใหญ่ไม่จำเป็น จึงถอดออกทั้งหมดและกำลังมองหา ชุดตั้งค่าที่เบากว่า คล้าย ๆ แบบนี้อยู่ งานถัดไปคือ CI พอดีจึงมาได้ถูกเวลา และกำลังคิดอยู่ว่าจะ mirror ไลบรารีเล็ก ๆ ที่จะเปิดเร็ว ๆ นี้ไปยัง SourceHut หรือไม่
repository เปิดให้อ่านแบบ read-only บนเว็บผ่าน git-daemon และได้สรุปวิธีตั้งค่าทั้งหมดไว้ ที่นี่
เพิ่งรู้จัก
nqจากบทความนี้ แต่คงจะใช้systemd-runมากกว่าเนื่องจากใช้ Nix กับ runner แทบทั้งหมดอยู่แล้ว หากเปิดเผยผลลัพธ์ของ
nix flake checkเป็นเมตริกและล็อก OTLP ก็น่าจะตอบโจทย์ CI ด้วยระบบมอนิเตอร์ได้ชอบการจัดวางแพลตฟอร์มพัฒนาแบบ self-hosted ที่เรียบง่ายเช่นนี้
สามารถตั้งค่าและใช้งาน bubblewrap ซึ่งเป็นระบบคอนเทนเนอร์ที่เบาและเรียบง่ายสำหรับ CI ได้ง่าย อย่างไรก็ตามถ้าใช้
nqดูเหมือนจะ ปฏิเสธการ push เมื่อ CI ล้มเหลว ไม่ได้ เลยสงสัยว่าจัดการกันอย่างไรหากต้องการ isolation มากขึ้นก็เพิ่ม Podman, Docker หรือ bubblewrap ได้ ไม่ปฏิเสธการ push เมื่อ CI ล้มเหลวด้วยเหตุผลเดียวกับที่ไม่ใส่ pre-commit hook ที่รันเทสต์ เพราะบางครั้งก็จำเป็นต้อง commit หรือ push งานที่พังอยู่ และการ push อาจช้ามากได้ หากต้องการปฏิเสธ ก็ให้รัน CI แบบ synchronous โดยไม่ใช้
nqแล้วบล็อกการ push เมื่อ exit code ไม่ใช่ 0หรือจะให้ บรานช์ที่ไม่ใช่ main รันด้วย
nqและรันแบบ synchronous เฉพาะบรานช์ main ก็ได้ดูเหมือนว่า ลิงก์
landdownจะเสีย