15 个 Azure DevOps 场景化面试问题及解答
问题 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)通知团队有关部署、故障和其他重要更新的信息。