Chuyển đến nội dung chính

Hướng dẫn Azure Pipelines: Cẩm nang CI/CD hoàn chỉnh cho người mới bắt đầu

Hướng dẫn này chỉ bạn cách thiết lập, vận hành và tối ưu hóa quy trình CI/CD bằng Azure Pipelines.
· 15 phút đọc

Khám phá cùng AI

Nếu đường ống CI/CD của bạn liên tục hỏng hoặc chậm chạp, bạn không đơn độc. Tôi từng phải xử lý các bản build thất bại, môi trường không khớp, và đồng đội vô tình ghi đè công việc của tôi. Azure Pipelines loại bỏ những phiền toái này với một dịch vụ trên đám mây có thể build, kiểm thử và triển khai hầu như mọi dự án trên mọi nền tảng.

Vì vậy trong hướng dẫn này, tôi sẽ chỉ bạn cách:

  1. Tạo Azure Pipeline đầu tiên của bạn
  2. Build dự án của bạn trên đám mây
  3. Thêm kiểm thử tự động để phát hiện lỗi sớm
  4. Triển khai lên staging hoặc production chỉ với một lần đẩy mã
  5. Giám sát và tối ưu pipeline về tốc độ và độ tin cậy
  6. Tuân theo các thực tiễn tốt nhất đã được kiểm chứng trên dự án thực tế

Bắt đầu thôi!

Azure Pipelines là gì?

Azure Pipelines là một giải pháp dựa trên đám mây giúp đơn giản hóa việc phát triển, kiểm thử và triển khai ứng dụng. 

Đây là một thành phần của bộ công cụ Azure DevOps, hỗ trợ toàn bộ vòng đời phát triển phần mềm. Nó cũng là lựa chọn linh hoạt cho mọi quy mô đội ngũ vì hỗ trợ nhiều nền tảng và ngôn ngữ lập trình. Azure Pipelines tích hợp với GitHub, Azure Repos và các hệ thống quản lý phiên bản phổ biến khác. 

Các tính năng cốt lõi của Azure Pipelines bao gồm: 

Dịch vụ

Mục đích

Hỗ trợ đa nền tảng

Azure Pipelines tự động hóa việc build và triển khai ứng dụng cho nhiều hệ điều hành như Linux, macOS và Windows.

Tích hợp với hệ thống quản lý phiên bản

Azure Pipelines kết nối tới kho mã của bạn như Azure Repos, GitHub và các hệ thống quản lý phiên bản phổ biến khác.

Cấu hình pipeline bằng YAML

Azure Pipelines cho phép định nghĩa quy trình build và triển khai dưới dạng mã, giúp dễ dàng quản lý phiên bản.

Tích hợp liên tục và Triển khai liên tục (CI/CD)

Azure Pipelines hỗ trợ toàn bộ quy trình từ tích hợp thay đổi mã đến triển khai ứng dụng.

Theo kinh nghiệm của tôi, Azure Pipelines hữu ích cho bất kỳ ai muốn có CI/CD bài bản trong đội. Nó linh hoạt, có khả năng mở rộng và tích hợp tốt với các dịch vụ Azure khác.

Kiến trúc Azure Pipelines là một thiết lập tự động hóa quy trình build, kiểm thử và triển khai mã. Bắt đầu khi nhà phát triển đẩy thay đổi mã lên kho. Hệ thống sau đó chạy chuỗi tác vụ tự động như linting, build và kiểm thử. Khi hoàn tất, mã được triển khai sang các môi trường như staging và production. Kiến trúc này đảm bảo thay đổi mã được phân phối nhất quán và đáng tin cậy, giúp đội ngũ duy trì chất lượng phần mềm cao.

Kiến trúc Azure Pipelines (Nguồn: Microsoft).

Nếu bạn muốn có cái nhìn rộng hơn về Azure DevOps ngoài pipelines, hướng dẫn Azure DevOps này sẽ đi qua toàn bộ vòng đời CI/CD từ đầu đến cuối.

Thiết lập Azure Pipeline đầu tiên của bạn

Để làm việc với môi trường Azure Pipelines, trước hết chúng ta cần thiết lập mọi thứ để hỗ trợ quy trình build, kiểm thử và triển khai end-to-end.

Điều kiện tiên quyết

Trước khi bắt đầu tạo pipeline đầu tiên, hãy đảm bảo bạn có những thứ sau:

  1. Tài khoản và tổ chức Azure DevOps: Đăng ký Azure DevOps nếu bạn chưa có. Tạo một tổ chức để quản lý dự án của bạn. 
  2. Kho mã: Bạn sẽ cần một kho mã với dự án mẫu. Có thể lưu trữ ở Azure Repos hoặc GitHub. Trong hướng dẫn này, chúng ta sẽ dùng một dự án Node.js đơn giản.
  3. Truy cập Azure portal: Bạn cũng sẽ cần truy cập Azure portal khi muốn triển khai lên các dịch vụ Azure như Azure Kubernetes Service (AKS) và nhiều dịch vụ khác.

Nếu bạn cần ôn lại hệ sinh thái Azure tổng quát, tôi khuyến nghị xem khóa học Understanding Microsoft Azure. 

Tạo dự án và kho mã mới

Khi tài khoản và tổ chức Azure DevOps đã sẵn sàng, hãy tạo dự án và kho mã đầu tiên.

  • Tạo dự án mới:
    • Đăng nhập vào tài khoản Azure DevOps của bạn.
    • Nhấp vào New Project, đặt tên (ví dụ: "AzureDevOps-DataCamp-Tutorial"), và chọn chế độ hiển thị (công khai hoặc riêng tư).
    • Nhấp Create Project.

Thiết lập một dự án mới trong Azure DevOps rất đơn giản:

Nhập chi tiết dự án, bao gồm tên dự án, mô tả ngắn và đặt chế độ hiển thị (công khai hoặc riêng tư).

