問題 1. 解釋 Azure DevOps YAML 管道的典型結構。
您可以從管道的整體結構開始,從觸發器開始。您也可以選擇解釋它可能包含的不同類型的階段:構建、測試、掃描、部署等。
Azure DevOps YAML 管道結構示例
- 觸發器指示管道運行。它可以是持續集成 (CI) 或計劃運行、手動運行(如果未指定)或在另一個構建完成后運行。
- 流水線由多個階段組成,可以部署到一個或多個環境中。
- 階段負責組織流水線中的作業,每個階段可以包含一個或多個作業。
- 每個作業都在一個代理上運行,例如 Ubuntu、Windows、macOS 等。作業也可以是無代理的。
- 每個代理運行一個包含一個或多個步驟的作業。
- 步驟可以是任務或腳本,是流水線的最小構建塊。
- 任務是預先打包的腳本,可以執行諸如調用 REST API 或發布構建工件之類的操作。
- 工件是運行發布的文件或軟件包的集合。
問題 2:您的組織使用哪種部署策略?解釋 CICD 流程:
如果您對任何部署策略都不熟悉,可以解釋藍綠部署策略。
藍綠部署在 Azure DevOps 中的工作原理圖
您還可以解釋以下使用 Azure DevOps 向 Azure Web 應用進行藍綠部署的 CICD 流程。
使用藍綠部署策略的 Azure Web 應用的 Azure DevOps 流水線 CICD 流程示例

問題 3:還有哪些其他部署策略?
您還可以解釋以下部署策略:
- 金絲雀發布
金絲雀發布是一種技術,它通過先將更改緩慢地推廣到一小部分用戶,然后再推廣到整個基礎架構并讓所有人都可以使用,從而降低在生產環境中引入新軟件版本的風險。
與藍綠部署類似,您首先將新版本的軟件部署到基礎架構中沒有路由到任何用戶的子集。
當您對新版本感到滿意時,就可以開始將部分選定的用戶路由到該版本。
- A/B 測試
與金絲雀發布類似,A/B 測試也可以根據路由規則來路由用戶流量,這些規則通常包含瀏覽器版本、用戶代理、地理位置和操作系統等因素。在測量和比較版本之后,您可以使用效果更佳的版本更新生產環境。
- 滾動更新
在滾動部署中,您可以同時更改一個實例或一批實例。在三層 Web 應用程序示例中,UI 更改將首先部署到一個實例,完成后,再在另一個實例上重復部署。
問題 4:您在 Azure DevOps 中使用了哪些構建存儲庫?解釋 CI/CD 流程:
您可以解釋您使用過的任何構建存儲庫,例如 Artifactory、Nexus、Docker 鏡像倉庫等,也可以解釋內置的 Azure DevOps 存儲庫 Artifacts。您可以解釋以下 CICD 流程:
使用 Artifacts 的 Azure DevOps CICD 流程示例

問題 5:Artifacts 源中的視圖有哪些?
存儲庫中獨立的占位符可以分為本地、預發布、發布等。將 Artifacts 部署到一個環境后,您會將其提升到另一個視圖,以便部署到另一個環境,該視圖是觸發器。以上示例有助于解釋這一點。
問題 6:您將如何使用 ARM 模板或 Terraform 等 IaaC 工具來自動化基礎設施配置?
您可以解釋以下 CICD 流程
展示 Azure DevOps 與 Terraform 集成的 CICD 流程示例

