Azure Pipeline:排除拉取请求构建验证触发CD流水线
解决PR构建触发CD流水线的问题
方法1:在CD流水线中添加构建原因过滤
直接在CD的作业或阶段层面添加条件判断,仅当触发CD的CI构建不是PR类型时才执行部署逻辑。修改CD.yml如下:
trigger: none resources: pipelines: - pipeline: CI source: "CI" trigger: branches: include: - main exclude: - '*' stages: - 'Package: CI' jobs: - job: DeployJob # 仅当CI构建原因不是PullRequest时运行 condition: ne(variables['resources.pipeline.CI.buildReason'], 'PullRequest') steps: # 这里写你的部署步骤 - script: echo "开始部署"
原理:PR触发的CI构建,其buildReason会被标记为PullRequest,通过这个条件可以直接跳过CD的执行。
方法2:让CI仅在非PR构建时主动触发CD
放弃CD的资源自动触发器,改为在CI流水线中添加条件触发逻辑,只有非PR构建完成后才主动调用CD。
- 修改CD.yml,移除资源触发器,保持手动触发:
trigger: none # 移除原有的resources.pipelines配置
- 在CI.yml中添加一个条件触发阶段,仅当非PR构建时执行:
# 你的CI现有阶段配置... - stage: TriggerCD condition: ne(variables['Build.Reason'], 'PullRequest') jobs: - job: TriggerDeployment steps: - task: TriggerPipeline@2 inputs: pipeline: 'CD' # 替换为你的CD流水线名称或ID branch: 'main' waitForCompletion: false # 按需设置是否等待CD执行完成
原理:完全由CI控制CD的触发时机,PR构建会跳过这个触发阶段,自然不会启动CD。
方法3:修正CD的阶段过滤逻辑(针对你现有配置)
你提到PR构建时会跳过Package: CI阶段,但CD仍被触发,大概率是CD的阶段过滤配置位置错误。修正如下:
trigger: none resources: pipelines: - pipeline: CI source: "CI" trigger: branches: include: [main] exclude: ['*'] # 阶段过滤要放在trigger根节点下,而非branches节点内 stages: ['Package: CI']
同时确认CI中PR构建时,Package: CI阶段确实未执行(可查看CI流水线运行日志验证)。修正后,CD只会在CI的Package: CI阶段成功时才触发,PR构建跳过该阶段后就不会触发CD了。
内容的提问来源于stack exchange,提问作者Vista
相关产品推荐
相关产品推荐