Cuối cùng, nhấp "Create the Project" để bắt đầu.

  • Thiết lập kho mã:
    • Nếu dùng Azure Repos, điều hướng tới mục Repos và khởi tạo kho mới.
    • Hoặc bạn có thể liên kết một kho GitHub hiện có bằng cách chọn Import Repository.
    • Đặt tên kho mã, chọn Repository type (Git hoặc TFVC), dán URL kho đã clone và nhấp Import.

Việc chọn hệ thống quản lý phiên bản rất quan trọng trong Azure Pipelines khi quản lý mã của bạn. Có hai lựa chọn:

Git: Hệ thống quản lý phiên bản phân tán hiện đại và được sử dụng rộng rãi trong cộng đồng lập trình. Là lựa chọn tốt nhất cho hầu hết dự án.

TFVC (Team Foundation Version Control): Hệ thống quản lý phiên bản tập trung, ít phổ biến hơn và thường dùng cho dự án kế thừa.

Giao diện trực quan này giúp bạn quyết định hệ thống phù hợp nhất với nhu cầu dự án.

  • Nếu bạn dùng GitHub, bạn có thể liên kết tài khoản GitHub với Azure DevOps bằng cách vào góc dưới bên trái giao diện dự án và chọn Project Settings > GitHub Connections > Connect your GitHub account.

Minh họa cách liên kết tài khoản GitHub với Azure DevOps bằng cách vào Project Settings ở góc dưới bên trái giao diện.

Sau đó, chọn GitHub Connections.

Cuối cùng, nhấp Connect your GitHub account.

Trong hướng dẫn này, chúng ta sẽ dùng Azure Repos làm kho mã. Nếu bạn mới bắt đầu hoặc không có lý do cụ thể để chọn TFVC, tôi khuyên bạn chọn Git.

Tạo pipeline đầu tiên của bạn

Đến lúc tạo pipeline đầu tiên. Thực hiện theo các bước dưới đây:

  • Trong mục Pipelines, nhấp Create Pipeline.

Đi tới mục Pipelines trong dự án Azure DevOps của bạn:

Mở dự án Azure DevOps.

Trong menu bên trái, nhấp Pipelines.

Mục này cho phép bạn quản lý hiệu quả các pipeline build và phát hành.

Nhấp Create Pipeline để bắt đầu thiết lập pipeline mới.

Bước đơn giản này giúp bạn khởi động quá trình tự động hóa quy trình làm việc trong Azure DevOps.

  • Chọn Azure Repos Git làm nguồn và chọn kho của bạn.

Chọn nguồn cho pipeline của bạn:

Chọn Azure Repos Git làm nguồn.

Sau đó, chọn kho bạn muốn làm việc cùng.

Quy trình đơn giản này đảm bảo bạn kết nối đúng kho mã với pipeline để quản lý hiệu quả.

  • Bạn có thể cấu hình pipeline bằng YAML hoặc Classic editor. Hãy chọn YAML, cách định nghĩa pipeline dựa trên mã.
  • Lưu pipeline và chạy để xem mọi thứ hoạt động đúng không.

Chọn YAML hay Classic Editor

Azure Pipelines cung cấp hai cách để định nghĩa pipeline của bạn:

  • YAML pipelines: Cách mô tả pipeline dựa trên mã. Được định nghĩa trong tệp .yaml hoặc .yml trong kho mã nguồn, cho phép quản lý phiên bản và hợp tác tốt hơn.
  • Classic Editor: Giao diện kéo thả trực quan, kém linh hoạt hơn cho các kịch bản phức tạp.

Khía cạnh

YAML Pipelines

Classic Editor

Quản lý phiên bản

YAML Pipelines hỗ trợ quản lý phiên bản và được lưu trong kho mã nguồn.

Classic Editor không hỗ trợ quản lý phiên bản. Dựa trên giao diện đồ họa (GUI).

Tính linh hoạt

YAML Pipelines có tính linh hoạt cao.

Classic Editor có tính linh hoạt hạn chế.

Phù hợp nhất cho

YAML Pipelines phù hợp nhất cho quy trình dài hạn, phức tạp và tự động hóa.

Classic Editor phù hợp với thiết lập nhanh.

Theo kinh nghiệm của tôi, YAML pipelines linh hoạt hơn và phù hợp với các đội ngũ theo đuổi thực hành Infrastructure as Code (IaC). Nhưng Classic Editor rất thích hợp cho người mới với cách làm trực quan hơn. 

Tuy nhiên, để mở rộng lâu dài, nên ưu tiên YAML pipelines thay vì Classic Editor.

Build với Azure Pipelines

Giờ hãy xem cách chúng ta có thể build với Azure Pipelines. 

Trong phần này, chúng ta sẽ chỉ định các bước Azure Pipelines thực hiện để build mã của bạn, như cài đặt phụ thuộc, biên dịch và chạy kiểm thử. Chúng ta sẽ mô tả các bước này trong một tệp cấu hình trong kho mã nguồn bằng YAML, một cách mô tả dễ đọc giống công thức.

Cú pháp pipeline YAML

Dưới đây là ví dụ đơn giản về một pipeline YAML:

# This section defines the trigger(s) for the pipeline.
# 'main' specifies that the pipeline will run whenever changes are pushed to the 'main' branch.
trigger:
- main  # automatically triggers this pipeline when changes are made to the 'main' branch.

# This defines the pool where the pipeline will run.
# 'ubuntu-latest' specifies the virtual machine image for executing tasks.
pool:
  vmImage: 'ubuntu-latest'  # This uses the latest Ubuntu image provided by Azure DevOps.

# Steps contain the individual tasks or actions that the pipeline will execute.
steps:
- script: echo Hello, world!  # A script task to run shell commands. This one prints "Hello, world!".
  displayName: 'Run my first pipeline script'  # A friendly name for this step, making it easier to identify in the pipeline logs.

