วิธีการทำ CD/CI บน Azure DevOps
เกริ่น
จะได้มีเวลาไปทำงานเพิ่ม Productivity
CI/CD คือกระบวนการการส่งมอบระบบให้กับลูกค้า
CI = การเตรียมพร้อม (Compile / Build)
CD = การส่งมอบ (Deploy)
ระบบที่ผมใช้ปัจจุบัน ผมใช้ Azure DevOps เป็นตัว Source Control
รองรับทั้ง Git และ Team Foundation
ซึ่งจะแตกต่างกันไปในการ Control
ตอนหลังๆ เริ่มสนใจการทำ CI/CD เพราะเจอปัญหาว่าต้อง Deploy ระบบตอนตี 2
แล้วต้องนอนไว เพื่อตื่นตี 2 หรือลากยาวเลย
ทีนี้ถ้าเราไม่อยากต้องมาทำแบบนั้นละ
พระเอกของเราก็นี่ไง CI/CD มีอยู่แล้วบน Azure DevOps
เกริ่นมานานเข้าเรื่อง ถึงวิธีการ Setup เลยนะครับ
เริ่มจากการสร้าง CI Pipeline
คลิกเมนู Pipelines > Pipelines > Create Pipeline
![]() |
คลิกเลือก Use the classic editor ....
เลือก Source จาก Azure Repos Git แล้วคลิก Continue
การเลือก Source ขึ้นอยู่กับว่า Source เราอยู่ที่ไหนนะ
ถ้าเป็น Team Foundation ก็เลือก TFVC
จากนั้นเค้าจะให้เราเลือกว่าจะสร้างจาก Template ที่เค้าตั้งให้แล้ว หรือสร้างจาก Empty Job เลย (ไม่มีอะไรเลย)
ในที่นี้ผมทำระบบด้วย .Net C# ก็เลยค้นหา .net
เพื่อจะใช้ Template ASP.NET
ในส่วนนี้ก็แล้วแต่ว่าระบบพัฒนามาด้วยอะไร
ถ้าเป็น Node.js หรือ React.js ก็จะมี Template ให้ใช้เพื่อ build code ได้เช่นกัน
หลังจากคลิกเลือก ASP.NET > Apply ก็จะมาหน้าถัดไป
จะเห็นว่าใน Template ที่เลือกไว้ จะมีการติดตั้งเครื่องมือเป็นส่วนๆ ให้เราแล้ว
- Use NuGet 4.1.1
- เป็นตัว update package ที่อยู่ใน project โดยปกติผมจะปิดหรือลบตัวนี้ออกไปเลย เพราะไม่ต้องการให้ update package ป้องกัน การเกิด conflict ของ dependencies
- NuGet restore
- เพื่อ restore pack push nuget package โดยปกติผมปิดนะ เผื่ออนาคตจะใช้ขึ้นมา ก็ไม่ต้องไปแอดเพิ่ม
- Build solution
- มีค่าเดียวที่ปกติผมจะไปปรับ คือให้มัน compile เป็น x64
- Test Assemblies
- สำหรับ run test ปกติผมก็ปิดไว้ เพราะไม่ได้เขียน test
- Publish symbols path
- ไม่รู้เหมือนกัน XD ปล่อยไว้ค่า default
- Publish Artifact
- build source code เสร็จ แล้วนำตัวที่ build หรือ compile เสร็จแล้ว นำไปวางรอไว้ ให้ CD เอาไปใช้
และสำคัญเลย ให้ไปเปิด auto CI continuose integration
Menu Triggers > Enable CI continuose integration
ทีนี้เมื่อ code มีการถูก update เมื่อไหร่ ระบบจะ build หรือสั่งให้ CI ทำงานทันที
เสร็จแล้วก็กด Save & Queue ได้เลย
เท่านี้ตัว CI ก็เสร็จแล้ว ประมาณนี้
ไปต่อกันที่ CD เพื่อมาเอา Artifact จาก CI ไป Deploy ลง Server กัน
การทำ CD
เข้าเมนู Pipelines > Release > New pipeline
เลือก Template IIS website deployment
เลือกเมนู Tasks
เพื่อเข้าไปจัดการว่าตอน Deploy ไป Windows Server
- คลิกเลือก Stage 1 เพื่อเปลี่ยน Configuration type เป็น IIS Web Application
- จะให้ติดตั้ง IIS ไหม
- ตั้งค่า Port ไหม
- สร้าง app pool หรือไม่ และ .net version อะไร
- Physical path อยู่ไหน
ในส่วนนี้ ที่ดูยุ่งยากสุดจะเป็นการทำ Deployment group เนื่องจากต้องมีการติดตั้ง agent บนเครื่อง server ปลายทางเพื่อทำงานร่วมกับ Azure DevOps ในการรับไฟล์มาติดตั้งบน IIS
แต่ถ้าเราจะ Deploy ขึ้น Server Azure จะง่ายกว่านี้มาก ขั้นตอนพวกนี้จะหายไปเกือบหมด
แน่นอนละ เค้าอยากให้เราเสียเงิน แต่ยอมรับว่า Server Azure ดีจริง
อ่า สรุปขอข้ามไปแล้วกันนะการติดตั้ง agent บน local server ของเรา
จะไปเน้นเรื่องการทำ web.config เพื่อเปลี่ยนค่า connection string หา UAT หรือ Production
ยังไม่หมดนะ สุดท้ายท้ายสุด ที่จะทำให้ CD Auto ทำงาน เมื่อมีการ Build จาก CI เสร็จก็คือ
การตั้งค่าตามรูปโดยเริ่มจากคลิกสายฟ้า และเปิด CD trigger
ตั้งให้ CD Deploy ไปได้ตั้ง UAT และ Production
ภาพคร่าวๆ ของ CD จะเป็นแบบนี้
ผมตั้งใจไว้แบบนี้
- CI ทำงานเสร็จ CD จะ Auto ทำงานต่อทันที
- เมื่อ CD ทำ จะเริ่ม Deploy ลง UAT Server ก่อน ด้วย web.config สำหรับ UAT
- หลังจาก Deploy UAT เรียบร้อย ระบบจะหยุด เพื่อรอผมอนุมัติที่จะ Deploy ลอง Production
- ถ้าผม Approve ก็จะ Deploy ลง Production ด้วย web.config สำหรับ production
การตั้งให้มี Approve ก่อน Deploy Stage Production
เริ่มจากคลิกสายฟ้าที่หน้า Stage
- เปิด Enabled Pre-deployment approvals
- ระบุผู้ที่อนุมัติได้ลงไป
- Timeout หมายถึง ถ้าไม่มีการอนุมัติภายในเวลานี้ จะถูกปัดตกทันที
- Gates หมายถึงการหน่วงเวลาก่อน Deploy อีกที เผื่อมี bug หรือเตรียมความพร้อม
การตั้งให้ CD เปลี่ยนค่าของ web.config ตามแต่ละ Stage
สิ่งที่เราต้องการคือ ต้องการเปลี่ยน ConnectionString เพื่อติดต่อ Database ใน web.config
จากค่าเดิมให้เปลี่ยนเป็นอะไร
สมมติ
web.config จากเดิมเป็นแบบนี้
Data Source=DB_DEV;Initial Catalog=DATABASE_NAME;Persist Security Info=True;User ID=sa;Password=sa
ถ้าไป UAT ผมจะให้ CD เปลี่ยนเป็น
Data Source=DB_UAT;Initial Catalog=DATABASE_NAME;Persist Security Info=True;User ID=sa;Password=sa
ถ้าไป Production ผมจะให้ CD เปลี่ยนเป็น
แล้วตั้งค่าตามนี้
- Name คือชื่อของ key connection string ที่จะค้นหาเพื่อเปลี่ยน
- Value คือค่าใหม่ที่ต้องการไปแทนที่
- Scope คือกำหนดว่าตัวแปรนี้ให้ทำงานเฉพาะ Stage ไหน
เมื่อตั้งค่าตัวแปรเสร็จแล้ว ก็ไปเช็คว่า Task IIS Web App Deploy ถูกติ๊กที่ช่อง XML variable substitution หรือยัง
ถ้าติ๊กแล้วก็เรียบร้อย แค่นี้ครับ เสร็จแล้ว
ส่วน XML tranformation ไม่ต้องติ๊กนะครับผมขี้เกียจเขียน 555
ทั้งนี้เป็นแค่ 1 ในวิธีการเปลี่ยน web.config ให้เป็นค่าที่เราต้องการนะครับ
Comments