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

Azure Pipeline: Tìm hiểu về Azure Pipeline - Day 1

Azure Pipeline là gì? 

Azure Pipeline là một công cụ CI/CD (Continuous Integration / Continuous Delivery), cho phép chúng ta tự động build, chạy test và triển khai (deploy) phần mềm chỉ với vài bước cấu hình đơn giản.

Azure Pipeline miễn phí hoàn toàn cho các dự án công khai (public projects) và cung cấp 30 giờ miễn phí mỗi tháng cho các dự án riêng tư (private projects).

Những điểm mạnh của Azure Pipeline

✅ Hỗ trợ đa ngôn ngữ và nền tảng:
Làm việc tốt với hầu hết các ngôn ngữ phổ biến như Java, JavaScript, Node.js, Python, .NET, C++, Go, PHP,… và hoạt động trên Windows, Linux hoặc macOS.

🚀 Triển khai linh hoạt:
Có thể deploy cùng lúc lên nhiều môi trường khác nhau như máy ảo (Virtual Machines), container, hệ thống on-premises, hoặc nền tảng đám mây (Cloud Platforms).

☁️ Tích hợp mạnh mẽ với Azure Cloud:
Dễ dàng cấu hình, theo dõi và triển khai ứng dụng trực tiếp lên Azure, giúp rút ngắn đáng kể thời gian phát hành sản phẩm.

🔗 Kết nối đa dạng với hệ thống quản lý mã nguồn:
Hỗ trợ GitHub, GitLab, Bitbucket và nhiều source control khác, đảm bảo tính linh hoạt khi làm việc với các dự án hiện có.

Azure Pipelines Architecture (Source: Microsoft).

Các thành phần trong Azure Pipeline

Một pipeline trong Azure DevOps bao gồm nhiều tầng (layers) khác nhau, được tổ chức theo thứ tự: Stage → Job → Step → Task.

Cấu trúc này giúp quá trình tự động hóa trở nên linh hoạt, dễ mở rộng và dễ kiểm soát hơn.

Mỗi pipeline phải có ít nhất một stage, mỗi stage có ít nhất một job, và mỗi job gồm một hoặc nhiều step.

DEFINITIONS

Stage: Major divisions in the pipeline that consist of a specific set of commands to handle a related activity. For example, a stage could contain all the actions to test an application, while the next stage could contain all the actions required to deploy the application.

Jobs: A series of activities that run in a sequence. Steps in a job don’t run in parallel. The previous step has to finish before the next step can begin.

Task: An action performed on the pipeline. An example can be a task to
install dependencies on the agent before building and testing code.

Agent

Tất cả stages, jobs, và tasks đều chạy trên các agents. Agent là máy tính hoặc máy ảo được Azure cấp để thực hiện các lệnh trong pipeline.

Tham khảo: Microsoft-hosted agents

Các image phổ biến nhất bao gồm:

  • windows-latest: Windows Server mới nhất.
  • ubuntu-latest: Ubuntu Linux mới nhất.
  • macos-latest: macOS mới nhất.
trigger:
	- main
pool:
	vmImage: 'windows-latest'

Setup Azure Pipeline

Để làm việc với môi trường Azure Pipelines, trước hết chúng ta cần chuẩn bị đầy đủ các thành phần cần thiết để có thể thực hiện toàn bộ quy trình build – test – deploy một cách tự động và liền mạch.

Chuẩn bị

Trước khi tạo pipeline đầu tiên, bạn cần đảm bảo đã có:

  • Tài khoản Azure DevOps và tổ chức (organization): Nếu bạn chưa có, hãy đăng ký tài khoản Azure DevOps và tạo một organization để quản lý dự án.
  • Repository: Bạn cần một repository chứa mã nguồn của dự án — có thể lưu trữ trên Azure Repos, Gitlab hoặc GitHub. Trong hướng dẫn này, chúng ta sẽ sử dụng một dự án .NET Console Application đơn giản để thực hành.
  • Quyền truy cập Azure Portal: Cần thiết nếu bạn muốn triển khai ứng dụng lên các dịch vụ Azure như Azure Kubernetes Service (AKS) hoặc các nền tảng khác.

Chọn YAML hay Classic Editor

Cả YAML Pipelines và Classic Editor đều có vai trò riêng, nhưng nếu bạn đã quen hoặc từng làm việc với Terraform, thì việc sử dụng YAML trong Azure Pipelines mang lại nhiều lợi ích rõ rệt.

YAML giúp bạn định nghĩa pipeline như một phần của source code, tức là mọi thay đổi trong pipeline đều được kiểm soát bằng Git, có thể review, revert, hoặc chia sẻ giống như code. Điều này rất phù hợp với triết lý Infrastructure as Code (IaC) mà Terraform hướng tới.