Hãy phân tích đoạn mã theo từng phần:

  • trigger: Chỉ định nhánh kích hoạt pipeline (ví dụ: main).
  • pool: Định nghĩa tác nhân build (ví dụ: ubuntu-latest).
  • steps: Liệt kê các tác vụ cần thực thi, như cài đặt phụ thuộc và chạy script build.

Cấu hình bước build

Để thêm bước build vào pipeline YAML, bạn cần định nghĩa 'script' trong phần 'steps'.

Với một ứng dụng Node.js đơn giản, ví dụ, tệp azure-pipelines.yml bên dưới chứa mã mà Azure DevOps tự động tạo.

# Node.js
# Build a general Node.js project with npm.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: NodeTool@0
  inputs:
    versionSpec: '20.x'
  displayName: 'Install Node.js'

- script: |
    npm install
    npm run build
  displayName: 'npm install and build'

Hãy xem các steps build trong pipeline YAML ở trên: 

  1. Cài đặt Node.js: Dùng tác vụ NodeTool@0 để chỉ định phiên bản Node.js. 
  2. Cài đặt phụ thuộc: Chạy npm install để cài đặt phụ thuộc của dự án. 
  3. Biên dịch mã (build dự án): Chạy npm run build để biên dịch mã. 

Chạy pipeline

Pipeline có thể được kích hoạt thủ công hoặc tự động khi xảy ra các sự kiện như đẩy mã lên nhánh.

  • Kích hoạt thủ công: Nhấp Run Pipeline trong giao diện Azure DevOps để chạy pipeline thủ công.

Nút Run Pipeline trong giao diện Azure DevOps dùng để khởi chạy pipeline thủ công.

  • Kích hoạt tự động: Thiết lập trigger dựa trên sự kiện từ kho để khi đẩy thay đổi lên nhánh main, pipeline tự động chạy. Ví dụ:
trigger:
- main

Sau khi chạy pipeline, bạn có thể xem log và xử lý sự cố nếu có.

Để truy cập log, vào trang tổng quan lượt chạy pipeline và chọn job hoặc tác vụ cụ thể. Điều này sẽ hiển thị log của bước đó; như hình dưới, bạn có thể chọn bất kỳ job nào (Build, Push hoặc Update) để xem log thô.

Tổng quan lượt chạy pipeline hiển thị các tùy chọn job (Build, Push, Update) để truy cập log thô cho từng bước.

Tổng quan lượt chạy pipeline hiển thị các tùy chọn job (Build, Push, Update) để truy cập log thô cho từng bước.

Để khắc phục sự cố thường gặp, bạn có thể kiểm tra pipeline về các vấn đề như quá thời gian (timeout), giới hạn tài nguyên hoặc cấu hình sai.

Thêm kiểm thử vào pipeline của bạn

Bạn thêm kiểm thử vào pipeline để đảm bảo chất lượng mã và phát hiện sớm vấn đề trong quá trình phát triển. Trong Azure Pipelines, bạn có thể tích hợp unit, integration hoặc các kiểm thử khác bằng cách thêm các bước trong cấu hình pipeline.

Cấu hình bước kiểm thử

Bao gồm các bước kiểm thử trong pipeline để đảm bảo chất lượng mã. Bạn có thể dùng các framework phổ biến như Jest, Mocha hoặc NUnit. Ví dụ, cách thêm unit test với Jest:

- script: |
    npm test
  displayName: 'Run unit tests with Jest'

Xem kết quả kiểm thử

Azure Pipelines có sẵn báo cáo kiểm thử tích hợp. Bạn có thể thiết lập xuất bản kết quả kiểm thử để theo dõi dễ dàng hơn và xem kết quả trong log pipeline. Cách thực hiện như sau:

  • Đầu tiên, điều hướng tới Builds > Test Results.
  • Để xuất bản kết quả kiểm thử, dùng tác vụ PublishTestResults@2 để hiển thị kết quả. Điều này giúp việc theo dõi tổng thể dễ dàng hơn. Ví dụ:
- task: PublishTestResults@2
  inputs:
    testResultsFiles: '**/test-results.xml'
    testRunTitle: 'Unit Tests'

Triển khai với Azure Pipelines

Trong các bước triển khai trong tệp YAML của pipeline Azure, bạn có thể tự động triển khai ứng dụng tới nhiều môi trường như testing, staging và production. Phần này, chúng ta sẽ xem qua một vài cách triển khai với Azure Pipelines.

Triển khai lên Azure Web Apps

Azure Web Apps là một dịch vụ trong Azure Portal cho phép bạn phát triển, triển khai và quản lý ứng dụng web ở quy mô lớn. 

Để triển khai lên Azure Web Apps, bạn cần liên kết hai dịch vụ. Cách thực hiện:

  • Ở góc dưới bên trái dự án, đi tới Project Settings và nhấp Service Connections trong phần Pipelines . 

Giao diện Azure DevOps hiển thị tùy chọn Project Settings ở góc dưới bên trái để liên kết các dịch vụ Azure.

Đi tới phần Pipelines:

Nhấp Service Connections trong phần Pipelines.

Bước này giúp bạn liên kết tới các dịch vụ Azure, tăng cường khả năng và tích hợp cho dự án.

  • Nhấp New Service Connection và chọn Azure Resource Manager. 

Thiết lập kết nối dịch vụ mới:

Nhấp New Service Connection.

Quy trình đơn giản này giúp bạn kết nối tới tài nguyên Azure, nâng cao khả năng của dự án.

Thiết lập kết nối dịch vụ mới:

Chọn Azure Resource Manager.

Quy trình đơn giản này giúp bạn kết nối tới tài nguyên Azure, nâng cao khả năng của dự án.

  • Xác thực bằng tài khoản Azure của bạn.
  • Triển khai lên Azure App Service:
    • Quay lại mục Pipelines và cấu hình pipeline.
    • Trong pipeline, thêm một tác vụ để triển khai lên Azure.
    • Chỉ định nhóm tài nguyên và thông tin dịch vụ. 

