Gitlab 运行 管道作业仅当上一个作业 运行

Gitlab run pipeline job only when previous job ran

我正在尝试创建一个包含生产和开发部署的管道。在这两种环境中,应使用 docker 构建应用程序。但只有当相应目录中的某些内容发生更改时。

例如:

起初我没有needs: 关键字。管道始终执行 deploy_backend 和 deploy_frontend,即使未执行构建作业也是如此。

现在我添加了 needs: 关键字,但是 Gitlab 在只有一个目录发生变化时说 yaml invalid 。当两个目录都发生变化时,管道工作正常。例如,当 2 个目录外的 README.md 发生变化时,也会显示 yaml invalid

有谁知道我如何创建一个仅在指定目录发生更改时才运行的管道,并且仅在构建作业具有 运行 时才运行相应的部署作业?

gitlab-ci.yml:

stages:
  - build
  - deploy

build_frontend:
  stage: build
  only:
    refs:
      - master
      - development
    changes:
      - frontend/* 
  script: 
    - cd frontend
    - docker build -t frontend .

build_backend:
  stage: build
  only:
    refs:
      - master
      - development
    changes:
      - backend/* 
  script: 
    - cd backend
    - docker build -t backend .

deploy_frontend_dev:
  stage: deploy
  only:
    refs:
      - development
  script:
    - "echo deploy frontend"
  needs: ["build_frontend"]

deploy_backend_dev:
  stage: deploy
  only:
    refs:
      - development
      - pipeline
  script:
      - "echo deploy backend"
  needs: ["build_backend"]

这里的问题是您的 deploy 作业需要之前的 build 作业实际存在。

但是,通过使用 only.changes 规则,它们仅在这些目录中实际发生更改时才存在。

所以当只有 frontend- 文件夹中的内容发生变化时,根本不会生成 build_backend- 作业。但是 deploy_backend_dev 工作仍然存在,然后错过了它的依赖性。

一个快速修复方法是将 only.changes 配置也添加到 deployment-jobs,如下所示:

deploy_frontend_dev:
  stage: deploy
  only:
    refs:
      - development
    changes:
      - frontend/* 
  script:
    - "echo deploy frontend"
  needs: ["build_frontend"]

deploy_backend_dev:
  stage: deploy
  only:
    refs:
      - development
      - pipeline
    changes:
      - backend/* 
  script:
      - "echo deploy backend"
  needs: ["build_backend"]

这样,只有当从属 build 作业也创建时才会创建这两个作业,并且 yaml 不会无效。