我正在尝试创建带有生产和开发部署的管道。在这两种环境中,应使用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"]
答案 0 :(得分:1)
这里的问题是您的deploy
工作需要之前的build
工作才能真正存在。
但是,通过使用only.changes
规则,它们仅在这些目录中实际发生更改时才存在。
因此,仅更改frontend
文件夹中的某个内容时,根本不会生成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"]
这样,只有同时创建了依赖的build
作业并且yaml也不会无效,才会创建两个作业。