Đây là ví dụ về pipeline triển khai YAML cho một ứng dụng Node.js đơn giản lên Azure App Service:

# Define the task for deploying to an Azure Web App
- task: AzureWebApp@1
  inputs:
    # This specifies your Azure subscription service connection
    azureSubscription: 'your-azure-subscription'
    # This specifies the name of your web app
    appName: 'your-app-name'
    # This specifies the location of the app package or files to be deployed
    package: '$(Build.ArtifactStagingDirectory)'

Hãy phân tích đoạn mã trên để bạn có thể điều chỉnh cho trường hợp của mình:

  • Thay your-azure-subscription bằng tên kết nối dịch vụ cấp quyền truy cập đăng ký Azure của bạn.
  • Thay your-app-name bằng tên thực tế của web app trong Azure. 
  • Thay $(Build.ArtifactStagingDirectory) bằng thư mục chứa gói hoặc tệp web app để triển khai. $(Build.ArtifactStagingDirectory) — Biến này trỏ tới thư mục nơi artifact build (tệp ứng dụng) của bạn nằm sau khi build xong.

Thiết lập triển khai liên tục (CD)

Khi mọi thứ trong mã của chúng ta vượt qua tất cả kiểm thử và kiểm tra, bước tiếp theo là thiết lập triển khai liên tục. Thực hiện theo các bước dưới đây.

Mô hình Azure Release Pipeline cho thấy nguồn artifact đưa vào pipeline phát hành để triển khai.

Mô hình triển khai release pipeline của Azure (Nguồn: Microsoft)

  • Tạo release pipeline:
    • Vào Pipelines > Releases và nhấp New Pipeline.

Giao diện Azure DevOps hiển thị đường dẫn tạo release pipeline bằng cách vào Pipelines > Releases và chọn New Pipeline.

Tạo release pipeline trong Azure DevOps rất đơn giản:

Đi tới mục Pipelines từ menu bên trái.

Nhấp Releases.

Sau đó, chọn New Pipeline để bắt đầu thiết lập quy trình phát hành.

Giao diện thân thiện giúp bạn quản lý và tự động hóa quy trình phát hành hiệu quả.

  • Chọn mẫu Azure App Service Deployment.

Giao diện Azure DevOps hiển thị tùy chọn chọn mẫu Azure App Service Deployment để thiết lập release pipeline.

  • Cấu hình môi trường:
    • Thêm và cấu hình các môi trường Dev, Staging, QA và Production nơi bạn muốn triển khai ứng dụng.

Giao diện Azure DevOps hiển thị các môi trường đã cấu hình như Dev, Staging, QA và Production để triển khai ứng dụng.

  • Liên kết artifact từ pipeline build của bạn làm nguồn cho release pipeline bằng cách chọn Add an artifact.

Giao diện Azure DevOps hiển thị tùy chọn thêm artifact từ pipeline build làm nguồn cho thiết lập release pipeline.

  • Cấu hình phê duyệt và cổng (gates):
    • Thiết lập phê duyệt trước triển khai cho các môi trường nhạy cảm như production là cần thiết. Ví dụ, trưởng nhóm có thể cần phê duyệt bản phát hành. Bạn cũng có thể thêm các cổng như kiểm thử tự động hoặc kiểm tra giám sát để đảm bảo triển khai đáp ứng tiêu chuẩn chất lượng.

Theo kinh nghiệm của tôi, giai đoạn này cần thiết để duy trì ổn định trong môi trường phát triển đòi hỏi cao. Phê duyệt và cổng cung cấp kiểm soát và đảm bảo chỉ có mã chất lượng cao mới lên production.

Triển khai lên Kubernetes

Kubernetes giúp chạy ứng dụng dạng container đáng tin cậy và có khả năng mở rộng. Khi dùng Azure Kubernetes Service (AKS), bạn có môi trường được quản lý, đơn giản hóa việc triển khai và vận hành. Phần này, tôi sẽ hướng dẫn cách triển khai ứng dụng của bạn lên AKS bằng Azure Pipelines.

Chuẩn bị cụm AKS của bạn

Bạn có thể tạo cụm AKS bằng Azure portal hoặc CLI. Đây là lệnh Bash CLI cơ bản để cấp phát cụm:

az aks create \
  --resource-group <ResourceGroupName> \
  --name <AKSClusterName> \
  --node-count 3 \
  --enable-addons monitoring \
  --generate-ssh-keys

Hãy phân tích lệnh trên:

  • --resource-group: Chỉ định nhóm tài nguyên Azure nơi cụm AKS sẽ được tạo.
  • --name: Tên cụm AKS của bạn.
  • --node-count: Số node trong cụm (ví dụ: 3 trong ví dụ này).
  • --enable-addons monitoring: Kích hoạt giám sát và phân tích với Azure Monitor for Containers.
  • --generate-ssh-keys: Tự động tạo khóa SSH để truy cập node an toàn nếu chưa có.

Đừng quên thay <ResourceGroupName> và <AKSClusterName> bằng tên nhóm tài nguyên và cụm thực tế của bạn.

Sau khi cụm AKS được thiết lập, cần cấu hình Kubectl. Điều này đảm bảo tác nhân pipeline hoặc máy cục bộ của bạn có thể dùng kubectl để giao tiếp với cụm.

Bạn có thể tăng tốc tác vụ Azure bằng dòng lệnh—Azure CLI cheat sheet này là tài liệu tham khảo hữu ích.

Tạo tệp YAML triển khai 

Hãy lấy ví dụ một tệp YAML triển khai cơ bản để triển khai một ảnh Docker lên Kubernetes:

# This defines the API version and the kind of Kubernetes resource we are creating.
# 'apps/v1' is the API version, and 'Deployment' is the resource type.
apiVersion: apps/v1
kind: Deployment

