วิธีการสร้างไปป์ไลน์ CI/CD ที่มีประสิทธิภาพด้วย GitHub Actions

  • GitHub Actions ช่วยให้คุณสร้างไปป์ไลน์ CI/CD ที่สมบูรณ์แบบด้วยเวิร์กโฟลว์ YAML ซึ่งผสานรวมการทดสอบ การสร้าง และการปรับใช้ไว้ในที่เก็บเดียวกัน
  • ไปป์ไลน์สมัยใหม่ผสานรวมการบูรณาการอย่างต่อเนื่องที่รวดเร็ว การปรับใช้แบบอัตโนมัติ และแนวปฏิบัติที่ดีที่สุด เช่น การนำเวิร์กโฟลว์กลับมาใช้ใหม่ และการจัดการข้อมูลลับที่ปลอดภัย
  • สามารถจัดการไปป์ไลน์ที่ซับซ้อนสำหรับแบ็กเอนด์ ฟรอนต์เอนด์ และไมโครเซอร์วิส โดยปรับใช้บน Kubernetes, GAE, Cloud Functions หรือ PaaS ภายนอกได้
  • การตรวจสอบได้ ความปลอดภัย (การสแกนโค้ดและการพึ่งพา) และการแจ้งเตือน เป็นองค์ประกอบสำคัญที่ทำให้ไปป์ไลน์ CI/CD มีความน่าเชื่อถือในสภาพแวดล้อมการใช้งานจริง

ไปป์ไลน์ CI/CD ด้วย GitHub Actions

การสร้างไปป์ไลน์ CI/CD ที่ดีด้วย GitHub Actions มันไม่ใช่สิ่งที่ "จะทำเมื่อมีเวลา" อีกต่อไปแล้ว ในทีมงานยุคใหม่ มันแทบจะเป็นสิ่งจำเป็นสำหรับการใช้งานที่รวดเร็วและเชื่อถือได้ ถึงกระนั้น การหาตัวอย่างที่สมบูรณ์ ครอบคลุม และคิดมาอย่างรอบคอบที่คุณสามารถปรับใช้กับบริษัทของคุณได้นั้น มักจะซับซ้อนกว่าที่คิดไว้มาก

ในบรรทัดต่อไปนี้ เราจะผสมผสานทฤษฎีคลาสสิกของ CI/CD เข้าด้วยกัน พร้อมตัวอย่างการนำไปใช้งานจริงโดยใช้ GitHub Actions, ไปป์ไลน์ที่นำกลับมาใช้ใหม่ได้, Tasks, สคริปต์ bash เป็นต้น โมดูล PowerShell PnPการใช้งานบน Kubernetes, Google Cloud และ Kinsta พร้อมด้วยแนวทางปฏิบัติที่ดีที่สุดสำหรับความปลอดภัย การตรวจสอบ และความสามารถในการปรับขนาด แนวคิดคือคุณสามารถนำส่วนประกอบเหล่านี้ไปปรับใช้ให้เข้ากับบริบทของคุณ และหลีกเลี่ยงข้อผิดพลาดทั่วไปหลายประการ

เหตุผลที่คุณต้องการไปป์ไลน์ CI/CD ที่สร้างขึ้นอย่างดี

ในการพัฒนาวิชาชีพในปัจจุบัน CI/CD เปรียบเสมือนระบบหมุนเวียนของรหัสกระบวนการนี้จะผสานรวมการเปลี่ยนแปลง ดำเนินการทดสอบ สร้างไฟล์ผลลัพธ์ และปรับใช้เวอร์ชันใหม่โดยมีการแทรกแซงน้อยที่สุด หากไม่มีกระบวนการทำงานนี้ การปรับใช้แต่ละครั้งจะกลายเป็นกระบวนการที่ช้า มีข้อผิดพลาด และต้องทำด้วยตนเองอย่างยุ่งยาก

การบูรณาการอย่างต่อเนื่อง (Continuous Integration: CI) มุ่งเน้นไปที่การตรวจสอบความถูกต้องของการเปลี่ยนแปลง ทันทีที่อัปโหลดโค้ดไปยังที่เก็บ ระบบจะทำการรัน unit test, linter และ static analysis เพื่อตรวจจับข้อผิดพลาดให้เร็วที่สุด ยิ่งได้รับผลตอบรับเร็วเท่าไหร่ ก็ยิ่งแก้ไขได้เร็วเท่านั้น และผลกระทบจากการเปลี่ยนแปลงก็จะยิ่งน้อยลงเท่านั้น

