Azure DevOps中如何在单个CI作业完成后触发发布流水线?
实现CI流水线构建完成后直接触发发布,无需等待漏洞扫描
核心思路是让Docker构建作业和漏洞扫描作业并行执行,同时在构建作业完成后立即触发发布流水线,完全不依赖扫描作业的状态。以下是主流CI工具的具体实现方式:
GitHub Actions
主CI流水线配置
将构建和扫描设为并行作业,在构建完成后通过repository_dispatch事件触发发布流水线:
name: CI Pipeline on: [push] jobs: docker-build: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 构建并推送Docker镜像 run: | docker build -t your-registry/my-image:latest . docker push your-registry/my-image:latest - name: 触发发布流水线 uses: peter-evans/repository-dispatch@v3 with: token: ${{ secrets.GITHUB_TOKEN }} event-type: trigger-deployment client-payload: '{"image_tag": "latest"}' sec-scan: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 运行漏洞扫描 run: | # 替换为你的扫描命令,比如Trivy、Snyk trivy image your-registry/my-image:latest
发布流水线配置
让发布流水线监听repository_dispatch事件即可:
name: Deployment Pipeline on: repository_dispatch: types: [trigger-deployment] jobs: deploy: runs-on: ubuntu-latest steps: - name: 执行部署 run: | echo "部署镜像: ${{ github.event.client_payload.image_tag }}" # 这里添加你的部署命令
GitLab CI
主CI流水线配置
将构建和扫描放在同一个并行阶段,构建完成后通过GitLab API触发发布流水线:
stages: - build_scan - deploy docker-build: stage: build_scan script: - docker build -t your-registry/my-image:latest . - docker push your-registry/my-image:latest # 触发发布流水线(替换为你的项目ID和分支) - curl --request POST \ --form "token=${CI_JOB_TOKEN}" \ --form "ref=main" \ "https://your-gitlab-instance/api/v4/projects/${CI_PROJECT_ID}/trigger/pipeline" tags: - docker-runner sec-scan: stage: build_scan script: - trivy image your-registry/my-image:latest tags: - scan-runner
发布流水线配置
在发布流水线的only规则中添加triggers,确保只接受触发请求:
stages: - deploy deploy-job: stage: deploy script: # 部署命令 only: - triggers
Jenkins
Pipeline配置
使用parallel块让构建和扫描并行执行,构建完成后用build步骤触发发布流水线(wait: false表示不等待发布完成):
pipeline { agent any stages { stage('Build & Scan') { parallel { stage('Docker Build') { steps { script { sh 'docker build -t your-registry/my-image:latest .' sh 'docker push your-registry/my-image:latest' // 触发发布流水线,wait: false 不等待发布完成 build job: 'Deployment-Pipeline', parameters: [string(name: 'IMAGE_TAG', value: 'latest')], wait: false } } } stage('Vulnerability Scan') { steps { script { sh 'trivy image your-registry/my-image:latest' } } } } } } }
通用注意事项
- 确保扫描作业的资源不影响构建作业的执行效率,可以给两个作业分配独立的运行环境
- 扫描作业的结果可以单独通知(比如Slack邮件),但不要阻塞发布流程
- 如果需要在扫描出严重漏洞时回滚发布,可以单独配置一个后续的回滚流水线,由扫描结果触发
内容的提问来源于stack exchange,提问作者Hanzala Siddique
相关产品推荐
相关产品推荐