# Metadata contains information to identify the resource uniquely.
# 'name' specifies the name of the Deployment.
metadata:
  name: my-app  # Name of the Deployment, used for identification.

# "spec" specifies the intended deployment state.
spec:
  # Number of replicas/pods we want for this Deployment.
  replicas: 3  # Ensures high availability by running three app replicas.

  # Selector is used to define the labels that this Deployment will manage.
  selector:
    matchLabels:
      app: my-app  # This ensures that only Pods with the label 'app: my-app' are managed by this Deployment.

  # Template specifies the blueprint for the pods created by the Deployment.
  template:
    metadata:
      labels:
        app: my-app  # Labels for the Pods, matching the selector above.

    # A specification for the containers of the Pods.
    spec:
      containers:
      - name: my-app  # Name of the container. This is useful for linking to the container in logs, etc.
        image: mycontainerregistry.azurecr.io/my-app:latest  # Pull the container image you will call from your container registry.
        ports:
        - containerPort: 80  # The container listens on port 80.

Triển khai bằng Azure Pipelines

Trong pipeline YAML của bạn, thêm một tác vụ để triển khai lên AKS.

# This defines a task for deploying Kubernetes manifests within an Azure DevOps pipeline.
- task: KubernetesManifest@0  # Task type for working with Kubernetes manifest files.
  inputs:
    # This configures what to do with the Kubernetes manifest files.
    action: 'deploy'  # 'deploy' action ensures the Kubernetes manifests are applied to the cluster.

    # This defines the namespace where the Kubernetes resources will be deployed.
    namespace: 'default'  # 'default' is the namespace for deploying resources. Change if needed.

    # All this does is point to the manifest files that define the desired state of your Kubernetes resources.
    manifests: '$(Build.ArtifactStagingDirectory)/manifests/*.yaml'
    # The 'manifests' variable points to the location of all the YAML files (e.g., Deployment, Service, etc.) that will be applied during the deployment.

    # To access private container registry images, use the image pull secret.
    imagePullSecrets: 'my-registry-secret'
    # This instructs Kubernetes on which secret to use when pulling images from a private container registry.
    # Ensure that 'my-registry-secret' exists in the namespace before the deploy

Commit và đẩy tệp YAML để kích hoạt triển khai.

AKS đơn giản hóa việc điều phối container, giúp quản lý scale, cập nhật và rollback dễ dàng hơn. Theo kinh nghiệm của tôi, đây là mảnh ghép không thể thiếu cho các ứng dụng cloud-native hiện đại.

Tối ưu hóa và Giám sát Pipeline của bạn

Hồi đầu sự nghiệp, xây dựng pipeline không phải thách thức lớn nhất—mà là có một pipeline nhanh và ổn định. Một pipeline tối ưu không chỉ giúp build nhanh hơn; nó còn giảm bực bội cho đội ngũ, hạ rủi ro triển khai và tăng tốc độ giao hàng. 

Tôi sẽ chia sẻ một số mẹo và chiến lược bạn có thể dùng để giữ Azure DevOps Pipelines nhanh, gọn và đáng tin cậy.

Bộ nhớ đệm (caching) cho pipeline

Cài đặt phụ thuộc cũng là một nút thắt cổ chai phổ biến. Dù bạn làm việc với npm, .NET hay các trình quản lý gói khác, việc lặp lại tải xuống cùng một phụ thuộc có thể lãng phí đáng kể thời gian. Lưu đệm phụ thuộc và artifact giữa các lượt chạy sẽ cắt giảm mạnh thời gian thực thi. 

Cách lưu đệm phụ thuộc trong Azure Pipelines như sau.

Trước hết, bạn cần xác định trình quản lý gói, chẳng hạn:

  • Node.js (node_modules)
  • Gói NuGet
  • Python (gói pip)
  • Phụ thuộc Maven/Gradle

Azure Pipelines hỗ trợ cơ chế lưu đệm như tác vụ Cache@2, cho phép lưu đệm phụ thuộc giữa các lượt chạy pipeline. 

Hãy lấy ví dụ lưu đệm đơn giản cho Node.js:

# This task is used to cache files to speed up your pipeline.
- task: Cache@2  # This is the task name for caching files in Azure Pipelines.
  inputs:
    # Key is used to identify the cache. It combines npm (package manager), operating system (OS), and package-lock.json files.
    key: 'npm | "$(Agent.OS)" | package-lock.json'



    # RestoreKeys is an optional value used when the specific cache key is not found. It helps to find a fallback cache.
    restoreKeys: |
      npm | "$(Agent.OS)"



    # Path defines the location of files or folders to be cached.
    # Here, we are caching the 'node_modules' directory to avoid reinstalling dependencies.
    path: '$(Build.SourcesDirectory)/node_modules'



    # CacheHitVar is a variable that stores whether the cache was successfully used (restored).
    # This can be checked later in the pipeline to decide if tasks need to run.
    cacheHitVar: 'NPM_CACHE_RESTORED'

Sau đó bạn có thể bỏ qua bước cài đặt nếu đã có cache. Đây là một kiểm tra thông minh trước khi hoàn tất cài đặt npm. Đó là logic theo điều kiện hiệu quả.

Ví dụ đơn giản bên dưới:

# This step runs the command to install Node.js dependencies using npm.

- script: npm install  # Installs packages listed in the package.json file.
  
# The condition checks whether the cache was restored successfully.
# This step will run if the cache is not restored ('NPM_CACHE_RESTORED' is not true).
  condition: ne(variables.NPM_CACHE_RESTORED, 'true')  # Run only if the cache is not restored.

Ví dụ lưu đệm đơn giản cho ứng dụng Node.js này lưu thư mục cache npm sử dụng package-lock.json làm khóa. Khi phụ thuộc không thay đổi, nó sẽ khôi phục, tiết kiệm vài phút cho mỗi lần build. 