การปรับใช้แบบต่อเนื่อง (CD ในความหมายของการปรับใช้แบบต่อเนื่อง) หรือ Continuous Delivery (ขึ้นอยู่กับระดับของระบบอัตโนมัติ) จะเพิ่มระบบอัตโนมัติในส่วนของการเผยแพร่ เช่น การสร้างอิมเมจ การเผยแพร่แพ็กเกจ การปรับใช้ไปยังสภาพแวดล้อมทดสอบ สเตจจิ้ง หรือสภาพแวดล้อมการผลิต และแม้กระทั่งการเปลี่ยนแปลงปริมาณการใช้งานโดยใช้กลยุทธ์บลู-กรีน หรือแคนารี

ในบริษัทที่มีโค้ดเก่าจำนวนมากไปป์ไลน์ที่ดีเป็นหนึ่งในเครื่องมือที่ดีที่สุดสำหรับการปรับปรุงระบบนิเวศให้ทันสมัย: ช่วยให้คุณสามารถนำการทดสอบไปใช้กับบริการเดิม ๆ ทำให้งานที่เคยทำด้วยมือเป็นไปโดยอัตโนมัติ และลดต้นทุนในการบำรุงรักษาโครงสร้างพื้นฐาน เช่น Jenkins หรือ Nexus ที่ล้าสมัยไปแล้ว

GitHub Actions คืออะไร และเหตุใดจึงเข้ากันได้ดีกับ CI/CD?

GitHub Actions คือแพลตฟอร์มการทำงานอัตโนมัติที่รวมอยู่ใน GitHub มันช่วยให้คุณกำหนดเวิร์กโฟลว์ในไฟล์ YAML ภายในที่เก็บโค้ดได้โดยตรง ด้วยวิธีนี้ คุณสามารถคอมไพล์ ทดสอบ วิเคราะห์ และปรับใช้ซอฟต์แวร์ของคุณได้โดยไม่ต้องตั้งค่าเซิร์ฟเวอร์ CI ภายนอก

