如何在Azure Pipelines所有Stage前执行Checkout并实现多Stage复用?
统一Checkout代码并跨Stage复用的实现方案
完全可以实现统一拉取代码并让所有Stage复用,具体分两种场景提供实现方式:
场景1:自托管代理(可保证作业在同一代理执行)
方案一:全局配置+共享工作区
在流水线顶层统一配置checkout和共享工作区,所有Job自动复用代码,无需重复拉取:
# 全局配置:仅执行一次checkout checkout: self # 配置共享工作区,保留已拉取的代码 workspace: clean: false name: shared_code_workspace stages: - stage: dev jobs: - deployment: DeploySQLObjects displayName: "Deploy SQL objects" environment: "Synapse_DEV" strategy: runOnce: deploy: steps: # 无需再次添加checkout步骤,直接使用共享代码 - stage: test jobs: - job: RunTests displayName: "Execute Test Cases" steps: # 直接使用共享代码执行测试 - stage: prod jobs: - deployment: DeployToProd displayName: "Deploy to Production" environment: "Synapse_PROD" strategy: runOnce: deploy: steps: # 直接使用共享代码部署
方案二:前置初始化Stage(更明确的流程控制)
创建专门的初始化Stage执行checkout,其他Stage依赖该Stage并继承工作区:
stages: - stage: init jobs: - job: CheckoutRepository displayName: "Pull Source Code" steps: - checkout: self persistCredentials: true # 若后续需操作仓库可开启 workspace: name: shared_code_workspace - stage: dev dependsOn: init # 依赖初始化Stage jobs: - deployment: DeploySQLObjects displayName: "Deploy SQL objects" environment: "Synapse_DEV" workspace: inherit: true # 继承初始化Stage的工作区 strategy: runOnce: deploy: steps: # 无需重复checkout - stage: test dependsOn: init jobs: - job: RunTests displayName: "Execute Test Cases" workspace: inherit: true steps: # 使用共享代码 - stage: prod dependsOn: init jobs: - deployment: DeployToProd displayName: "Deploy to Production" environment: "Synapse_PROD" workspace: inherit: true strategy: runOnce: deploy: steps: # 使用共享代码
场景2:微软托管代理(代理为临时虚拟机)
微软托管代理每次作业可能分配到不同虚拟机,无法直接共享工作区,需通过工件传递代码:
stages: - stage: init jobs: - job: CheckoutAndPublish displayName: "Pull Code & Publish as Artifact" steps: - checkout: self # 将代码打包为流水线工件 - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.SourcesDirectory)' ArtifactName: 'source_code' publishLocation: 'Container' - stage: dev dependsOn: init jobs: - deployment: DeploySQLObjects displayName: "Deploy SQL objects" environment: "Synapse_DEV" strategy: runOnce: deploy: steps: # 下载工件到当前作业目录 - task: DownloadBuildArtifacts@0 inputs: artifactName: 'source_code' downloadPath: '$(Build.SourcesDirectory)' # 后续步骤使用下载的代码 - stage: test dependsOn: init jobs: - job: RunTests displayName: "Execute Test Cases" steps: - task: DownloadBuildArtifacts@0 inputs: artifactName: 'source_code' downloadPath: '$(Build.SourcesDirectory)' # 执行测试 - stage: prod dependsOn: init jobs: - deployment: DeployToProd displayName: "Deploy to Production" environment: "Synapse_PROD" strategy: runOnce: deploy: steps: - task: DownloadBuildArtifacts@0 inputs: artifactName: 'source_code' downloadPath: '$(Build.SourcesDirectory)' # 部署代码
注意事项
- 自托管代理场景下,需确保代理未被其他流水线占用,否则可能导致工作区被污染;
- 微软托管代理场景下,工件传递是唯一可靠的跨Stage代码复用方式,虽多了打包/下载步骤,但能保证代码一致性。
内容的提问来源于stack exchange,提问作者SqlKindaGuy
相关产品推荐
相关产品推荐