Tôi từng chứng kiến caching giảm đáng kể thời gian build, đặc biệt ở dự án lớn, nhưng chỉ khi chọn khóa cache hợp lý. Ở một dự án trước, điều này giảm 55% thời gian build cho một ứng dụng Node.js.

Giám sát sức khỏe pipeline

Một pipeline thành công không chỉ là những dấu tích xanh, mà còn là khả năng quan sát và phản hồi nhanh. Khi có sự cố, bạn muốn đội ngũ biết ngay lập tức. Dưới đây là cách đi trước vấn đề.

Cách thiết lập dashboard Azure DevOps

Azure DevOps cung cấp các widget tích hợp để hiển thị trạng thái pipeline, các lần chạy gần đây, tỷ lệ thất bại và thời lượng trung bình. 

  • Trước hết, đi tới Dashboards trong dự án của bạn.

Giao diện Azure DevOps hiển thị mục Dashboards với các widget tích hợp cho trạng thái pipeline, lần chạy gần đây, tỷ lệ thất bại và thời lượng trung bình.

  • Sau đó nhấp New Dashboard hoặc dùng dashboard hiện có.

Giao diện Azure DevOps hiển thị tùy chọn tạo dashboard mới hoặc chọn dashboard hiện có trong phần Dashboards.

  • Bạn có thể thêm các widget như: Build History, Release Pipeline Overview, Test Results Trend, và nhiều hơn nữa.

Giao diện Azure DevOps hiển thị các tùy chọn thêm widget như Build History, Release Pipeline Overview và Test Results Trend.

Đây là những thành phần thiết yếu để theo dõi xu hướng pass/fail, xem môi trường nào có vấn đề, và nhiều hơn nữa.

Cấu hình cảnh báo cho pipeline thất bại

  • Ở góc dưới bên trái dự án, đi tới Project Settings.

Giao diện Azure DevOps hiển thị tùy chọn Project Settings ở góc dưới bên trái để cấu hình cảnh báo cho pipeline thất bại.

  • Nhấp Notifications.

Giao diện Azure DevOps hiển thị mục Notifications để cấu hình cảnh báo pipeline.

  • Sau đó nhấp New Subscription.

Giao diện Azure DevOps hiển thị tùy chọn tạo đăng ký (subscription) mới cho thông báo trong mục Notifications.

Giả sử tình huống: Ở phần Category, chọn Build; ở phần Template, chọn  “A build fails”, và nhấp Next.

Bạn sẽ thấy giao diện như bên dưới:

"Giao diện Azure DevOps hiển thị phần Category chọn 'Build' và phần Template chọn 'A build fails' để tạo đăng ký thông báo.

  • Cuối cùng, nhấp Finish.
  • Trong mục Notifications, bạn có thể kiểm tra mô tả Build cho “A build fails” mà chúng ta đã tạo trước đó. 

Giao diện Azure DevOps hiển thị mục Notifications với mô tả Build cho thông báo 'A build fails' đã tạo trước đó.

Tôi từng bỏ lỡ một lỗi triển khai nghiêm trọng vì không cấu hình cảnh báo. Từ đó, tôi luôn thiết lập và cấu hình cảnh báo cho đội ngũ cho mọi triển khai production. Nhờ vậy, tôi không bao giờ bỏ lỡ một bản build hỏng hoặc độ trễ trong chu kỳ phát hành.

Phân tích hiệu năng pipeline

Chúng ta biết rằng dù pipeline hoạt động, nó vẫn có thể chậm, và pipeline chậm sẽ giết chết năng suất. Vì vậy, xác định nút thắt sớm sẽ giúp tránh rắc rối về sau.

Các chỉ số pipeline làm sáng tỏ hiệu năng của build và triển khai. Cách truy cập như sau. 

Trước hết, bạn cần bật Analytics Views trong project settings và kết nối tới Power BI hoặc khám phá qua biểu đồ tích hợp.

Giám sát sức khỏe pipeline

  • Trong phần Pipelines, vào Analytics. 
  • Xem các chỉ số như tỷ lệ pass của pipeline, tỷ lệ pass của kiểm thử và thời lượng pipeline.

Giám sát sức khỏe pipeline:

Vào Pipelines, sau đó chọn Analytics.

Xem các chỉ số quan trọng như tỷ lệ pass của pipeline, tỷ lệ pass kiểm thử và thời lượng pipeline.

Tính năng này giúp bạn theo dõi hiệu năng pipeline và đảm bảo mọi thứ vận hành trơn tru.

Hãy khám phá sâu hơn các chỉ số chính có thể theo dõi trong analytics và lý do chúng quan trọng:

Chỉ số

Vì sao quan trọng

Xu hướng thời lượng build

Giúp dễ dàng phát hiện chậm dần theo thời gian.

Tỷ lệ thất bại theo nhánh

Giúp xác định tính năng không ổn định.

Thời gian chờ trong hàng đợi

Giúp phát hiện thiếu tác nhân (agent).

Vài tháng trước, tôi làm việc trên pipeline của khách hàng, và điều nổi bật nhất là Thời gian chờ trong hàng đợi. Tôi phát hiện đội của mình đã quá tải pool tác nhân tự lưu trữ, và 40% thời gian pipeline dùng để chờ runner khả dụng. Không ai nhận ra cho tới khi analytics chỉ ra rõ ràng.

Chúng tôi khắc phục bằng cách thêm hai tác nhân tự lưu trữ và phân bổ tải theo loại job. Kết quả tức thì; thời gian build trung bình của pipeline giảm khoảng 35%.

Giám sát bằng log

Ngoài chỉ số, timeline logs vô cùng giá trị, đặc biệt với tác vụ chạy lâu. Nhiều năm qua, tôi có thói quen thêm các mốc đánh dấu log tùy chỉnh trong các bước script quan trọng để xác định chính xác điểm trễ.

