Gitlab仅在上一个作业运行时才运行管道作业

Sam*_*Sam 11 pipeline gitlab-ci

我正在尝试创建一个包含生产和开发部署的管道。在这两种环境中,应用程序都应该使用 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"]
Run Code Online (Sandbox Code Playgroud)

Cha*_*ear 5

这里的问题是你的deploy工作需要以前的build工作实际存在。

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

因此,当仅frontend-fold 中的某些内容发生更改时,build_backend根本不会生成 -Job。但deploy_backend_dev工作仍然如此,然后就失去了它的依赖性。

一个快速修复方法是将only.changes配置也添加到部署作业中,如下所示:

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"]
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,这是一个修复。我希望找到比目录更依赖的工作。但这可以完成任务。 (6认同)