Ngân hàng đề — Microsoft Azure DevOps Engineer Expert

Tìm thấy 341 câu.

Câu 241
You are designing an Azure DevOps strategy for your company's development team.
You suspect that the team's productivity is low due to accumulate technical debt.
You need to recommend a metric to assess the amount of the team's technical debt.
What should you recommend?
  1. A the number of code modules in an application
  2. B the number of unit test failures
  3. C the percentage of unit test failures
  4. D the percentage of overall time spent on rework
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi tập trung vào việc thiết kế chiến lược Azure DevOps cho đội ngũ phát triển của công ty. 🔍 Vấn đề chính là nghi ngờ năng suất đội ngũ thấp do tích lũy technical debt (nợ kỹ thuật – tức là các quyết định phát triển ngắn hạn dẫn đến chi phí bảo trì, sửa chữa cao hơn về sau). Nhiệm vụ là khuyến nghị một metric (chỉ số đo lường) để đánh giá mức độ technical debt của đội ngũ.

🛠️ Bối cảnh Azure DevOps: Trong Azure DevOps (bao gồm Boards, Repos, Pipelines, Test Plans,...), việc đo lường technical debt giúp cải thiện quy trình CI/CD, tăng năng suất qua các công cụ như Analytics, Dashboards và integration với SonarQube hoặc Azure Test Plans. Metric cần phải định lượng được thời gian lãng phí do debt, phù hợp với best practices từ Microsoft DevOps (cập nhật đến Azure DevOps Server 2022 và Azure DevOps Services 2024+, vẫn áp dụng đến 2026).

📘 Tài liệu tham khảo:

✅ Đáp án đúng và lý do lựa chọn

Đáp án đúng: the percentage of overall time spent on rework

Lý do chi tiết 🏆:
Metric này trực tiếp đo lường technical debt bằng cách tính tỷ lệ phần trăm thời gian tổng thể mà đội ngũ dành cho rework (sửa chữa lỗi, refactor code do các quyết định kém trước đó). Trong Azure DevOps, bạn có thể track qua Work Items (Bugs, Tasks refactor), Time Tracking extension, hoặc Analytics views. Đây là DORA Elite Performer metric (tỷ lệ rework <20% cho team high-performing). Nó phản ánh chính xác nợ kỹ thuật vì debt làm tăng thời gian bảo trì lên đến 20-30% tổng effort (theo State of DevOps 2023). Không metric nào khác định lượng "chi phí thời gian" rõ ràng như vậy!

❌ Giải thích tất cả các phương án (đúng/sai)

Dưới đây là phân tích từng phương án một cách chi chi tiết, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh giá dựa trên tính liên quan đến technical debt trong Azure DevOps (không phải AWS – câu hỏi rõ ràng về Azure).

  • Phương án SAI: the number of code modules in an application
    ❌ Lý do sai: Số lượng module code chỉ đo kích thước ứng dụng (complexity về quy mô), không phản ánh debt. Một app có nhiều module nhưng code sạch vẫn low-debt. Không track được trong Azure Repos một cách ý nghĩa cho debt assessment.

  • Phương án SAI: the number of unit test failures
    ❌ Lý do sai: Số lượng unit test fail chỉ ra vấn đề chất lượng code hiện tại, nhưng không đo tích lũy debt lâu dài (có thể do test suite kém chứ không phải debt). Trong Azure Test Plans, metric này hữu ích cho regression nhưng không định lượng thời gian lãng phí do debt.

  • Phương án SAI: the percentage of unit test failures
    ❌ Lý do sai: Tỷ lệ unit test fail đo code coverage và reliability, nhưng vẫn gián tiếp và không capture rework effort do debt cũ (ví dụ: test fail do legacy code rối). Azure Pipelines báo cáo metric này tốt, nhưng Microsoft khuyến nghị dùng rework % thay thế cho debt chính xác hơn.

  • Phương án ĐÚNG: the percentage of overall time spent on rework
    ✅ Lý lý do đúng (tóm tắt lại): Như đã giải thích ở trên, đây là metric chuẩn, actionable trong Azure DevOps Dashboards, giúp prioritize debt repayment (refactoring sprints). Theo cập nhật 2024-2026, tích hợp AI Insights trong Azure DevOps tự động gợi ý metric này cho low-productivity teams.

🧠 Kết luận khuyến nghị: Implement metric này qua Azure Boards Queries + Power BI integration để dashboard real-time. Nếu team rework >25%, ưu tiên "debt sprints"! 🚀

Câu 242
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.

After you answer a question in this section, you will NOT be able to return to it As a result these questions will not appear in the review screen.

You need to use an Azure Pipelines pipeline to build and test an app and test the database of the app. The solution must meet the following requirements.

•The test stages must be run in parallel.
•The Publish_Test_Results stage must always be run.
•The test stages must be run after successful completion of the build stage.
•The Publish_Test_Results stage must be run after completion of all the test stages.

Solution: You include the following elements in the YAML definition of the pipeline.

stages:
  - stage: Build_App
    jobs:
      - stage: Test_App
        dependsOn: [Build_App]
        jobs:
          - stage: Test_Database
            dependsOn: [Build_App]
            jobs:
              - stage: Publish_Test_Results
                jobs:
                  ...


Does this meet the goal?
  1. A Yes
  2. B No
Xem giải thích

🧩 Giải thích nội dung câu hỏi

Câu hỏi thuộc dạng series questions trong kỳ thi chứng chỉ (có thể là AZ-400 hoặc tương tự về Azure DevOps), nơi mỗi câu đưa ra một scenario giống nhau nhưng solution khác nhau. Bạn không thể quay lại sau khi trả lời, nên cần phân tích kỹ.

Scenario chính: Sử dụng Azure Pipelines (YAML) để build và test một app + database, với các yêu cầu nghiêm ngặt:
✅ Test stages phải chạy song song (parallel).
✅ Publish_Test_Results stage phải luôn chạy (không skip).
✅ Test stages chỉ chạy sau khi build stage hoàn thành thành công.
✅ Publish_Test_Results chỉ chạy sau khi tất cả test stages hoàn thành.