Ví dụ đơn giản:

# This step prints a message to the console in the pipeline logs.
# It helps to mark the start of the dependency installation process.

echo "=== START: Dependency Install ==="  # Display a message indicating the beginning of dependency installation.

Thực tiễn tốt nhất cho Azure Pipelines

Giờ khi chúng ta đã đi qua các dịch vụ cốt lõi của Azure Pipelines và nhiều nội dung khác, hãy xem cách tận dụng tối đa bằng cách tuân theo các thực tiễn tốt nhất sau. 

Hãy chuyển từ hiệu năng sang cấu trúc, vì một pipeline nhanh nhưng khó bảo trì vẫn sẽ gây hại cho bất kỳ đội ngũ nào.

Tổ chức pipeline cho các đội

Khi nhiều đội hoặc môi trường dùng chung pipeline, mọi thứ thường trở nên lộn xộn. Bạn sẽ cần cấu trúc. Một pipeline khổng lồ cho cả development, staging và production sẽ dẫn đến hỗn loạn. 

Để tổ chức pipeline, bạn cần tách theo môi trường. Hãy xem một cấu trúc đơn giản dưới đây. 

Môi trường

Tên pipeline

Trigger

Development

dev.yml

Feature branches (Chạy trên mọi commit)

Staging

staging.yml

Pull request → Staging (Kích hoạt thủ công)

Production

prod.yml

Thủ công hoặc release pipelines (Yêu cầu phê duyệt)

Những điểm chính từ cấu trúc đơn giản này:

  • Mỗi tệp kéo từ các template dùng chung.
  • Mỗi tệp dùng biến theo môi trường.
  • Mỗi tệp kiểm soát quyền truy cập qua quyền của pipeline.

Theo kinh nghiệm, việc tách bạch này giúp gỡ lỗi dễ hơn và cho phép lập trình viên junior triển khai lên môi trường Dev mà không gây rủi ro cho Production.

Sử dụng template và mã tái sử dụng

DevOps là về việc cắt giảm thao tác thủ công và cải thiện tự động hóa trên toàn bộ quá trình phát triển phần mềm. 

YAML dễ phát sinh lỗi khi sao chép-dán giữa các dự án. Azure DevOps có template pipeline cho thiết lập DRY (Don’t Repeat Yourself) qua YAML pipelines. Bạn có thể tái sử dụng template YAML trên nhiều dự án, thiết kế pipeline nhất quán, và thậm chí giảm thời gian xử lý pipeline.

Ví dụ một template build có thể tái sử dụng:

Trước tiên, định nghĩa template build, build-template.yml:

# Here we configure the platform and the build configuration.
parameters:
  buildPlatform: 'Any CPU'  # This specifies the build platform (e.g., Any CPU, x86, x64).
  buildConfiguration: 'Release'  # This specifies the build configuration (Release) to avoid warning.

# A pipeline is composed of steps (a series of tasks that will be executed)
steps:
- task: DotNetCoreCLI@2  # Task for running .NET Core commands in the pipeline.
  inputs:
    command: 'build'  # This runs the 'build' command to compile the project(s).
    projects: '**/*.csproj'  # This specifies to build all .csproj files in the repository.
    arguments: '--configuration ${{ parameters.buildConfiguration }}'
    # This passes the build configuration parameter (e.g., Release or Debug) to the command.

Dùng template build trong pipeline chính của bạn:

# A pipeline job is a group of tasks. Here, the job is named 'Build'.
jobs:
- job: Build  # The job name where the build process occurs.

  # Steps define the tasks or actions the pipeline will perform.
  steps:
  - template: templates/build-template.yml  # Reference an external YAML template for reusable steps.

Quản lý bí mật và biến

Khi làm việc trên dự án, đặc biệt trong môi trường cộng tác, việc sử dụng thông tin nhạy cảm như chuỗi kết nối cơ sở dữ liệu, API key, mật khẩu hoặc token là phổ biến. Nếu những bí mật này được hardcode trong mã nguồn hoặc lộ ra trong log, chúng dễ bị lộ lọt.

Hãy xem cách quản lý an toàn bí mật và biến bằng secrets và variable groups của Azure Pipelines.

Bước 1: Tạo variable group

  • Nhấp vào tab Pipelines ở thanh bên trái.
  • Trong phần Pipelines, nhấp Library.

Giao diện Azure DevOps hiển thị tab Pipelines ở thanh bên trái và tùy chọn Library trong phần Pipelines.

  • Tạo variable group:
    • Nhấp vào tab Variable groups.

Tạo variable group mới một cách dễ dàng:

Trong Azure DevOps, điều hướng tới Pipelines, sau đó chọn Library.

Tạo variable group mới.

Bước này giúp bạn quản lý và tổ chức biến để cấu hình pipeline hiệu quả.

  • Nhấp nút Add variable group.
  • Nhập tên cho variable group (ví dụ, MyAppSecrets).

Giao diện Azure DevOps hiển thị nút Add variable group và trường nhập tên variable group, ví dụ MyAppSecrets.

Bước 2: Thêm bí mật vào variable group

  • Thêm biến: 
    • Trong variable group, nhấp Add để tạo biến mới. 

Giao diện Azure DevOps hiển thị tùy chọn thêm biến trong variable group bằng cách nhấp nút Add.

  • Nhập tên biến (ví dụ, DB_CONNECTION_STRING).
  • Đánh dấu chọn Keep this value secret để đảm bảo được xử lý như bí mật. 
  • Nhập giá trị của biến (ví dụ, chuỗi kết nối cơ sở dữ liệu của tôi).

Giao diện Azure DevOps hiển thị các trường nhập tên biến (ví dụ DB_CONNECTION_STRING), đánh dấu bí mật và đặt giá trị (ví dụ chuỗi kết nối CSDL).

  • Nhấp Save để lưu biến.