เวิร์กโฟลว์คือชุดของงานและขั้นตอนต่างๆ ซึ่งถูกกระตุ้นโดยเหตุการณ์ต่างๆ เช่น push, pull_request, schedule (ครอน) workflow_dispatch (ด้วยตนเอง) หรือแม้แต่การดำเนินการเกี่ยวกับปัญหาต่างๆ แต่ละงานจะทำงานในตัวรันเนอร์ (ตัวอย่างเช่น ubuntu-latestและประกอบด้วยขั้นตอนที่ใช้การกระทำหรือคำสั่งที่สามารถนำกลับมาใช้ซ้ำได้ run.

GitHub เป็นตลาดขนาดใหญ่สำหรับการแบ่งปันหุ้น ซึ่งมีระบบเชื่อมต่อสำเร็จรูปสำหรับเกือบทุกอย่าง เช่น Docker, Kubernetes, AWS, Azure, Google Cloud, SonarCloud, Slack, Jira, การวิเคราะห์ความปลอดภัย, เครื่องมือตรวจสอบไวยากรณ์สำหรับภาษาต่างๆ นับพันภาษา เป็นต้น ซึ่งช่วยลดเวลาที่จำเป็นในการตั้งค่าไปป์ไลน์ขั้นสูงได้อย่างมาก

เมื่อเปรียบเทียบกับโซลูชันอย่าง Jenkins หรือ ConcourseGitHub Actions มีข้อดีที่เห็นได้ชัดหลายประการ ได้แก่ เป็นบริการแบบจัดการ (คุณไม่ต้องจัดการเซิร์ฟเวอร์เอง) เชื่อมโยงกับโค้ดอย่างใกล้ชิด ใช้โมเดลการจ่ายตามการใช้งาน และได้รับการสนับสนุนจากชุมชนขนาดใหญ่ นอกจากนี้ นักพัฒนาหลายคนคุ้นเคยกับมันอยู่แล้วจากโครงการส่วนตัว ซึ่งช่วยลดระยะเวลาในการเรียนรู้ได้อย่างมาก

ส่วนประกอบพื้นฐานของเวิร์กโฟลว์ GitHub Actions

ทุกอย่างเริ่มต้นด้วยไฟล์ YAML ใน .github/workflows/ตัวอย่างเช่น ci.yml o build-test-deploy.ymlแม้ว่าไวยากรณ์อาจซับซ้อนขึ้นได้มาก แต่โครงสร้างพื้นฐานนั้นค่อนข้างเรียบง่าย

ส่วนประกอบหลักของ YAML ได้แก่: name (ชื่อเวิร์กโฟลว์) on (เหตุการณ์ที่กระตุ้นให้เกิดเหตุการณ์นั้น) jobs (ชุดของภารกิจเชิงตรรกะ) และภายในแต่ละภารกิจนั้น runs-on (นักวิ่ง) steps (ขั้นตอน) env (ตัวแปรทั่วโลก) และ if (เงื่อนไขสำหรับการดำเนินการตามขั้นตอนหรือภารกิจ)

งานหมายถึงกลุ่มงาน ซึ่งสามารถทำงานแบบขนานหรือแบบต่อเนื่องได้โดยใช้ needsภายในแต่ละงาน ขั้นตอนต่างๆ จะใช้การกระทำ (uses:) หรือคำสั่ง (run:ตัวอย่างทั่วไปได้แก่: การตรวจสอบโค้ด การติดตั้งส่วนประกอบที่จำเป็น การตรวจสอบไวยากรณ์ การทดสอบ และการสร้างโปรแกรม

ความลับและตัวแปรสภาพแวดล้อม ไฟล์เหล่านี้ได้รับการจัดการในระดับที่เก็บข้อมูล องค์กร หรือสภาพแวดล้อม ในเวิร์กโฟลว์ ไฟล์เหล่านี้จะถูกอ้างอิงด้วย ${{ secrets.MI_SECRET }} และอนุญาตให้ทำงานกับคีย์ API โทเค็นการปรับใช้ หรือข้อมูลรับรองระบบคลาวด์โดยไม่ต้องเปิดเผยข้อมูลเหล่านั้นในที่เก็บข้อมูล

YAML ยังอนุญาตให้สร้างอาร์เรย์การดำเนินการได้อีกด้วย กับ strategy.matrixมีประโยชน์มากสำหรับการทดสอบโค้ดของคุณบน Node, Python หรือ Java เวอร์ชันต่างๆ หรือแม้แต่บนระบบปฏิบัติการที่แตกต่างกัน โดยไม่ต้องเขียนโค้ดส่วนเดียวกันซ้ำหลายครั้ง

ออกแบบไปป์ไลน์ CI/CD ที่ทันสมัยโดยใช้แนวปฏิบัติที่ดีที่สุด

กระบวนการทำงานที่มีประสิทธิภาพมักแบ่งออกเป็นขั้นตอนที่ชัดเจนขั้นตอนต่างๆ ได้แก่ การตรวจสอบอย่างรวดเร็ว (lint, unit tests), การสร้าง artifact, การเผยแพร่ (เวอร์ชัน, การติดป้ายกำกับ, changelog, การเผยแพร่ใน repository ของ artifact) และการปรับใช้ในสภาพแวดล้อมหนึ่งหรือหลายสภาพแวดล้อม

ขั้นตอนการบูรณาการอย่างต่อเนื่องควรดำเนินการให้เร็วที่สุดเท่าที่จะเป็นไปได้ วิธีนี้ช่วยให้มั่นใจได้ว่าคำขอ push หรือ pull ใดๆ จะได้รับการตอบกลับเกือบจะทันที โดยทั่วไปแล้วมักจะทำการตรวจสอบต่างๆ แบบขนานกันโดยใช้ชุดข้อมูลหรืองานแยกต่างหาก ซึ่งอาจมีต้นทุนสูงขึ้นเล็กน้อยเพื่อแลกกับการลดเวลาการรอโดยรวม

เพื่อแยกส่วนท่อส่งออกจากภาษาที่เป็นรูปธรรมคุณสามารถใช้เครื่องมือจัดการงาน เช่น Task (คล้ายกับ Make แต่มีไวยากรณ์ที่ใช้งานง่ายกว่า) ด้วยวิธีนี้ เวิร์กโฟลว์ GitHub Actions จะเรียกใช้เฉพาะงานทั่วไปเท่านั้น (task test, task lintเป็นต้น) และแต่ละ repository จะกำหนดวิธีการใช้งานภายในโดยขึ้นอยู่กับว่าใช้ Node, Java, Python เป็นต้น

การกำหนดเวอร์ชันและไฟล์ที่เกี่ยวข้องจะมีบทบาทสำคัญในช่วงขั้นตอนการเผยแพร่ที่นี่คุณสามารถสร้างอิมเมจ Docker, ไฟล์ jar/war, แพ็กเกจ npm หรืออาร์ติแฟกต์อื่นๆ อัปโหลดไปยังรีจิสทรีที่เกี่ยวข้อง (รีจิสทรี Docker, Maven, npm ใน Artifact Registry เป็นต้น) ติดแท็กคอมมิต และสร้าง GitHub Releases หรือ changelog ด้วยเครื่องมือต่างๆ เช่น กิต-คลิฟฟ์ หรือการดำเนินการปล่อยตัว

สุดท้ายนี้ คือขั้นตอนการใช้งานจริง ย้ายไฟล์นั้นไปยังสภาพแวดล้อมรันไทม์ เช่น Kubernetes (GKE), Google App Engine, Cloud Functions, บริการบน Kinsta, เซิร์ฟเวอร์ของคุณเองผ่าน SSH เป็นต้น จากนั้นคุณสามารถเชื่อมโยงขั้นตอนต่อไปได้ เช่น การทดสอบการทำงานหลังจากปรับใช้ หรือการแจ้งเตือนทาง Slack พร้อมรายละเอียดการเผยแพร่

ตัวอย่าง: กระบวนการทำงานแบบครบวงจร ประกอบด้วย ESLint, การทดสอบ และการปรับใช้บน Kinsta

ตัวอย่างที่เห็นได้ชัดเจนมากคือการใช้ GitHub Actions เพื่อตรวจสอบความถูกต้องของแอปพลิเคชัน React ด้วย ESLint และการทดสอบหน่วย จากนั้นจึงปรับใช้ไปยัง Kinsta โดยใช้ API ของ Kinsta ทุกอย่างถูกจัดการอย่างเป็นระบบในเวิร์กโฟลว์ CI/CD เดียว

ส่วนแรกของไฟล์ YAML กำหนดทริกเกอร์ และชื่อของไปป์ไลน์ ตัวอย่างเช่น ที่ทำงานในแต่ละขั้นตอน push y pull_request ไปยังสาขา mainและยังสามารถตั้งเวลาด้วยงาน CRON (ตัวอย่างเช่น ทุกวันเวลาเที่ยงคืน หรือทุกวันจันทร์เวลา 8:00 UTC) โดยใช้เหตุการณ์ได้อีกด้วย schedule.

งานแรกในลำดับขั้นตอนสามารถเรียกได้ว่า eslint และมีหน้าที่ตรวจสอบไวยากรณ์ของโค้ด โดยจะทำงานใน ubuntu-latest และใช้ Node เวอร์ชันต่างๆ (เช่น 18.x, 20.x) พร้อมขั้นตอนการดาวน์โหลดและกำหนดค่า Node actions/setup-nodeแคช dependency ของ npm แล้วติดตั้งด้วย npm ci และโยน npm run lint.

งานที่สอง testsขึ้นอยู่กับ... eslint ตลอด needs: eslintดังนั้นมันจะทำงานก็ต่อเมื่อการตรวจสอบไวยากรณ์สำเร็จเท่านั้น ภายในนั้น รูปแบบจะถูกทำซ้ำ: การตรวจสอบ การติดตั้งส่วนประกอบที่จำเป็น และการเรียกใช้งาน npm run test บน Node เวอร์ชันเฉพาะ

งานที่สาม deployมันถูกเชื่อมโยงหลังจากงานทั้งสองอย่าง การใช้ needs: และใช้ขั้นตอนที่มี curl เพื่อเรียกใช้ Kinsta API ในการทำเช่นนี้ จะต้องกำหนดค่า API key และ Application ID เป็น secrets ใน GitHub (KINSTA_API_KEY y APP_ID) และได้สัมผัสกับสิ่งเหล่านั้นในที่ทำงานผ่านทาง env เพื่อสร้างคำขอ POST ที่จะกระตุ้นการปรับใช้

สิ่งสำคัญคือต้องเข้าใจว่างานการติดตั้งนี้คืออะไร Kinsta ถือว่าการยอมรับ API นั้นเป็นความสำเร็จแล้ว อย่างไรก็ตาม หากการใช้งานจริงล้มเหลวภายใน Kinsta เอง เวิร์กโฟลว์ของ GitHub อาจยังคงแสดงสถานะสีเขียวอยู่ จึงควรระลึกไว้เสมอเพื่อหลีกเลี่ยงความประมาท และควรทำการตรวจสอบหลังการใช้งานเพิ่มเติมเพื่อเสริมกระบวนการให้สมบูรณ์

การจัดการ Cron ขั้นสูงและการกำหนดเวลาเวิร์กโฟลว์

ไวยากรณ์ CRON ใน GitHub Actions โดยอิงตามรูปแบบห้าฟิลด์ของ UNIX ได้แก่ นาที ชั่วโมง วันในเดือน เดือน และวันในสัปดาห์ แต่ละฟิลด์สามารถใช้งานได้ เครื่องหมายดอกจัน ช่วง รายการ และขั้นตอน (*, 1-5, 1,15,30, */5ซึ่งช่วยให้สามารถกำหนดตารางงานบำรุงรักษา การสำรองข้อมูล การทำความสะอาด หรือการตรวจสอบเป็นระยะได้

เช่น 0 0 * * * เรียกใช้เวิร์กโฟลว์ทุกเที่ยงคืน (UTC) ในขณะที่ 0 8 * * 1 ระบบจะทำเช่นนี้ทุกวันจันทร์ เวลา 8:00 น. ซึ่งจะทำงานร่วมกับกลไกการทำงานปกติได้อย่างราบรื่น push y pull_requestเพื่อให้ไฟล์ YAML เดียวกันสามารถตอบสนองต่อทั้งการเปลี่ยนแปลงโค้ดและการเรียกใช้งานตามกำหนดเวลาได้

ความสามารถนี้เหมาะสำหรับงานที่ไม่จำเป็นต้องปล่อยเวอร์ชันใหม่ทุกครั้งที่มีการคอมมิต: การสแกนความปลอดภัยอย่างละเอียด (เช่น ด้วย OWASP Dependency Check ใน Java), การตรวจสอบการพึ่งพา, การตรวจสอบความครอบคลุมของการทดสอบ หรือการล้างข้อมูลเก่าในรีจิสทรี

การนำเวิร์กโฟลว์กลับมาใช้ใหม่: การขยายขนาด CI/CD ไปยังคลังเก็บข้อมูลหลายร้อยแห่ง

เมื่อองค์กรของคุณมีคลังข้อมูลหลายสิบหรือหลายร้อยแห่งการคัดลอกและวางไฟล์ YAML เดียวกันทุกที่นั้นเป็นสูตรสำเร็จของความวุ่นวาย การเปลี่ยนแปลงใดๆ ก็ตามจำเป็นต้องแก้ไขครึ่งหนึ่งของ GitHub Enterprise ซึ่งทำให้แทบเป็นไปไม่ได้เลยที่จะรักษาความสม่ำเสมอและแนวปฏิบัติที่ดีที่สุด

ทางออกอยู่ที่การออกแบบเวิร์กโฟลว์ที่สามารถนำกลับมาใช้ซ้ำได้ โดยจะรวมศูนย์ไว้ในที่เก็บ "เทมเพลต" ของ CI/CD เวิร์กโฟลว์เหล่านี้จะเปิดเผยอินพุตและเอาต์พุต และแต่ละบริการจะกำหนดเพียงไฟล์ YAML ขนาดเล็กที่เรียกใช้บริการเหล่านั้น โดยส่งพารามิเตอร์ต่างๆ เช่น ประเภทของอาร์ติแฟกต์ (Docker, ไลบรารี Java, แพ็กเกจ npm), รันไทม์การปรับใช้ (GKE, GAE, Cloud Function เป็นต้น) หรือรายการงานที่ต้องดำเนินการ

รูปแบบทั่วไปคือการแยกเวิร์กโฟลว์ขนาดใหญ่ที่สามารถนำกลับมาใช้ซ้ำได้ออกเป็นสามส่วน: หนึ่งใน build-check-task (การบูรณาการอย่างต่อเนื่อง) อีกหนึ่งใน build-release-dockerfile หรือสิ่งประดิษฐ์อื่นๆ และการใช้งานครั้งที่สาม (deploy-gke, deploy-gaeเป็นต้น) เพื่อให้แต่ละที่เก็บข้อมูลสร้างไปป์ไลน์ของตนเองโดยการรวมเข้าด้วยกัน

เพื่อรวบรวมตรรกะที่ใช้ร่วมกัน เราสามารถกำหนดการกระทำแบบกำหนดเองได้ด้วย en .github/actionsตัวอย่างเช่น การกำหนดค่า Gradle, Java, Node หรือ Task, การรับเมตาเดต้าของบิลด์, การเผยแพร่ภาพ Docker, การติดแท็กเวอร์ชันใน Git ด้วยสคริปต์ bash หรือการส่งการแจ้งเตือนไปยัง Slack กฎสำคัญคือ คลังบริการควรใช้เวิร์กโฟลว์ที่นำกลับมาใช้ใหม่ได้เท่านั้น ไม่ควรใช้การกระทำเหล่านี้โดยตรง เพื่อให้สามารถจัดการกับความเข้ากันได้กับเวอร์ชันก่อนหน้าได้ง่ายขึ้น

การผสานรวมอย่างต่อเนื่องที่รวดเร็วด้วยงาน เมทริกซ์ และการวิเคราะห์แบบคงที่

ในระหว่างขั้นตอนการสร้างหรือตรวจสอบ ควรดำเนินการหลายอย่างพร้อมกันการทดสอบหน่วย (Unit tests), การวิเคราะห์แบบคงที่ (Static analysis) (PMD, Checkstyle, SpotBugs ใน Java; ESLint ใน JS/TS), การสแกนด้วย SonarCloud เป็นต้น สิ่งเหล่านี้ช่วยให้เวลาโดยรวมของกระบวนการทำงานอยู่ในระดับที่เหมาะสม แม้ในโค้ดเบสขนาดใหญ่

ไฟล์ Task (Taskfile.yml) ทำหน้าที่เป็นชั้นนามธรรม โดยใช้คำสั่งเฉพาะ ทำให้เวิร์กโฟลว์ CI สามารถเรียกใช้งานได้อย่างง่ายดาย task check, task test o task lintสำหรับโปรเจ็กต์ Java งานเหล่านี้สามารถมอบหมายให้ Gradle จัดการร่วมกับ JUnit, PMD, Checkstyle และ SpotBugs ได้ ส่วนสำหรับโปรเจ็กต์ Node.js สามารถมอบหมายให้ Jest, ESLint และเครื่องมือรักษาความปลอดภัยต่างๆ ได้ npm audit หรือคล้ายกัน

GitHub Actions เพิ่มส่วนของอาร์เรย์เข้าไป เพื่อเรียกใช้งานงานเดียวกันบนเวอร์ชันต่างๆ ของรันไทม์ เช่น การทดสอบไลบรารี Node บนเวอร์ชัน 16, 18 และ 20 หรือโปรเจ็กต์ Python บนเวอร์ชัน 3.10 และ 3.12 ทำได้ง่ายๆ เพียงแค่ประกาศอาร์เรย์ของเวอร์ชันและนำไปใช้ในการตั้งค่าของงาน

แนวทางนี้มีประโยชน์อย่างยิ่งในองค์กรที่ต้องการรองรับแพลตฟอร์มหลายประเภท (Java, Node, TypeScript, Python ฯลฯ) โดยไม่ต้องเขียนตรรกะของไปป์ไลน์ใหม่สำหรับแต่ละ repository: Task จะปรับให้เข้ากับแต่ละภาษา และเวิร์กโฟลว์ที่นำกลับมาใช้ใหม่ได้ยังคงเหมือนเดิมแทบทุกประการ

ขั้นตอนการเผยแพร่: การกำหนดเวอร์ชัน การติดแท็ก และการเผยแพร่ไฟล์ต่างๆ

เมื่อผ่านการตรวจสอบเรียบร้อยแล้ว ก็ถึงเวลาสร้างชิ้นงานที่จะนำไปใช้งานจริงอิมเมจ Docker, ไฟล์ JAR, แพ็กเกจ npm หรืออะไรก็ตามที่เหมาะสม ซึ่งเกี่ยวข้องทั้งเครื่องมือภาษาและนโยบายการลงทะเบียนและการกำหนดเวอร์ชันขององค์กร

โปรเจ็กต์ Java บางโปรเจ็กต์ใช้ปลั๊กอิน เช่น Gradle และ Axion เพื่อจัดการเวอร์ชันโดยใช้แท็ก Git ในบริบทแบบผสม (Java, Node.js ฯลฯ) อาจจะง่ายกว่าที่จะใช้สคริปต์ bash แบบกำหนดเองที่คำนวณเวอร์ชันถัดไป (เช่น โดยใช้ SemVer) สร้างแท็ก พุชไปยังรีโมต และสร้างรีลีสที่เกี่ยวข้อง

เครื่องมือเช่น git-cliff พวกมันช่วยสร้างบันทึกการเปลี่ยนแปลง การเปลี่ยนแปลงจะถูกจำแนกตามประเภท (เช่น ฟีเจอร์ การแก้ไข การเปลี่ยนแปลงที่ส่งผลกระทบอย่างมาก ฯลฯ) โดยพิจารณาจากข้อความใน commit message การผสานรวมการเปลี่ยนแปลงเหล่านี้เข้ากับ pipeline ช่วยให้มั่นใจได้ว่าทุกการปล่อยเวอร์ชันใหม่จะมี changelog ที่ชัดเจนโดยไม่ต้องมีใครเขียนด้วยตนเอง

ในการเผยแพร่ผลงาน จะต้องมีการดำเนินการและข้อมูลประจำตัวที่เหมาะสมร่วมกันDocker registry (Docker Hub, GitHub Container Registry, Artifact Registry), Maven repositories, npm registries เป็นต้น ข้อมูลรับรองจะถูกจัดเก็บเป็นความลับและจะถูกส่งเข้าไปในงานเฉพาะเมื่อจำเป็นเท่านั้น

การปรับใช้แบบต่อเนื่องไปยัง Kubernetes, GCP, Kinsta และสภาพแวดล้อมอื่นๆ

การปรับใช้ (Deployment) คือส่วนที่ CI/CD ทำงานร่วมกับโครงสร้างพื้นฐานGitHub Actions สามารถทำงานร่วมกับแพลตฟอร์มต่างๆ ได้อย่างราบรื่น ไม่ว่าจะเป็น Kubernetes, App Engine, Cloud Functions, เซิร์ฟเวอร์แบบดั้งเดิม และแพลตฟอร์มอย่าง Kinsta เป็นต้น

สำหรับ Kubernetes (เช่นใน GKE) รูปแบบปกติจะเป็นดังนี้ ขั้นตอนคือ: ยืนยันตัวตนกับ Google Cloud (โดยใช้ขั้นตอนอย่างเป็นทางการ) และกำหนดค่า kubectl ภายในบริบทของคลัสเตอร์ ให้ใช้ Helm manifest หรือ chart และหากจำเป็น ให้ดำเนินการ rollout แบบควบคุม (เช่น ด้วย canary หรือ blue-green) และตรวจสอบสถานะด้วยคำสั่งต่างๆ kubectl rollout status.

ในกรณีของ App Engine หรือ Cloud Functionsกระบวนการนี้จะสร้างอิมเมจหรืออาร์ติแฟกต์ เผยแพร่ไปยัง Artifact Registry จากนั้นจึงเรียกใช้คำสั่งการปรับใช้ gcloud เหมาะสมแล้ว โดยใช้ข้อมูลประจำตัวที่ได้รับการจัดการ เช่น รหัสลับและตัวเรียกใช้งานชั่วคราว

เมื่อทำการติดตั้งใช้งานกับ API ภายนอก เช่น Kinstaโดยปกติแล้วแค่ก้าวเดียวก็เพียงพอแล้ว curl หรือการดำเนินการเฉพาะที่ส่งคำขอพร้อมโทเค็นการตรวจสอบสิทธิ์และพารามิเตอร์ที่จำเป็น (รหัสแอป สาขา ฯลฯ) ถือว่างานสำเร็จหาก API ตอบสนองต่อคำขอเปิดตัวเวอร์ชันใหม่ได้อย่างถูกต้อง

การติดตั้งระบบใหม่มักจะมีประกาศแจ้งให้ทราบล่วงหน้าเสมอ ส่งข้อมูลไปยัง Slack, Teams หรือเครื่องมือสื่อสารอื่นๆ โดยระบุว่ามีการใช้งานบริการใด ในสภาพแวดล้อมใด เวอร์ชันใด ใครเป็นผู้เริ่มการทำงาน และลิงก์ไปยังบันทึกเวิร์กโฟลว์ ในสภาพแวดล้อมการใช้งานจริง ข้อมูลนี้ยังใช้สำหรับการตรวจสอบและติดตามย้อนกลับได้อีกด้วย

การควบคุมคุณภาพ: ความปลอดภัย การตรวจสอบ และบันทึกข้อมูล

การสร้างและปรับใช้แบบอัตโนมัติเป็นสิ่งที่ดี แต่หากขาดการมองเห็นภาพรวมก็ไร้ประโยชน์ ในส่วนของสิ่งที่เกิดขึ้นนั้น กระบวนการทำงานอาจกลายเป็นกล่องดำได้ GitHub Actions มีบันทึกรายละเอียดการทำงาน บันทึกตามงาน และบันทึกตามขั้นตอน ช่วยให้คุณสามารถวินิจฉัยความล้มเหลวในการคอมไพล์ การทดสอบ หรือการปรับใช้ได้อย่างแม่นยำ

สำหรับความต้องการขั้นสูงยิ่งขึ้น จะมีการบูรณาการบริการตรวจสอบจากภายนอกเข้ามาด้วย เช่น Datadog, New Relic หรือ Splunk ซึ่งรวบรวมเมตริกเกี่ยวกับเวิร์กโฟลว์ เวลาในการดำเนินการ อัตราความล้มเหลว ฯลฯ ช่วยในการตรวจจับปัญหาคอขวดและจัดลำดับความสำคัญของการเพิ่มประสิทธิภาพไปป์ไลน์

ในขณะเดียวกัน ความปลอดภัยก็มีบทบาทสำคัญอย่างยิ่ง: การจัดการข้อมูลลับที่เข้ารหัส การกำหนดนโยบายการเข้าถึงขั้นต่ำที่จำเป็น การตรวจสอบสิทธิ์ในการดำเนินการ การรวมเครื่องมือสแกนช่องโหว่ของโค้ดและส่วนประกอบที่เกี่ยวข้อง (การสแกนโค้ด การสแกนข้อมูลลับ OWASP เป็นต้น) เข้าไว้ในเวิร์กโฟลว์เอง

หลายทีมยังเพิ่มการทดสอบหลังการใช้งานเข้าไปด้วย ในสภาพแวดล้อมที่ได้รับการปรับปรุงใหม่นี้ จะมีการทดสอบการทำงานแบบครบวงจร การตรวจสอบประสิทธิภาพ การทดสอบเบื้องต้น และหากมีสิ่งใดผิดพลาด จะมีกลไกการย้อนกลับอัตโนมัติเพื่อกู้คืนเวอร์ชันเสถียรก่อนหน้า

การกำกับดูแลเวิร์กโฟลว์: สาขาที่ได้รับการปกป้องและคำขอรวมโค้ด

วิธีจัดการกับสาขาและคำขอรวมโค้ด (pull request) ต้องสอดคล้องกับ CI/CD เพื่อให้ทุกอย่างสมเหตุสมผล สิ่งที่พบได้บ่อยที่สุดคือการปกป้องสาขาหลัก (main o masterและกำหนดให้การเปลี่ยนแปลงใดๆ ต้องผ่านกระบวนการ Pull Request (PR) และผ่านการตรวจสอบในขั้นตอนต่างๆ ก่อน

GitHub อนุญาตให้คุณกำหนดกฎการป้องกันสาขาได้ นโยบายเหล่านี้บังคับให้ใช้ pull request ป้องกัน commit โดยตรง และกำหนดให้ต้องผ่านการตรวจสอบสถานะบางอย่าง (เวิร์กโฟลว์การดำเนินการเฉพาะ) ให้เป็นสีเขียวก่อนจึงจะอนุญาตให้รวมโค้ดได้ นอกจากนี้ยังอาจกำหนดจำนวนการแก้ไขขั้นต่ำ กฎการอนุมัติ ฯลฯ ด้วย

โมเดลนี้รับประกันว่าโค้ดที่นำไปใช้งานจริงนั้นมีคุณภาพ เอกสารนี้ผ่านการตรวจสอบโดยมนุษย์และการตรวจสอบอัตโนมัติทุกขั้นตอนแล้ว ซึ่งช่วยลดความเสี่ยงที่จะเกิดข้อผิดพลาดหรือช่องโหว่ร้ายแรงได้อย่างมาก

ในบริษัทที่มีสภาพแวดล้อมหลากหลายรูปแบบ การปรับใช้ (การพัฒนา, การทดสอบ, การใช้งานจริง) ไปยังสภาพแวดล้อมการใช้งานจริงมักสงวนไว้สำหรับการรวมเข้ากับสาขาหลัก ในขณะที่สาขาอื่นๆ อาจกระตุ้นการปรับใช้ไปยังสภาพแวดล้อมก่อนหน้าสำหรับการทดสอบภายในหรือการสาธิต

เมื่อมองภาพรวมแล้ว การมีไปป์ไลน์ CI/CD ที่ออกแบบมาอย่างดีโดยใช้ GitHub Actions นั้นเป็นสิ่งสำคัญ มันกลายเป็นหัวใจหลักของการพัฒนา: การผสานรวมการเปลี่ยนแปลง การรันชุดทดสอบที่ครอบคลุม การสร้างและเผยแพร่สิ่งประดิษฐ์ การปรับใช้ไปยังแพลตฟอร์มคลาวด์หลายแห่ง การตรวจสอบด้วยเครื่องมือสังเกตการณ์ และการกำกับดูแลด้วยกฎการแยกสาขาและการร้องขอการดึงข้อมูลที่ชัดเจน ด้วยเวิร์กโฟลว์ที่นำกลับมาใช้ใหม่ได้ การดำเนินการแบบกำหนดเอง เครื่องมือเสริม เช่น Task, Release Action และ Git Cliff และการจัดการความลับและสิทธิ์ที่แข็งแกร่ง ทำให้สามารถรองรับทุกอย่างตั้งแต่แอป Python อย่างง่ายไปจนถึงสถาปัตยกรรม Kubernetes ที่ซับซ้อน รักษาความเร็วในการส่งมอบ คุณภาพของโค้ด และความปลอดภัยโดยไม่ทำให้ทีมต้องรับภาระงานด้วยตนเองมากเกินไป

สีฟ้า
บทความที่เกี่ยวข้อง:
คู่มือปฏิบัติสำหรับเหตุการณ์บนคลาวด์ใน Microsoft Azure และ Microsoft 365