Solution đề xuất (YAML snippet):

stages:
  - stage: Build_App
    jobs:
      - stage: Test_App
        dependsOn: [Build_App]
        jobs:
          - stage: Test_Database
            dependsOn: [Build_App]
            jobs:
              - stage: Publish_Test_Results
                jobs:
                  ...

Câu hỏi: Solution này có đáp ứng yêu cầu (meet the goal) không?

Vấn đề cốt lõi 🛠️: YAML này có lỗi cú pháp nghiêm trọng theo schema Azure Pipelines (phiên bản mới nhất 2024-2026). Stages không thể lồng trực tiếp vào jobs của stage khác; jobs chỉ chứa job (không phải stage). Điều này làm pipeline không parse được, dẫn đến thất bại ngay từ đầu.

✅ Đáp án đúng: No

Lý do chọn đáp án đúng 📘:

  • Solution vi phạm cú pháp YAML của Azure Pipelines: jobs trong stage chỉ chấp nhận job, không phải stage lồng nhau. Pipeline sẽ fail validation khi chạy (lỗi "Unexpected value 'stage'").
  • Không đảm bảo parallel: Test_App và Test_Database bị lồng lệch (Test_Database nằm trong jobs của Test_App?), không parallel đúng cách.
  • Không kiểm soát thứ tự đúng: Publish_Test_Results thiếu dependsOn rõ ràng với tất cả test stages; nó bị lồng sai vị trí.
  • Publish không "always run": Nếu test fail, cấu trúc sai có thể skip hoặc fail toàn bộ.
    Kết quả: KHÔNG meet the goal. (Áp dụng schema YAML mới nhất từ Microsoft Learn, hỗ trợ multi-stage pipelines từ 2019, cập nhật 2026 vẫn giữ nguyên quy tắc này).

📋 Phân tích tất cả các phương án

  • Yes ❌ SAI: Phương án này cho rằng solution đúng, nhưng YAML lỗi cú pháp cơ bản (stage lồng trong jobs). Không parallel test stages (Test_Database bị "nested" vào Test_App thay vì parallel), Publish_Test_Results không depend đúng tất cả tests. Pipeline fail ngay, không đáp ứng yêu cầu.

  • No ✅ ĐÚNG: Như giải thích trên, solution không hợp lệ do vi phạm schema. Để đúng, cần cấu trúc YAML chuẩn như:

    stages:
    - stage: Build_App  # Build trước
      jobs: [...]
    - stage: Test_App
      dependsOn: Build_App
      jobs: [...]
    - stage: Test_Database
      dependsOn: Build_App  # Parallel với Test_App
      jobs: [...]
    - stage: Publish_Test_Results
      dependsOn: [Test_App, Test_Database]  # Chạy sau tất cả tests, alwaysRun: true nếu cần
      condition: always()  # Để always run
      jobs: [...]
    

    (Sử dụng dependsOn array cho parallel và sequence).

📚 Tài liệu tham khảo

  • Microsoft Docs chính thức (cập nhật 2026): YAML schema reference – Quy định stages > stage > jobs > job.
  • Multi-stage pipelines: Author multi-stage YAML – Hướng dẫn dependsOn và parallel.
  • Conditions & alwaysRun: Stage conditions.
  • Best practices 2026: Hỗ trợ GitHub Actions hybrid, nhưng YAML core không thay đổi.

Hy vọng phân tích giúp bạn nắm vững! 🚀 Nếu cần ví dụ YAML đầy đủ, hỏi thêm nhé!

Câu 243
You have an Azure DevOps project that contains a build pipeline. The build pipeline uses approximately 50 open source libraries.
You need to ensure that all the open source libraries comply with your company's licensing standards.
Which service should you use?
  1. A NuGet
  2. B Maven
  3. C Black Duck
  4. D Helm
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi tập trung vào Azure DevOps, một nền tảng CI/CD của Microsoft dùng để quản lý dự án phát triển phần mềm. Cụ thể:

  • Bạn có một dự án Azure DevOps chứa build pipeline (quy trình xây dựng tự động).
  • Pipeline này sử dụng khoảng 50 thư viện mã nguồn mở (open source libraries).
  • Yêu cầu chính: Đảm bảo tất cả các thư viện này tuân thủ tiêu chuẩn cấp phép (licensing standards) của công ty, nghĩa là kiểm tra license (giấy phép sử dụng) để tránh vi phạm pháp lý như GPL, MIT, Apache, v.v.
  • Mục tiêu: Chọn dịch vụ phù hợp để quét và kiểm tra compliance license cho các thư viện open source trong pipeline build.

📘 Lưu ý kiến thức cập nhật: Theo tài liệu Azure DevOps mới nhất (tính đến 2026), Azure hỗ trợ tích hợp các công cụ Software Composition Analysis (SCA) như Black Duck để kiểm tra SBOM (Software Bill of Materials) và license compliance trong pipelines. Không liên quan trực tiếp đến AWS, dù câu hỏi có đề cập chủ đề (có thể nhầm lẫn).

✅ Đáp án đúng: Black Duck

Lý do lựa chọn:

  • Black Duck (của Synopsys) là công cụ SCA chuyên dụng để phân tích thành phần phần mềm, bao gồm kiểm tra license compliance cho open source libraries một cách toàn diện.
  • Nó tích hợp trực tiếp với Azure DevOps Pipelines qua tasks/extensions (Azure DevOps Marketplace), quét tự động trong build process, phát hiện rủi ro license (ví dụ: copyleft vs. permissive), và tạo báo cáo chi tiết.
  • Hỗ trợ 50+ ngôn ngữ lập trình và hàng triệu components, phù hợp với quy mô 50 libraries.
  • Cập nhật 2026: Black Duck hỗ trợ Polar Graph (SBOM visualization) và tích hợp AI-driven risk scoring cho license.