Giao diện Azure DevOps hiển thị nút Save dùng để lưu biến mới thêm vào variable group.

Bước 3: Sử dụng bí mật trong pipeline

Khi bạn đã tạo variable group với bí mật, bạn có thể dùng các biến này trong tệp YAML pipeline.

  • Tham chiếu variable group: Thêm variable group vào tệp YAML pipeline: 
variables:
- group: MyAppSecrets
  • Dùng bí mật trong các bước: Bạn có thể tham chiếu bí mật trong các bước pipeline bằng cú pháp $(VariableName). Ví dụ cách dùng DB_CONNECTION_STRING trong một bước script:
# This defines the trigger for the pipeline.
# The pipeline runs automatically whenever changes are pushed to the 'main' branch.
trigger:
- main  # Trigger the pipeline on changes to the 'main' branch.

# The pool specifies the environment where the pipeline will run.
# 'ubuntu-latest' means the pipeline will use the latest Ubuntu operating system image.
pool:
  vmImage: 'ubuntu-latest'  # Use the latest Ubuntu image provided by Azure Pipelines.

# Variables section defines reusable values for the pipeline.
# 'group: MyAppSecrets' links to a variable group that stores sensitive information like secrets.
variables:
- group: MyAppSecrets  # Load secrets, such as database credentials, from a variable group.

# Steps define the tasks that the pipeline will execute one by one.
steps:
- script: |
    echo "Connecting to the database..." # Print a message indicating the start of database connection.
    echo "Connection String: $(DB_CONNECTION_STRING)" # Display the database connection string from the variable group.
  displayName: 'Connect to Database'  # A simple name for this step that appears in the pipeline logs.

Bước 4: Chạy pipeline

  • Khi bạn lưu tệp YAML, vào mục Pipelines và nhấp Run Pipeline.
  • Sau khi pipeline chạy, bạn có thể kiểm tra log. Bạn sẽ thấy giá trị bí mật được ẩn, giữ an toàn cho thông tin nhạy cảm.

Kết luận

Trong hướng dẫn này, chúng ta đã đi qua trọn vẹn hành trình sử dụng Azure Pipelines—từ thiết lập pipeline đầu tiên đến build, kiểm thử, triển khai, giám sát và tối ưu hóa.

Giai đoạn triển khai cần luyện tập. Hãy bắt đầu đơn giản, liên tục cải tiến, và theo thời gian, bạn sẽ tự tin và thành thạo trong việc quản lý quy trình CI/CD. Azure Pipelines cung cấp công cụ, còn bạn mang đến sự lặp lại và học hỏi.

Với nỗ lực bền bỉ, bạn có thể tinh gọn quy trình phát triển và tự tin phát hành phần mềm chất lượng cao ở quy mô lớn.

Để tìm hiểu sâu hơn về Azure DevOps và Microsoft Azure, hãy xem các tài nguyên sau: 

Câu hỏi thường gặp

Tôi có thể dùng Azure Pipelines cho các dự án không thuộc Azure không?

Có, bạn có thể. Azure Pipelines hỗ trợ triển khai lên on-premise và nhiều môi trường đám mây khác như AWS, GCP và nhiều môi trường khác.

Azure Pipelines hỗ trợ những ngôn ngữ lập trình nào?

Azure Pipelines hỗ trợ nhiều ngôn ngữ lập trình, bao gồm Node.js, Python, Java, .NET và nhiều ngôn ngữ khác.

Sự khác biệt giữa Azure Pipelines và GitHub Actions là gì?

Azure Pipelines tích hợp sâu hơn với hệ sinh thái Azure và có các công cụ triển khai mạnh mẽ, trong khi GitHub Actions cung cấp trải nghiệm CI/CD đơn giản, thuần GitHub. Cả hai đều hỗ trợ workflow YAML và triển khai container hóa.

Tôi có thể dùng Azure Pipelines với công nghệ không thuộc Microsoft như Python hoặc Java không?

Có, Azure Pipelines hỗ trợ mọi nền tảng và ngôn ngữ chính, bao gồm Python, Java, Node.js và nhiều hơn nữa. Bạn có thể cấu hình build và triển khai cho bất kỳ tech stack nào bằng YAML.

Azure Pipelines có miễn phí không?

Azure Pipelines có gói miễn phí với 1.800 phút/tháng cho dự án công khai và thời lượng build giới hạn cho dự án riêng tư. Sử dụng thêm cần gói trả phí hoặc tác nhân tự lưu trữ.

Azure DevOps Service Connections là gì và vì sao quan trọng?

Service Connections liên kết an toàn Azure Pipelines với các dịch vụ bên ngoài như Azure Web Apps hoặc cụm Kubernetes. Chúng rất quan trọng cho triển khai tự động và quản lý hạ tầng.

Azure Pipelines so với Jenkins hoặc CircleCI như thế nào?

Azure Pipelines mang lại trải nghiệm tích hợp tốt hơn cho người dùng Azure và hỗ trợ tốt hơn cho các dịch vụ Microsoft. Jenkins tùy biến hơn nhưng cần nhiều thiết lập; CircleCI nổi bật về tốc độ và khả năng song song.

Emmanuel Akor

Tác giả

Emmanuel Akor

Emmanuel Akor là Kỹ sư Cloud & DevOps, thành thạo trong việc tận dụng các công nghệ đám mây và công cụ DevOps để thúc đẩy những dự án tạo tác động. Là cử nhân loại Xuất sắc ngành Khoa học Máy tính từ Đại học Babcock và từng là Đồng Trưởng nhóm Mảng Đám mây tại GDSC, Emmanuel kết hợp nền tảng học thuật vững chắc với kinh nghiệm thực tiễn. Với vai trò Biên tập viên Nội dung Kỹ thuật, anh xuất sắc trong việc chia sẻ kiến thức và hợp tác cùng các đội ngũ.

Chủ đề

Liên quan