問題 7:Microsoft 托管代理和自托管代理之間有什么區別?
首先提供每個代理的至少一個用例,并根據下圖解釋其區別:
示例圖展示了 Microsoft 托管代理與自托管代理的比較
問題 8:如果 Microsoft 已經為您提供了托管代理,您為什么還要設置自托管代理?
首先解釋自托管代理的功能,以及為什么它最適合生產服務器或您的關鍵工作負載。
Microsoft 自托管代理的優勢和設置
問題 9:Microsoft 托管代理還有其他限制嗎?
可能有很多限制,例如:
無法自定義安裝軟件包/軟件
有時,您必須等待代理可用,這會導致管道執行延遲。
它預定義了存儲、內存和 CPU,這對于執行內存或 CPU 密集型構建管道來說是不夠的。
您無法強化 Microsoft 托管代理的安全性。
問題 10:我正在構建一個 Docker 鏡像,它耗時很長,而且非常龐大。如何減小鏡像大小并加快構建速度?
請解釋一下多階段構建。以下是 Docker 文件片段的示例。
FROM node:18-alpine AS installer
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:latest AS deployer
COPY --from=installer /app/build /usr/share/nginx/html
問題 11:解釋一些 Azure DevOps 最佳實踐:
常規
規劃與策略:在實施前定義架構和規劃,以確保順利推出。
利益相關者參與:確保所有利益相關者(開發人員、管理員、質量保證人員、產品負責人等)都參與到整個流程中。
Azure Boards
使用epic、功能和用戶故事:充分利用分層工作項來組織工作。
查詢和儀表板:使用查詢和儀表板跟蹤和報告項目進度。
Azure Repos
分支策略:實施有效的分支策略,例如 Git Flow 或功能分支。
代碼審查:利用代碼審查拉取請求來確保質量。
Azure Pipelines
基礎設施即代碼:使用基礎設施即代碼創建和管理環境。
自動構建:為每次推送到主要分支的操作??配置自動構建。
自動測試:將自動測試集成到 CI/CD 流水線中。
環境升級:設置多個環境(開發、預發布、生產),并在它們之間升級構件。
參數化:通過參數使您的管道可重用。
Azure 測試計劃
測試自動化:集成自動化測試,實現更快的反饋循環。
測試數據管理:提供一組優質的測試數據,以便進行全面測試。
Azure 構件
版本控制:為包和庫提供版本號,以便更好地跟蹤。
私有源:對特定于組織的構件使用私有源。
安全性
使用基于角色的訪問控制 (RBAC):實施 RBAC 以實現細粒度的訪問控制。
機密管理:使用 Azure Key Vault 或類似服務安全地管理機密。
監控和日志記錄
日志記錄:實施詳細的日志記錄,以便更輕松地診斷問題。
監控和警報:使用 Azure Monitor 和其他監控工具跟蹤應用程序的運行狀況并接收任何問題的通知。
文檔
記錄最佳實踐:記錄最佳實踐和流程,以便新團隊成員輕松入職。?
問題 12:如何確保管道中使用的機密的安全性和隱私性,以防止其泄露?
您可以解釋在 Azure DevOps 中實施機密管理的各種方法,例如:
使用 Azure Key Vault 并通過變量組訪問。
使用運行時變量,對文件進行標記,并在管道內替換標記步驟。
使用第三方機密管理服務,例如 Hashicorp Vault。
問題 13:您在使用 Azure DevOps 時遇到的最困難的問題是什么?
如果您遵循了本系列或其他資源,請提出您在 Azure DevOps 實踐中遇到的問題。
請以 STAR 格式組織您的答案:S:情況,T:任務,A:行動,R:結果。
問題 14:如何為基于容器的應用程序實現 CICD?
- 編寫dockerfile,使用多階段構建。
- 創建azure devops pipeline
- 持續集成(CI)
trigger:branches:include:- mainpool:vmImage: 'ubuntu-latest'steps:- task: Docker@2displayName: Build Imageinputs:command: buildcontainerRegistry: 'yourContainerRegistry'repository: 'yourRepository'dockerfile: '**/Dockerfile'tags: |$(Build.BuildId)- script: |echo "Running tests"# Insert commands to run testsdisplayName: 'Run Tests'
? ? ? 4. 持續部署 (CD)
對于 AKS:
使用 Helm 圖表或 Kubernetes 清單定義應用程序部署。
在流水線中添加部署步驟,以推送 Docker 鏡像并進行部署。
部署到 AKS 的示例(使用 Azure DevOps):
- task: AzureCLI@2inputs:azureSubscription: 'YourAzureSubscription'scriptType: 'bash'scriptLocation: 'inlineScript'inlineScript: |az aks get-credentials --resource-group yourResourceGroup --name yourAKSClusterkubectl apply -f deployment.yamldisplayName: 'Deploy to AKS'
對于ACI:
- task: AzureCLI@2inputs:azureSubscription: 'YourAzureSubscription'scriptType: 'bash'scriptLocation: 'inlineScript'inlineScript: |az container create --resource-group yourResourceGroup --name yourContainerName --image yourImage:$(Build.BuildId)displayName: 'Deploy to ACI'
問題 15:如何為基于微服務且包含多個服務的應用程序實現持續集成 (CI/CD)?
1. 代碼庫管理
代碼庫:確定代碼庫結構。您可以使用單一代碼庫(所有微服務使用一個代碼庫)或多代碼庫(多個代碼庫,每個微服務一個)。每種方法都有其優缺點。
2. 持續集成 (CI)
構建自動化
- CI 工具:選擇與您的代碼庫良好集成的 CI 工具(例如,azure devops、GitLab CI/CD、GitHub Actions)。
- 構建定義:為每個微服務定義構建流程。這通常包括:
- 構建:編譯代碼或創建工件(例如,Docker 鏡像、JAR 文件)。
- 打包:將構建輸出打包為標準格式。
測試
- 單元測試:運行單元測試以確保微服務代碼正確。
- 集成測試:運行測試以檢查微服務之間的交互。這可能涉及使用模擬生產的臨時環境。
- 端到端測試:如有必要,運行全面的測試來驗證整個系統的功能。
代碼質量和安全
- 代碼質量工具:集成靜態代碼分析工具以強制執行代碼標準。
- 安全掃描:實施自動化安全漏洞掃描。
3. 工件管理
工件存儲庫:使用存儲庫存儲已構建的工件(例如 Docker Hub、JFrog Artifactory、Nexus)。
版本控制:使用語義版本控制來管理工件,這有助于跟蹤更改和兼容性。
4. 持續部署 (CD)
部署流水線
- 流水線配置:為每個微服務創建部署流水線。流水線應包含:
- 預發布部署:將服務部署到預發布環境進行集成和驗收測試。
- 生產部署:驗證完成后,將服務部署到生產環境。
部署策略
- 藍/綠部署:將新版本與舊版本一起部署,并在確認新版本穩定后切換流量。
- 金絲雀部署:在全面發布之前,逐步向一小部分用戶推出新版本。
- 滾動更新:逐步更新服務以最大程度地減少停機時間。
配置管理
特定于環境的配置:將配置與代碼分開管理。
5. 環境管理
- 獨立環境:為開發、預發布和生產維護獨立的環境。確保每個環境的部署流程相互隔離且可控。
- 基礎設施即代碼 (IaC):使用 IaC 工具(例如 Terraform、ARM)以一致的方式管理和配置基礎設施。
6. 監控和日志記錄
- 監控:實施監控以跟蹤微服務的運行狀況和性能(例如,Prometheus、Grafana、Datadog)。
- 日志記錄:集中管理所有微服務的日志,以便于調試和分析(例如,ELK Stack、Fluentd、Loki)。
- 警報:設置關鍵問題警報,并盡可能實現自動化響應。
7. 安全
- 訪問控制:為您的 CI/CD 流水線和環境實施嚴格的訪問控制。
- 自動化安全測試:定期掃描代碼和依賴項中的漏洞。
8. 文檔和溝通
- 文檔:保持部署流程、環境配置和故障排除指南的文檔更新。
- 溝通:使用溝通工具(例如,Slack、Microsoft Teams)通知團隊有關部署、故障和其他重要更新的信息。