DevOps
น้องๆ เคยไหม เขียนโปรแกรมเสร็จแล้ว อยากเอาขึ้น Server ให้ชาวบ้านเค้าใช้กัน แต่ต้องมานั่ง FTP ไฟล์, SSH เข้าไปรันคำสั่ง, แก้ Config วุ่นวายไปหมด สมัยผมทำร้านเน็ต SiamCafe แรกๆ ก็เป็นแบบนี้แหละ (เมื่อ 20 กว่าปีที่แล้วนะ!) กว่าจะได้เปิดร้านแต่ละวัน แทบจะไม่ได้นอน
Azure DevOps Pipeline นี่แหละ คือพระเอกที่จะมาช่วยชีวิตเรา! มันคือเครื่องมือที่ช่วยให้เราทำสิ่งที่เรียกว่า CI/CD (Continuous Integration/Continuous Deployment) ได้ง่ายขึ้น พูดง่ายๆ คือ เมื่อเราแก้ไขโค้ด แล้วสั่งให้ Pipeline ทำงาน มันจะจัดการตั้งแต่ Build โค้ด, Test โค้ด, ไปจนถึง Deploy โค้ดขึ้น Server ให้เราแบบอัตโนมัติเลย เจ๋งป่ะล่ะ?
ทำไมมันถึงสำคัญน่ะเหรอ? ลองคิดดูสิว่า ถ้าเราต้องทำทุกอย่างเองหมด มันเสียเวลาขนาดไหน แถมยังผิดพลาดง่ายอีกด้วย Pipeline ช่วยลดเวลา, ลดความผิดพลาด, และทำให้เรามั่นใจได้ว่า Software ที่เราปล่อยออกไป มันมีคุณภาพจริงๆ
ก่อนจะไปลุย Pipeline กันจริงๆ เรามาปูพื้นฐานกันก่อนนิดนึงนะ จะได้ไม่งง
อันนี้สำคัญสุดๆ เพราะ Pipeline ส่วนใหญ่ จะทำงานร่วมกับ Git (หรือ Version Control อื่นๆ) Git ช่วยให้เรา track การเปลี่ยนแปลงโค้ด, ทำงานร่วมกับคนอื่นได้ง่ายขึ้น และย้อนกลับไปโค้ดเวอร์ชั่นเก่าๆ ได้ ถ้าใครยังไม่รู้จัก Git แนะนำให้ไปศึกษาเพิ่มเติมก่อนนะ
สมัยผมเริ่มเขียนโปรแกรมใหม่ๆ ยังไม่มี Git เลยนะ! แก้โค้ดทีนึง ต้อง Backup ไฟล์ไว้หลายๆ เวอร์ชั่น กลัวพังแล้วกู้คืนไม่ได้ ชีวิตลำบากกว่าเยอะ
YAML คือภาษาที่ใช้เขียน Pipeline ใน Azure DevOps มันเป็นภาษาที่อ่านง่าย คล้ายๆ กับ JSON แต่มีความยืดหยุ่นกว่านิดหน่อย เราจะใช้ YAML ในการกำหนดขั้นตอนต่างๆ ใน Pipeline
ไม่ต้องกลัวนะ YAML ไม่ได้ยากอย่างที่คิด! เดี๋ยวเราจะค่อยๆ เรียนรู้ไปพร้อมๆ กัน
ก่อนจะสร้าง Pipeline ได้ เราต้องมี Azure DevOps Project ก่อน Project ก็เหมือนกับ Container ที่เก็บ Source Code, Pipeline, และ Artifacts ต่างๆ ของเรา
ถ้ายังไม่มี Azure DevOps account ก็ไปสมัครได้ฟรีนะ ที่ Azure DevOps
เอาล่ะ! ได้เวลาลงมือทำกันแล้ว เริ่มจากสร้าง Project ใน Azure DevOps ก่อนเลย
ง่ายใช่ไหม? ทีนี้เราก็พร้อมที่จะสร้าง Pipeline กันแล้ว
เราจะมาสร้าง Pipeline ง่ายๆ ที่ดึง Source Code จาก Git Repository, Build โค้ด (สมมติว่าเป็น Node.js), และ Run Test กัน
Azure DevOps จะสร้าง Pipeline ให้เราโดยอัตโนมัติ ซึ่งเราสามารถแก้ไข Pipeline ได้ตามต้องการ
ถ้าเราเลือก "YAML" ในขั้นตอนที่แล้ว เราจะต้องเขียน Pipeline เอง ใน YAML ไฟล์ เราจะกำหนด Trigger, Stages, Jobs, และ Tasks ต่างๆ
ตัวอย่าง Pipeline YAML สำหรับ Node.js project:
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
inputs:
versionSpec: '16.x'
displayName: 'Install Node.js'
- script: |
npm install
npm test
displayName: 'npm install and test'
โค้ดด้านบน คือตัวอย่างง่ายๆ ที่จะ Install Node.js version 16.x, Run npm install เพื่อติดตั้ง dependencies, และ Run npm test เพื่อรัน Unit Test
ลองเอาไปปรับใช้กับ Project ของน้องๆ ดูนะ! ถ้าติดตรงไหน ถามมาได้เลย
หลังจากที่เราแก้ไข Pipeline เสร็จแล้ว ก็กดปุ่ม "Save & run" เพื่อสั่งให้ Pipeline ทำงานได้เลย
Azure DevOps จะแสดง Log ให้เราดูว่า Pipeline ทำงานยังไงบ้าง ถ้ามี Error ก็จะแจ้งให้เราทราบ
ถ้าทุกอย่างเรียบร้อย เราก็จะได้ Software ที่ Build และ Test เรียบร้อย พร้อมที่จะ Deploy ขึ้น Server แล้ว!
อย่าลืมแวะไปอ่านบทความอื่นๆ ที่ SiamCafe Blog นะ มีเรื่อง IT สนุกๆ อีกเยอะเลย
ดูวิดีโอเพิ่มเติมเกี่ยวกับAzure Devops Pipeline Tutorial:
Azure DevOps Pipeline ไม่ใช่เครื่องมือ CI/CD เพียงอย่างเดียวนะ ยังมีทางเลือกอื่นๆ อีกมากมาย เช่น Jenkins, GitLab CI, CircleCI, GitHub Actions แต่ละตัวก็มีข้อดีข้อเสียต่างกัน
สมัยผมทำร้านเน็ต ก็เคยลองใช้ Jenkins นะ ตอนนั้นมันฮิตมาก แต่ Config ยาก แถมต้องดูแล Server เองอีก เหนื่อยสุดๆ
| เครื่องมือ | ข้อดี | ข้อเสีย |
|---|---|---|
| Azure DevOps Pipeline | ใช้งานง่าย, Integrate กับ Azure Services ได้ดี, มี Features ครบ | อาจจะมีค่าใช้จ่ายสูง ถ้าใช้ Resources เยอะ |
| Jenkins | Open Source, Free, มี Plugins ให้เลือกเยอะ | Config ยาก, ต้องดูแล Server เอง |
| GitLab CI | Integrate กับ GitLab ได้ดี, ใช้งานง่าย | อาจจะมี Features ไม่เท่า Azure DevOps |
| GitHub Actions | Integrate กับ GitHub ได้ดี, ใช้งานง่าย | อาจจะมี Features ไม่เท่า Azure DevOps |
| CircleCI | ใช้งานง่าย, มี Community ที่แข็งแกร่ง | อาจจะมีค่าใช้จ่ายสูง |
เลือกเครื่องมือที่เหมาะกับ Project และความถนัดของตัวเองนะ ไม่มีเครื่องมือไหนที่ "ดีที่สุด" สำหรับทุกสถานการณ์
ถ้าสนใจเรื่องราวสมัยเปิดร้านเน็ตใหม่ๆ ลองอ่านที่ SiamCafe Blog ได้นะ
สมัยผมทำร้านเน็ต SiamCafe เนี่ย เรื่องระบบหลังบ้านสำคัญมากนะ เพราะถ้าล่มที ลูกค้าโวยวายกันทั้งร้าน! Azure DevOps Pipeline ก็เหมือนกัน ถ้าเราทำตาม Best Practices ชีวิตจะง่ายขึ้นเยอะเลย
1. Version Control is King: ไม่ว่าอะไรก็แล้วแต่ โยนเข้า Git ให้หมด! Script, Config, แม้แต่ Document ก็ต้อง Version Control สมัยก่อนผมเคยพลาด แก้ไฟล์ Config ตรงๆ บน Server แล้วเจ๊งทั้งระบบ เพราะจำไม่ได้ว่าแก้ตรงไหนไปบ้าง เข็ดเลย!
2. Infrastructure as Code (IaC): อย่าไปคลิกๆ สร้าง VM ใน Azure Portal เลย มันไม่เท่! ใช้ Terraform หรือ ARM Template สร้าง Infrastructure ซะ แล้วเอา Code พวกนั้นใส่ Pipeline ไปเลย เวลาจะสร้าง Environment ใหม่ กดปุ่มเดียวจบ!
3. Test, Test, Test!: สมัยก่อน Test นี่คืออะไร? "ลองรันดูแล้วไม่ error ก็ถือว่าใช้ได้" (หัวเราะ) แต่ยุคนี้มันไม่ได้แล้วนะ ต้องมี Unit Test, Integration Test, End-to-End Test เขียน Test ให้ครอบคลุมที่สุดเท่าที่จะทำได้ แล้วใส่ Test เข้าไปใน Pipeline ทุก Stage!
4. Monitor Everything: Pipeline รันผ่านก็จริง แต่ Production อาจจะพังก็ได้ ต้องมี Monitoring ที่ดี คอย Alert เราเมื่อมีอะไรผิดปกติ สมัยก่อนผมเคยเจอ Memory Leak ใน Server กว่าจะรู้ตัว ลูกค้าบ่นกันเพียบ! ใช้ Azure Monitor หรือ Prometheus ก็ได้ เลือกที่มันเข้ากับ Ecosystem เรา
ตัวอย่าง Yaml สำหรับ Azure Pipeline (Integration Test):
stages:
- stage: Test
jobs:
- job: IntegrationTests
pool:
vmImage: 'ubuntu-latest'
steps:
- task: DotNetCoreCLI@2
displayName: 'Run Integration Tests'
inputs:
command: 'test'
projects: '**/*IntegrationTests.csproj'
arguments: '--configuration Release'
ลองดูว่า Job ไหนมันใช้เวลานานผิดปกติ อาจจะต้อง Optimize Code, เพิ่ม Resource ให้ Agent Pool หรือลองใช้ Parallelism ใน Pipeline ดู
เป็นไปได้หลายอย่าง แต่ส่วนใหญ่เกิดจาก 1. Config ไม่ถูกต้อง 2. Dependency หายไป 3. Database Migration ไม่สมบูรณ์ ลองเช็ค Error Log ดู แล้วไล่แก้ไปทีละจุด
ถ้าทุกอย่างเป็น Infrastructure as Code (IaC) ก็แค่ Rollback Commit ใน Git แล้วรัน Pipeline อีกรอบ! แต่ถ้าไม่ใช่... ก็ตัวใครตัวมัน (หัวเราะ)
Agent Pool คือ Server ที่เอาไว้รัน Pipeline ของเรา Azure มี Hosted Agent ให้ใช้ฟรีๆ แต่ถ้าอยากได้ Spec แรงๆ หรืออยาก Control Environment เอง ก็ต้องสร้าง Self-hosted Agent ขึ้นมา
YAML คือภาษาที่ใช้ Define Pipeline ใน Azure DevOps มันอ่านง่ายกว่า XML เยอะ (สมัยก่อนผมเกลียด XML มาก!) ลองศึกษาดู แล้วชีวิตจะง่ายขึ้นเยอะ
Azure DevOps Pipeline เป็นเครื่องมือที่ทรงพลังมาก ถ้าเราใช้มันอย่างถูกต้อง มันจะช่วยให้เรา Deploy Software ได้เร็วขึ้น มั่นใจมากขึ้น และลดโอกาสเกิด Error ได้เยอะมาก แต่ก็ต้องศึกษา และลองผิดลองถูกกันไป ลองเข้าไปอ่าน SiamCafe Blog ดูนะ เผื่อมีอะไรที่เป็นประโยชน์
อย่าลืมว่า DevOps ไม่ใช่แค่เครื่องมือ แต่เป็น Culture ด้วย ต้องให้ทั้งทีมเข้าใจ และเห็นความสำคัญของมัน แล้วชีวิตจะดีขึ้นเยอะเลย! และถ้าสนใจ Forex ลองดูที่ iCafeForex ได้นะ