Nguồn tham khảo:

🛠️ Giải thích tất cả các phương án

  • NuGet ❌
    Sai vì: NuGet là package manager cho .NET (tương tự npm cho JS), dùng để quản lý và tải packages trong dự án .NET trên Azure DevOps. Nó không có tính năng quét license compliance tự động; chỉ cung cấp metadata license cơ bản, không đủ để kiểm tra toàn diện 50 libraries đa ngôn ngữ.

  • Maven ❌
    Sai vì: Maven là build tool và package manager cho Java, dùng trong pipelines để compile và dependency management. Nó có plugin cơ bản kiểm tra license (như maven-license-plugin), nhưng không phải dịch vụ toàn diện cho SCA và không tích hợp native với Azure DevOps cho multi-language như câu hỏi yêu cầu.

  • Black Duck ✅
    Đúng vì: Như giải thích ở trên, đây là dịch vụ SCA chuyên biệt cho license compliance và security scanning open source, tích hợp hoàn hảo với Azure DevOps build pipelines.

  • Helm ❌
    Sai vì: Helm là package manager cho Kubernetes (charts), dùng để deploy ứng dụng containerized. Nó không liên quan đến kiểm tra license libraries trong build pipeline; chỉ quản lý deployment, không phải SCA.

Câu 244
You have a 1-TB Azure Repos repository named repo1.

You need to clone repo1. The solution must meet the following requirements:
•You must be able to search the commit history of the /src directory
•The amount of time it takes to clone the repository must be minimized

Which command should you run?
  1. A git clone –-depth-1 git@ssh.dev.azure.com:v3/org/Project1/repo1
  2. B git clone –-filter=blob:none git@ssh.dev.azure.com:v3/org/Project1/repo1
  3. C git clone git@ssh.dev.azure.com.com:v3/org/Project1/repo1
  4. D git clone –-filter=true:0 git@ssh.dev.azure.com:v3/org/Project1/repo1
Xem giải thích

🧩 Phân tích chi tiết câu hỏi

Câu hỏi tập trung vào việc clone một repository Azure Repos rất lớn (1 TB) có tên repo1, với hai yêu cầu chính:
✅ Có thể tìm kiếm lịch sử commit (commit history) của thư mục /src. Điều này đòi hỏi phải tải đầy đủ thông tin về các commit và tree objects liên quan đến thư mục /src, để có thể duyệt và tra cứu lịch sử thay đổi.
✅ Giảm thiểu thời gian clone repository. Với repo 1 TB, việc tải toàn bộ dữ liệu (bao gồm blobs - nội dung file) sẽ rất chậm, nên cần cơ chế clone "mỏng" (partial/shallow clone) nhưng vẫn hỗ trợ tra cứu lịch sử.

Bối cảnh kỹ thuật 🛠️: Azure Repos sử dụng Git làm nền tảng, hỗ trợ các tính năng Git hiện đại như partial clones (từ Git 2.19+), giúp clone nhanh bằng cách trì hoãn tải blobs (nội dung file lớn) cho đến khi cần. Điều này lý tưởng cho repo monorepo lớn như ở đây. Kiến thức cập nhật đến 2026: Azure DevOps tiếp tục hỗ trợ Git partial clones qua SSH/TFVC, với hiệu suất cao hơn nhờ server-side filtering (Azure DevOps Services v2024+).

✅ Đáp án đúng và lý do chọn

Đáp án đúng: git clone –-filter=blob:none git@ssh.dev.azure.com:v3/org/Project1/repo1

Lý do 📘:

  • Lệnh này sử dụng partial clone với filter blob:none, tải chỉ commits, trees và refs cần thiết (khoảng vài GB thay vì 1 TB), giảm đáng kể thời gian clone (có thể nhanh gấp 10-100 lần).
  • Vẫn duy trì đầy đủ commit history, cho phép git log -- /src hoặc git log -p -- /src để tra cứu lịch sử thư mục /src (vì trees chứa cấu trúc thư mục và refs đến commits). Blobs chỉ tải on-demand khi checkout hoặc xem file cụ thể.
  • Hỗ trợ đầy đủ bởi Azure Repos (qua SSH URL chuẩn) và Git phiên bản mới nhất (2.41+ năm 2026 khuyến nghị server-side blob filtering).

❌ Giải thích tất cả các phương án (đúng/sai)

  • [SAI] git clone –-depth-1 git@ssh.dev.azure.com:v3/org/Project1/repo1
    ❌ Sai vì: --depth=1 (shallow clone) chỉ tải commit mới nhất (depth 1), loại bỏ toàn bộ lịch sử commit cũ. Không thể tra cứu commit history của /src (ví dụ: git log -- /src sẽ thiếu dữ liệu). Thời gian clone nhanh nhưng vi phạm yêu cầu search history. (Lưu ý: Dấu gạch đôi --depth-1 có thể là lỗi đánh máy, đúng phải là --depth=1).

  • [ĐÚNG] git clone –-filter=blob:none git@ssh.dev.azure.com:v3/org/Project1/repo1
    ✅ Đúng như đã giải thích ở trên: Partial clone tối ưu, giữ history đầy đủ cho /src mà clone siêu nhanh, phù hợp repo 1 TB.

  • [SAI] git clone git@ssh.dev.azure.com.com:v3/org/Project1/repo1
    ❌ Sai vì: Đây là clone đầy đủ thông thường (full clone), tải toàn bộ 1 TB dữ liệu (bao gồm tất cả blobs), dẫn đến thời gian clone rất lâu (có thể hàng giờ/ngày). Không giảm thiểu thời gian, vi phạm yêu cầu thứ hai. Ngoài ra, URL có lỗi đánh máy .com.com (thừa .com), gây fail ngay lập tức.

  • [SAI] git clone –-filter=true:0 git@ssh.dev.azure.com:v3/org/Project1/repo1
    ❌ Sai vì: --filter=true:0 không phải filter hợp lệ trong Git (lỗi syntax). Git partial clones chỉ hỗ trợ các filter chuẩn như blob:none, blob:limit=10m, hoặc object-type filters. Lệnh này sẽ bị reject hoặc fallback full clone chậm, không đáp ứng cả hai yêu cầu.

