วิธีการทำ CD/CI บน Azure DevOps

เกริ่น


สมัยนี้ อะไรๆ ก็ต้อง Automation กันหมด เพื่อให้เราสบายขึ้น
จะได้มีเวลาไปทำงานเพิ่ม 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 เปลี่ยนเป็น

Data Source=DB_PROD;Initial Catalog=DATABASE_NAME;Persist Security Info=True;User ID=sa;Password=sa


วิธีการนั้นแสนจะง่ายดาย
เริ่มจากไปตั้งตัวแปรก่อน
อยู่ในหน้า Release pipeline นี่แหละ เข้า menu Variables


แล้วตั้งค่าตามนี้




  • Name คือชื่อของ key connection string ที่จะค้นหาเพื่อเปลี่ยน
  • Value คือค่าใหม่ที่ต้องการไปแทนที่
  • Scope คือกำหนดว่าตัวแปรนี้ให้ทำงานเฉพาะ Stage ไหน

เมื่อตั้งค่าตัวแปรเสร็จแล้ว ก็ไปเช็คว่า Task IIS Web App Deploy ถูกติ๊กที่ช่อง XML variable substitution หรือยัง 
ถ้าติ๊กแล้วก็เรียบร้อย แค่นี้ครับ เสร็จแล้ว

ส่วน XML tranformation ไม่ต้องติ๊กนะครับผมขี้เกียจเขียน 555

ทั้งนี้เป็นแค่ 1 ในวิธีการเปลี่ยน web.config ให้เป็นค่าที่เราต้องการนะครับ










Comments

Popular posts from this blog

Function MS SQL แปลงตัวเลขเป็นบาท

Line Notify ด้วย VB.Net

ตรวจสอบค่าว่าเป็นตัวเลข MSSQL