Bên cạnh đó, YAML cho phép bạn:

  • Dễ dàng tái sử dụng cấu hình qua templates.
  • Hỗ trợ tự động hóa hoàn toàn mà không cần thao tác giao diện.
  • Giảm rủi ro khi triển khai, vì mọi thứ được kiểm soát bằng version control.
  • Trong khi đó, Classic Editor tuy thân thiện cho người mới, nhưng về lâu dài lại khó mở rộng và khó quản lý thay đổi.
  • Do đó, nếu bạn đã từng viết Terraform hoặc đã quen với workflow IaC, thì YAML pipelines chắc chắn là sự lựa chọn tối ưu — nhất quán, có thể kiểm soát, và phù hợp với các hệ thống CI/CD chuyên nghiệp. 

Tạo Project và Repository trong Azure DevOps

Sau khi bạn đã thiết lập xong tài khoản và organization trong Azure DevOps, bước tiếp theo là tạo project đầu tiên cùng với kho mã nguồn (repository) để bắt đầu quy trình CI/CD.

Tạo Project mới

Đăng nhập vào tài khoản Azure DevOps

Nhấn New Project để tạo dự án mới.

Nhập tên dự án, ví dụ: AzureDevOps-Tutorial, kèm mô tả ngắn gọn nếu cần.

Chọn chế độ hiển thị (Visibility):

  • Public – Dự án công khai, phù hợp khi bạn muốn chia sẻ hoặc học tập.
  • Private – Dự án riêng tư, chỉ thành viên trong nhóm mới truy cập được.

Cuối cùng, nhấn Create Project để hoàn tất.

Trường hợp bạn sử dụng Repository Github, bạn setup: Project Settings > GitHub Connections > Connect your GitHub account.

Định nghĩa Pipelines

Trong Azure Pipelines, bạn có thể tạo pipeline build để kiểm tra (test) mã nguồn của mình, và pipeline release để triển khai (deploy) mã nguồn đó đến môi trường đích đã chỉ định.

Hình minh họa bên dưới luồng hoạt động của toàn bộ quy trình, từ lúc mã nguồn được cập nhật cho đến khi được triển khai.

Azure Pipelines flow (from Beginning Azure DevOps)

Sau khi đã có project và repository, chúng ta sẽ bắt đầu tạo Azure Pipeline đầu tiên để tự động hóa quá trình build – test – deploy cho ứng dụng.

Các bước thực hiện

  1. Mở tab Pipelines
    Trong trang Dashboard của dự án, chọn mục Pipelines ở menu bên trái, sau đó nhấn Create Pipeline
    Thao tác này sẽ mở trình hướng dẫn (wizard) giúp bạn thiết lập pipeline một cách trực quan.
  2. Kết nối pipeline với repository
    Ở bước tiếp theo, bạn cần liên kết pipeline với kho mã nguồn (repository).
    Hãy chọn nơi lưu trữ repository mà bạn muốn kết nối — có thể là Azure Repos, GitHub.

Chọn repository cụ thể

Sau khi chọn vị trí, bạn sẽ thấy danh sách các repository có sẵn.

Hãy chọn repository cụ thể mà bạn muốn sử dụng cho pipeline này.

Nếu bạn chọn Starter pipeline, hệ thống sẽ chuyển hướng bạn đến trang hiển thị code YAML mẫu

Tại đây, bạn có thể xem và chỉnh sửa nội dung YAML nếu muốn.

# 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.


Sau đó, nhấn Save and Run để lưu lại cấu hình.

Giải thích

Trigger (Kích hoạt)

Phần trigger quy định khi nào pipeline được chạy tự động.

Trong ví dụ này, pipeline sẽ tự động chạy mỗi khi có thay đổi (push) được đưa lên nhánh main của repository.

Pool (Môi trường chạy)

Phần pool xác định môi trường ảo (virtual machine) nơi các tác vụ của pipeline sẽ được thực hiện.

Ví dụ: Azure DevOps sẽ chạy pipeline của bạn trong một máy ảo Ubuntu phiên bản mới nhất.

Ưu điểm là bạn không cần tự cài đặt môi trường build — Azure lo tất cả

pool:
  vmImage: 'ubuntu-latest'

Steps

Step có thể là một đoạn script đơn giản hoặc một task được định nghĩa sẵn trong Azure DevOps.
Nhiều step tạo thành job, và nhiều job có thể hợp lại thành stage trong pipeline.

Ví dụ:

steps:
- script: echo Hello, world!
  displayName: 'Run a one-line script'

Tác vụ này chỉ đơn giản là chạy một lệnh shell in ra “Hello, world!” trên màn hình.
displayName là tên hiển thị của bước này — giúp bạn dễ nhận biết trong log khi pipeline chạy. 

Quy trình thường gặp:

  • Run tests → Kiểm tra mã nguồn trước khi triển khai.
  • Package application → Đóng gói ứng dụng để sẵn sàng build hoặc deploy.
  • Build Docker image → Tạo image từ mã nguồn đã đóng gói.
  • Push Docker image → Đưa image lên kho chứa (như ACR hoặc Docker Hub). 
trigger:
- master

pool:
  vmImage: 'ubuntu-22.04'

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet test
  displayName: 'Run tests'

- script: dotnet publish -c $(buildConfiguration) -o out
  displayName: 'Package application'

- script: docker build -t myapp:latest .
  displayName: 'Build Docker image'

- script: docker push myapp:latest
  displayName: 'Push Docker image'
Mỗi phần - script: chính là một step, đại diện cho một thao tác cụ thể trong pipeline.

Đây là code YAML sau khi chỉnh sửa cho Console Application

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- main

pool:
  vmImage: ubuntu-latest

variables:
  buildConfiguration: 'Release'

jobs:
- job: BuildDotNetAlpine
  displayName: 'Build C# Project (Debian/Ubuntu image)'
  container: mcr.microsoft.com/dotnet/sdk:9.0

  steps:
  - script: dotnet restore
    displayName: '1. Restore Dependencies'
    # Specify the directory containing your .csproj file
    workingDirectory: 'HelloWorldApp'

  # 2. Build the C# Application
  - script: dotnet build --configuration $(buildConfiguration) --no-restore
    displayName: '2. Build Project'
    # '--no-restore' ensures we use the packages restored in the previous step
    workingDirectory: 'HelloWorldApp'
    
  # 3. Publish (Compile output files to a ready-to-deploy folder)
  - task: DotNetCoreCLI@2
    displayName: '3. Publish Application'
    inputs:
      command: 'publish'
      publishWebProjects: false 
      projects: 'HelloWorldApp/HelloWorldApp.csproj'
      # The output path, $(Build.ArtifactStagingDirectory), is the temp location for Artifacts
      arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)'
      
  # 4. Upload the Artifact
  - task: PublishBuildArtifacts@1
    displayName: '4. Upload Artifact: drop'
    inputs:
      pathToPublish: '$(Build.ArtifactStagingDirectory)' # Source folder
      artifactName: 'drop' # Name of the artifact
Không phải ai cũng thích viết YAML thủ công — và đó là lý do Task Assistant ra đời.

Sử dụng Task Assistant trong Azure Pipelines

Trong Azure Pipelines, tính năng “Show assistant” cung cấp giao diện đồ họa (GUI) giúp bạn thêm và cấu hình các task trực tiếp trong file YAML.

Tính năng này rất hữu ích để khám phá các task có sẵn và hiểu rõ các tham số đầu vào mà không cần nhớ cú pháp YAML chi tiết.

Cách sử dụng:

  1. Chỉnh sửa YAML pipeline: Mở pipeline trong Azure DevOps và chọn Edit.
  2. Bật “Show assistant”: Ở bên phải trình chỉnh sửa YAML, nhấn nút Show assistant.
  3. Tìm hoặc duyệt task: Dùng ô tìm kiếm hoặc duyệt theo nhóm để chọn task mong muốn.
  4. Cấu hình tham số: Điền các giá trị bắt buộc và tùy chọn (ví dụ: image name, build args, v.v.).
  5. Thêm vào pipeline: Nhấn Add, Azure sẽ tự động sinh đoạn YAML tương ứng và chèn vào vị trí con trỏ.

Sau khi thêm, bạn vẫn có thể chỉnh sửa YAML thủ công nếu muốn cấu hình nâng cao hơn.
Để ẩn giao diện này, chỉ cần nhấn “Hide assistant”.

Mỗi task được Azure định danh bằng cú pháp:

task: <task-name>@<version>

Ví dụ:

task: DotNetCoreCLI@2 → task chạy lệnh .NET CLI, phiên bản 2.
task: PublishBuildArtifacts@1 → task publish artifact, phiên bản 1.

Tham khảo

Ebook: Beginning Azure DevOps-Planning, Building, Testing, and Releasing Software Applications on Azure

Azure Pipelines Tutorial: A Complete CI/CD Guide for Beginners

Azure DevOps Tutorial for Beginners | CI/CD with Azure Pipelines

Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.