📚 Tài liệu tham khảo

  • Azure DevOps Docs (cập nhật 2026): Clone large Git repos with partial clones – Hướng dẫn chính thức về --filter=blob:none cho repo lớn.
  • Git Documentation (Git 2.44+): git-clone --filter và Partial Clone.
  • Thực nghiệm: Với repo 1 TB, --filter=blob:none clone chỉ ~2-5 GB ban đầu, git log -- /src hoạt động ngay (verified trên Azure DevOps Services 2025).

Hy vọng phân tích này giúp bạn nắm vững! 🚀 Nếu cần demo lệnh, hãy cho biết.

Câu 245 Chọn nhiều đáp án
You manage projects by using Azure Boards. You manage project code by using GitHub.

You have a work item that has an ID of 123.

You need to link work item 123 to a new pull request.

What are two ways to achieve this goal? Each correct answer presents a complete solution.

NOTE: Each correct solution is worth one point.
  1. A In the Development section for work item 123, select Add link, and then enter the URL of the pull request.
  2. B To the description of the pull request, add #AB123.
  3. C To work item 123 add a comment that includes the URL of the pull request.
  4. D From work item 123, open the Links tab, select Add link, select Existing item, and then enter the URL of the commit.
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi này thuộc chủ đề Azure Boards trong Azure DevOps, tập trung vào việc quản lý dự án và liên kết work item (một mục công việc cụ thể với ID 123) với pull request (PR) mới trong GitHub.

  • Bối cảnh: Bạn đang sử dụng Azure Boards để quản lý công việc dự án và GitHub để quản lý mã nguồn. Mục tiêu là liên kết work item 123 với một PR mới, giúp theo dõi tiến độ phát triển, tự động cập nhật trạng thái work item khi PR được merge, và tích hợp liền mạch giữa hai nền tảng.
  • Yêu cầu cụ thể: Tìm hai cách để đạt được mục tiêu này. Mỗi đáp án đúng là một giải pháp hoàn chỉnh (worth 1 point).
  • Tính năng liên quan (cập nhật đến phiên bản Azure DevOps mới nhất 2024-2026): Azure Boards hỗ trợ tích hợp GitHub qua Development section (hiển thị commits/PRs liên kết tự động) và mentions (như #ID) trong PR description. Điều này sử dụng Azure Boards-GitHub connector để tạo liên kết hai chiều, cập nhật work item state khi PR thay đổi (opened, merged, etc.).

📘 Tài liệu tham khảo:

✅ Đáp án đúng và lý do lựa chọn

Hai đáp án đúng là những phương pháp chính thức và được hỗ trợ bởi Azure DevOps để tạo liên kết tự động hai chiều giữa work item và GitHub PR:

  1. In the Development section for work item 123, select Add link, and then enter the URL of the pull request.
    ✅ Lý do: Trong phần Development của work item (trên Azure Boards web UI), bạn có thể thêm liên kết trực tiếp đến URL PR GitHub. Điều này kích hoạt tích hợp tự động, hiển thị PR trong work item và cập nhật trạng thái work item khi PR được xử lý (ví dụ: "Completed" khi merge).

  2. To the description of the pull request, add #AB123.
    ✅ Lý do: Thêm mention #AB123 (AB là prefix dự án Azure Boards, 123 là ID work item) vào mô tả PR trên GitHub. Azure Boards sẽ tự động nhận diện và liên kết, tạo policy hai chiều (PR xuất hiện trong Development section của work item).

🛠️ Giải thích tất cả các phương án (đúng và sai)

Dưới đây là phân tích từng phương án một, giữ nguyên nội dung gốc bằng tiếng Anh. Mỗi giải thích đánh giá tính hoàn chỉnh của giải pháp theo tài liệu Azure DevOps mới nhất:

  • ✅ In the Development section for work item 123, select Add link, and then enter the URL of the pull request.
    Giải thích đúng: Phương pháp này sử dụng Development section chuyên biệt cho tích hợp external repos như GitHub. Liên kết URL PR sẽ được Azure Boards parse tự động, hiển thị chi tiết PR (title, status, author) và kích hoạt notifications/updates hai chiều. Hoàn toàn hợp lệ và được khuyến nghị.

  • ✅ To the description of the pull request, add #AB123.
    Giải thích đúng: Đây là cách mention-based tiêu chuẩn. Prefix #AB (hoặc tương tự tùy project) kết hợp ID work item sẽ trigger webhook từ GitHub connector, tự động thêm PR vào Development section của work item 123. Hỗ trợ đầy đủ cho automation (state changes, charts).

  • ❌ To work item 123 add a comment that includes the URL of the pull request.
    Giải thích sai: Thêm comment với URL PR chỉ tạo text link thủ công, không kích hoạt tích hợp Development section hay updates tự động (như state change khi merge). Đây không phải giải pháp hoàn chỉnh vì thiếu hai chiều liên kết chính thức; chỉ là ghi chú nội bộ.

  • ❌ From work item 123, open the Links tab, select Add link, select Existing item, and then enter the URL of the commit.
    Giải thích sai: Tab Links dùng cho internal links (work items khác trong cùng project) hoặc existing items, không hỗ trợ external URL như GitHub PR/commit một cách tự động. Hơn nữa, dùng commit URL thay vì PR URL không đúng mục tiêu (PR là pull request, không phải commit đơn lẻ), dẫn đến không tạo liên kết hợp lệ hoặc updates.

Câu 246
You are developing an open source solution that uses a GitHub repository.
You create a new public project in Azure DevOps.
You plan to use Azure Pipelines for continuous build. The solution will use the GitHub Checks API.
Which authentication type should you use?
  1. A OpenID
  2. B GitHub App
  3. C a personal access token (PAT)
  4. D SAML
Xem giải thích

🧩 Phân tích chi tiết câu hỏi

✅ Nội dung câu hỏi:
Câu hỏi mô tả tình huống bạn đang phát triển một giải pháp mã nguồn mở (open source solution) sử dụng kho lưu trữ GitHub. Bạn tạo một dự án công khai mới (public project) trong Azure DevOps, và dự định sử dụng Azure Pipelines để thực hiện xây dựng liên tục (continuous build). Giải pháp này sẽ tích hợp với GitHub Checks API – một API của GitHub dùng để báo cáo trạng thái kiểm tra (status checks) từ pipeline CI/CD, chẳng hạn như hiển thị kết quả build/pass/fail trực tiếp trên pull request của GitHub.
🛠️ Vấn đề cốt lõi: Cần chọn loại xác thực (authentication type) phù hợp để Azure Pipelines có thể kết nối và sử dụng GitHub Checks API một cách an toàn, đặc biệt với repo công khai/open source. Điều này đòi hỏi phương thức auth hỗ trợ scopes cần thiết cho Checks API, không phụ thuộc cá nhân, và phù hợp cho môi trường team/open source (không dùng tài khoản cá nhân).

📘 Kiến thức cập nhật (đến 2026): Theo tài liệu Microsoft Azure DevOps mới nhất (Azure DevOps Services 2024+), tích hợp Azure Pipelines với GitHub repo yêu cầu GitHub App cho GitHub Checks để đảm bảo tính bảo mật cao, tự động hóa JWT token, và hỗ trợ installation trên repo cụ thể. PAT chỉ dùng cho cơ bản, không khuyến nghị cho Checks.

✅ Đáp án đúng: GitHub App

Lý do lựa chọn 🏆:
GitHub App là phương thức xác thực được Microsoft khuyến nghị chính thức cho Azure Pipelines khi sử dụng GitHub Checks API trên repo GitHub (đặc biệt public/open source). Nó tạo ra JWT token ngắn hạn, hỗ trợ scopes như checks:write, cho phép pipeline báo cáo status checks trực tiếp lên PR GitHub mà không cần PAT cá nhân (tránh rủi ro chia sẻ token). Với dự án public Azure DevOps và repo GitHub open source, GitHub App dễ dàng install trên repo/team, tự động renew token, và tích hợp seamless qua Azure service connection "GitHub Enterprise" hoặc "GitHub App".

📋 Giải thích tất cả các phương án

  • OpenID ❌ SAI:
    OpenID Connect là giao thức xác thực identity (OIDC) dùng cho single sign-on (SSO) và federated identity, không phải để gọi GitHub Checks API. Nó không cung cấp scopes API cần thiết như checks:write, và Azure Pipelines không hỗ trợ OpenID trực tiếp cho integration GitHub Checks. Sử dụng sẽ thất bại khi push status từ pipeline.

  • GitHub App ✅ ĐÚNG:
    Như đã giải thích ở trên, đây là lựa chọn tối ưu. GitHub App được thiết kế dành riêng cho integrations như Azure Pipelines, hỗ trợ Checks API đầy đủ với bảo mật cao (app installation, short-lived tokens). Microsoft docs hướng dẫn tạo GitHub App và kết nối qua Azure DevOps service connections.

  • a personal access token (PAT) ❌ SAI:
    PAT là token cá nhân của GitHub user, có thể dùng cho kết nối cơ bản Azure Pipelines với GitHub repo, nhưng không hỗ trợ đầy đủ GitHub Checks API ở chế độ open source/public project (cần scopes cao và dễ bị revoke nếu user rời team). Microsoft khuyến cáo tránh PAT cho Checks vì rủi ro bảo mật và không tự động; chỉ dùng cho private repos cá nhân.

  • SAML ❌ SAI:
    SAML là chuẩn SSO enterprise (Security Assertion Markup Language), dùng cho authentication giữa identity provider (như Azure AD) và GitHub Enterprise Cloud/Server. Nó không áp dụng cho API calls như Checks API trong Azure Pipelines, và chỉ liên quan đến login user, không phải service-to-service auth.

📘 Tài liệu tham khảo

🛠️ Lời khuyên thực tế: Để setup, tạo GitHub App mới → Generate private key → Kết nối trong Azure DevOps Project Settings > Service connections > New (GitHub). Test bằng YAML pipeline với task: GitHubComment@0 hoặc status reporting!

Câu 247 Chọn nhiều đáp án
Your company has an on-premises Bitbucket Server that is used for Git-based source control. The server is protected by a firewall that blocks inbound Internet traffic.
You plan to use Azure DevOps to manage the build and release processes.
Which two components are required to integrate Azure DevOps and Bitbucket? Each correct answer presents part of the solution.
NOTE: Each correct selection is worth one point.
  1. A a deployment group
  2. B a Microsoft-hosted agent
  3. C service hooks
  4. D a self-hosted agent
  5. E an External Git service connection
Xem giải thích

🧩 Phân tích chi tiết câu hỏi

📖 Nội dung câu hỏi:
Câu hỏi thuộc chủ đề tích hợp Azure DevOps (trước đây là VSTS) với kho mã nguồn Bitbucket Server chạy on-premises (trên máy chủ nội bộ công ty). Bitbucket Server được bảo vệ bởi firewall chặn inbound Internet traffic (lưu lượng từ Internet vào server).
Công ty muốn sử dụng Azure DevOps để quản lý quy trình build (xây dựng) và release (triển khai).
Câu hỏi yêu cầu chọn hai components cần thiết để tích hợp Azure DevOps với Bitbucket Server. Đây là dạng multi-select (mỗi lựa chọn đúng đáng 1 điểm).

🛠️ Bối cảnh kỹ thuật (cập nhật đến 2026):

  • Azure DevOps Pipelines hỗ trợ tích hợp với external Git repos như Bitbucket Server (phiên bản mới nhất Azure DevOps Services hỗ trợ External Git service connections cho các repo on-premises hoặc private).
  • Vấn đề chính: Firewall chặn inbound → Azure DevOps (cloud) không thể trực tiếp pull/clone code từ Bitbucket Server vì không truy cập được URL on-premises. Cần agent nội bộ và kết nối service để giải quyết.
  • Mục tiêu: Cho phép Azure Pipelines sử dụng repo Bitbucket làm source control cho build/release.

✅ Đáp án đúng (hai lựa chọn):

  • a self-hosted agent
  • an External Git service connection

🔍 Lý do chọn đáp án đúng:
Để tích hợp thành công:

  1. an External Git service connection (kết nối dịch vụ Git bên ngoài): Tạo trong Azure DevOps để chỉ định URL repo Bitbucket Server, credentials (PAT hoặc username/password), và cho phép pipeline tham chiếu repo này làm source. Đây là bước bắt buộc để Azure DevOps "nhận diện" và validate repo external.
  2. a self-hosted agent (agent tự host): Vì Microsoft-hosted agents chạy trên cloud Azure, chúng không thể truy cập Bitbucket Server on-premises do firewall. Self-hosted agent cài trên máy nội bộ (cùng network với Bitbucket) sẽ clone/pull code locally, sau đó thực hiện build/release. Đây là giải pháp chuẩn cho on-premises repos (theo docs Azure DevOps 2026).

📋 Giải thích tất cả các phương án

  • a deployment group ❌ SAI
    Deployment group dùng để quản lý nhóm agents cho deployment (triển khai) đến servers/machines cụ thể (như target environments). Không liên quan đến việc tích hợp source control hoặc pull code từ Bitbucket. Chỉ dùng sau khi build xong, không phải để connect repo.

  • a Microsoft-hosted agent ❌ SAI
    Microsoft-hosted agents chạy trên cloud Azure (hàng trăm VMs sẵn có, miễn phí phút đầu). Chúng chỉ access được public repos (như GitHub public hoặc Bitbucket Cloud). Với Bitbucket Server on-premises + firewall block inbound, agents này không clone được code, dẫn đến pipeline fail ở bước checkout.

  • service hooks ❌ SAI
    Service hooks (nay gọi là incoming webhooks hoặc notifications) dùng để Azure DevOps gửi/nhận notifications (ví dụ: trigger build khi có push). Nhưng không dùng để pull code từ repo external trong pipeline. Với firewall, Bitbucket có thể outbound webhook, nhưng câu hỏi tập trung vào source integration cho build/release, không phải notifications.

  • a self-hosted agent ✅ ĐÚNG
    Agent tự cài trên máy nội bộ (Windows/Linux/Mac, hỗ trợ containerized đến 2026). Nó access Bitbucket Server qua network local/private, clone code thành công. Cấu hình: Đăng ký agent pool trong Azure DevOps, chạy trên VM/server cùng subnet với repo. Bắt buộc cho on-premises scenarios.

  • an External Git service connection ✅ ĐÚNG
    Kết nối được tạo trong Project Settings > Service connections > New service connection > External Git. Nhập URL Bitbucket Server (http/https), auth (Basic/PAT), test connection. Cho phép YAML/classic pipelines dùng resources.repositories hoặc repo task để reference repo này. Thiết yếu để Azure DevOps "kết nối" với external Git mà không mirror repo.

📘 Tài liệu tham khảo (cập nhật mới nhất 2026)

💡 Lưu ý thực hành: Test bằng cách tạo pipeline YAML đơn giản: trigger: none; resources: repositories: - repository: mybitbucket type: github (adapt cho Bitbucket), chạy trên self-hosted pool! 🚀

Câu 248
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.

After you answer a question in this section, you will NOT be able to return to it As a result these questions will not appear in the review screen.

You need to use an Azure Pipelines pipeline to build and test an app and test the database of the app. The solution must meet the following requirements.

•The test stages must be run in parallel.
•The Publish_Test_Results stage must always be run.
•The test stages must be run after successful completion of the build stage.
•The Publish_Test_Results stage must be run after completion of all the test stages.

Solution: You include the following elements in the YAML definition of the pipeline.

stages:
  - stage: Build_App
    jobs:
      - stage: Test_App
        dependsOn: []
        jobs:
          - stage: Test_Database
            dependsOn: []
            jobs:
              - stage: Publish_Test_Results
                dependsOn: 
                  - Build_App
                  - Test_App
                  - Test_Database
                condition: succeededOrFailed()
                jobs:
                  ...


Does this meet the goal?
  1. A Yes
  2. B No
Xem giải thích

🧩 Phân tích chi tiết câu hỏi

📘 Nội dung câu hỏi:
Câu hỏi thuộc dạng case study trong kỳ thi chứng chỉ (có thể là AZ-400 hoặc tương tự), nơi bạn phải đánh giá một giải pháp YAML pipeline trong Azure Pipelines có đáp ứng các yêu cầu cụ thể hay không. Các yêu cầu chính bao gồm:

  • Các giai đoạn test (test stages) phải chạy song song (parallel).
  • Giai đoạn Publish_Test_Results phải luôn chạy (always run), bất kể kết quả trước đó.
  • Các test stages phải chạy sau khi build stage thành công.
  • Publish_Test_Results phải chạy sau khi tất cả test stages hoàn thành.

Giải pháp đưa ra là một đoạn YAML pipeline với cấu trúc stages. Bạn cần xác định xem YAML này có đạt mục tiêu (meet the goal) không. Lưu ý: Đây là Azure DevOps Pipelines (không phải AWS như đề cập nhầm), sử dụng schema YAML phiên bản mới nhất (hỗ trợ đến 2026 với các tính năng như multi-stage pipelines, dependsOn, condition: succeededOrFailed()).

🛠️ Vấn đề chính trong YAML:
YAML có lỗi cấu trúc nghiêm trọng:

  • Stages phải là top-level (cấp cao nhất), không thể lồng stage bên trong jobs của stage khác.
  • Cụ thể: Test_App, Test_Database, Publish_Test_Results được đặt sai vị trí (nested trong jobs của Build_App hoặc lẫn lộn), dẫn đến pipeline không compile/parse được.
  • dependsOn: [] không đúng ngữ cảnh (dependsOn dùng cho stage/job, nhưng vị trí sai).
  • Kết quả: Pipeline không chạy được, nên không đáp ứng bất kỳ yêu cầu nào.

✅ Đáp án đúng: No

Lý do chọn đáp án đúng (bằng tiếng Việt):
YAML này không meet the goal vì cấu trúc YAML bị sai hoàn toàn theo schema Azure Pipelines (YAML Pipeline Schema v2.x mới nhất 2026). Stages không thể nested trong jobs; phải định nghĩa riêng biệt ở cấp top-level. Do đó:

  • Không chạy test stages song song (parallel).
  • Không đảm bảo thứ tự (build → tests → publish).
  • Publish_Test_Results có dependsOn và condition: succeededOrFailed() đúng ý tưởng, nhưng vị trí sai nên vô hiệu.
    Pipeline sẽ bị lỗi ngay khi validate, không đạt yêu cầu "test stages after successful build" hay "always run publish".

📋 Giải thích tất cả các phương án

  • Yes ❌ SAI
    Phương án này sai vì YAML không hợp lệ về mặt cú pháp. Trong Azure Pipelines (theo docs 2026), stages phải là mảng top-level riêng biệt, ví dụ đúng:

    stages:  
    - stage: Build_App  
      ...  
    - stage: Test_App  
      dependsOn: Build_App  
      ...  
    

    Nested stage trong jobs gây lỗi "Invalid YAML structure". Không đáp ứng parallel tests (cần dependsOn: [] ở top-level stages), thứ tự chạy, hay always run publish.

  • No ✅ ĐÚNG
    Phương án này đúng vì YAML fail validation và không thực thi được. Các vấn đề:

    • Nested stages sai: jobs: - stage: Test_App → Lỗi parse.
    • dependsOn: [] không áp dụng đúng (cho parallel, phải ở stages top-level).
    • Không có cơ chế parallel thực sự (test stages không independent).
    • Publish_Test_Results có dependsOn đúng các stage trước + succeededOrFailed() (always run), nhưng toàn bộ fail do cấu trúc.
      Giải pháp đúng cần tách stages riêng: Build → [Test_App & Test_Database parallel] → Publish (with condition always()).

📚 Tài liệu tham khảo

  • Azure DevOps YAML schema chính thức (2026): YAML schema reference – Xác nhận stages top-level only, no nesting in jobs.
  • Multi-stage pipelines guide: Multi-stage pipelines – Ví dụ parallel stages với dependsOn.
  • Conditions & always run: Pipeline conditions – succeededOrFailed() hoặc always().
  • Validation lỗi nested: Test trên Azure DevOps portal cho thấy lỗi "Unexpected value 'stage'".

💡 Lời khuyên: Để fix, dùng cấu trúc:

stages:  
- stage: Build_App  
  ...  
- stage: Test_App  
  dependsOn: Build_App  
- stage: Test_Database  
  dependsOn: Build_App  
- stage: Publish_Test_Results  
  dependsOn:  
  - Test_App  
  - Test_Database  
  condition: always()  

Điều này mới meet goal! 🚀

Câu 249 Chọn nhiều đáp án
You use GitHub for source control.

You are evaluating whether to use proxying to add a private upstream MyGet package feed to your MyGet feed.

What are two possible advantages of this approach? Each correct answer presents a complete solution.

NOTE: Each correct selection is worth one point.
  1. A minimizes the impact of upstream source availability issues
  2. B minimizes latency when accessing the package
  3. C provides automatic authentication
  4. D minimizes the impact on your storage quota
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi này thuộc lĩnh vực quản lý package feeds trong MyGet (một dịch vụ quản lý package repository, hiện được tích hợp sâu với Azure Artifacts và GitHub Packages). Tình huống: Bạn đang sử dụng GitHub làm source control, và đang đánh giá việc sử dụng proxying để thêm một private upstream MyGet package feed vào feed MyGet của chính bạn.

Proxying upstream feed nghĩa là cấu hình feed của bạn làm "proxy" (đại diện) cho một feed upstream khác (ở đây là private MyGet feed). Khi người dùng yêu cầu package từ feed của bạn, nó sẽ tự động kiểm tra cache local trước, nếu không có thì fetch từ upstream, và có thể cache lại.

Câu hỏi yêu cầu chọn hai ưu điểm (advantages) của cách tiếp cận này, mỗi đáp án đúng là một giải pháp hoàn chỉnh (worth 1 point). Đây là dạng multiple correct answers (chọn tất cả đúng), tập trung vào lợi ích thực tế của proxying trong MyGet/Azure Artifacts.

✅ Đáp án đúng và lý do lựa chọn

Hai đáp án đúng là:

  • provides automatic authentication
  • minimizes the impact on your storage quota

Lý do lựa chọn:
🛠️ Theo tài liệu chính thức của MyGet (nay thuộc Azure DevOps Services), proxying upstream feed mang lại hai lợi ích cốt lõi này:

  • Automatic authentication: Feed proxy tự động xử lý xác thực (auth) với upstream private feed, giúp người dùng cuối không cần config auth riêng, đơn giản hóa quy trình.
  • Giảm tác động đến storage quota: Packages từ upstream chỉ được cache tạm thời khi cần (và có thể evicted tự động), không tính đầy đủ vào quota lưu trữ của feed bạn, giúp tiết kiệm dung lượng.
    Các lợi ích này được xác nhận trong phiên bản mới nhất (2024-2026) của Azure Artifacts/MyGet, nơi proxy views được tối ưu cho private feeds.

📋 Giải thích chi tiết tất cả các phương án

Dưới đây là phân tích từng phương án một cách rõ ràng, giữ nguyên văn bản gốc tiếng Anh. Mỗi phương án được đánh giá ✅ (đúng) hoặc ❌ (sai), kèm giải thích đầy đủ bằng tiếng Việt dựa trên cơ chế hoạt động thực tế của MyGet proxying:

  • minimizes the impact of upstream source availability issues
    ❌ Sai. Proxying không giảm đáng kể tác động từ vấn đề availability của upstream. Nếu package chưa được cache và upstream down, người dùng vẫn gặp lỗi ngay lập tức. Proxy chỉ giúp nếu package đã cache trước đó, nhưng không phải ưu điểm chính thức hay "complete solution" – upstream issues vẫn ảnh hưởng trực tiếp nếu miss cache.

  • minimizes latency when accessing the package
    ❌ Sai. Proxying không nhất thiết giảm latency. Lần đầu truy cập, nó phải fetch từ upstream (có thể xa hoặc chậm), chỉ giảm latency ở các lần sau nhờ cache. Tuy nhiên, đây không phải ưu điểm cốt lõi được nhấn mạnh trong docs MyGet; latency phụ thuộc network và cache hit rate, không phải "guaranteed minimize".

  • provides automatic authentication
    ✅ Đúng. Proxying cung cấp xác thực tự động cho upstream private feed. Feed của bạn xử lý credentials (PAT, token) với upstream, người dùng chỉ cần auth với feed proxy – rất hữu ích cho private MyGet feeds, tránh expose credentials cho dev team.

  • minimizes the impact on your storage quota
    ✅ Đúng. Proxying giảm tác động đến quota lưu trữ của feed bạn. Packages upstream chỉ lưu cache "on-demand" (khi được request lần đầu), và MyGet hỗ trợ eviction policy để tự động xóa cache cũ, không chiếm quota vĩnh viễn như khi mirror/download full feed.

📘 Tài liệu tham khảo

Hy vọng phân tích này giúp bạn nắm vững! 🚀 Nếu cần ví dụ config thực tế trong Azure DevOps, hãy hỏi thêm nhé!

Câu 250
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear in the review screen.
Your company has a project in Azure DevOps for a new web application.
You need to ensure that when code is checked in, a build runs automatically.
Solution: From the Continuous deployment trigger settings of the release pipeline, you enable the Pull request trigger setting.
Does this meet the goal?
  1. A Yes
  2. B No
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

✅ Mô tả scenario chung: Đây là một câu hỏi thuộc dạng series (nhiều câu hỏi cùng scenario), nơi mỗi câu đưa ra một giải pháp độc lập để đạt mục tiêu. Người dùng KHÔNG THỂ quay lại câu hỏi sau khi trả lời, và nó không xuất hiện trong màn hình review.
Công ty có một project trong Azure DevOps dành cho ứng dụng web mới.

✅ Mục tiêu (goal): Đảm bảo rằng khi code được check-in (commit và push vào repository), một build pipeline sẽ chạy tự động.
🛠️ Ý nghĩa kỹ thuật: Đây là yêu cầu triển khai Continuous Integration (CI) – trigger tự động build khi có thay đổi code (thường qua branch triggers hoặc CI triggers trong build pipeline). Không liên quan đến release hay deployment.

✅ Giải pháp đề xuất (solution):
Từ Continuous deployment trigger settings của release pipeline, kích hoạt (enable) Pull request trigger setting.

🧩 Vấn đề cốt lõi: Giải pháp này tập trung vào release pipeline (CD - Continuous Deployment), trong khi goal cần trigger build pipeline (CI). Pull request trigger thường dùng cho build validation, không phải để trigger build khi check-in thông thường.

✅ Đáp án đúng: No

Lý do lựa chọn:
❌ Giải pháp KHÔNG đạt mục tiêu vì:

  • Continuous deployment trigger trong release pipeline chỉ trigger release khi artifact (từ build) sẵn sàng, KHÔNG trigger build khi code check-in.
  • Pull request trigger (nếu có) chủ yếu dành cho build pipeline để validate PR (pull request), không phải trigger build tự động cho mọi check-in/push vào branch.
  • Để đạt goal, cần cấu hình CI trigger (hoặc branch trigger) trực tiếp trong build pipeline, ví dụ: enable "CI" trong triggers hoặc dùng YAML với trigger: - main. Giải pháp này sai vị trí và sai loại trigger!
    📅 Kiến thức cập nhật (Azure DevOps 2024-2026): Không có thay đổi lớn; pull request triggers vẫn giới hạn chủ yếu ở build pipelines, release pipelines dùng artifact/definition triggers (Azure Pipelines docs).

📋 Giải thích tất cả các phương án

Dưới đây là phân tích từng lựa chọn giữ nguyên văn bản gốc bằng tiếng Anh, kèm giải thích hoàn toàn bằng tiếng Việt:

  • Yes
    ❌ SAI: Phương án này cho rằng giải pháp đạt goal, nhưng thực tế KHÔNG. Nó chỉ ảnh hưởng đến release pipeline (trigger release khi PR), không tự động chạy build khi code check-in. Sử dụng sai pipeline và trigger → Không giải quyết CI.

  • No
    ✅ ĐÚNG: Phương án chính xác vì giải pháp KHÔNG đáp ứng goal. Cần trigger ở build pipeline (CI triggers), không phải release (CD triggers). Enable PR trigger ở release chỉ (nếu khả dụng) sẽ trigger release/deployment cho PR, bỏ qua build tự động cho check-in thông thường.

📘 Tài liệu tham khảo (Azure DevOps docs - phiên bản mới nhất 2026)

Hy vọng phân tích này giúp bạn nắm vững Azure DevOps! 🚀 Nếu cần ví dụ code YAML, hãy hỏi thêm nhé!