我们的项目嵌套在单一存储库中。想象一下,我们在“projects”文件夹中有一个项目。例如“projects / our-project”。好吧,我们希望能够将我们的.drone.yml检查到“我们的项目”中,但看起来Drone想要项目根目录下的配置文件,没关系,我们可以通过更改“命令“我们构建的部分。我们遇到的麻烦是我们只想在“我们的项目”中的某些内容发生变化时运行构建。我无法找到一种方法与Drone精确地做到这一点,所以我们下一个最接近的赌注是conditions,我想我们可以命名为“我的项目”的命名空间,就像这个“我的项目/某个分支” 。然后我们可以设置一个条件,只在“我的项目/某个分支”和“主”上运行构建,这将限制我们从其他项目分支运行的“假构建”的数量:
build:
when:
branch:
- master
- our-project/*
问题是当我们尝试将请求从“my-project / ”分支拉到“master”时,构建将无法运行,我猜测因为它是在合并提交上运行的,因为它不是'在主人或“我们的项目/ ”
我的问题有两个: 1.使用单声道存储库模式(多个项目,一个存储库)利用无人机的最佳方法是什么? 2.如果无人机不支持该模式或不是为此设计的,那么限制“虚假构建”的最佳解决办法是什么
注意:我们可以在构建开始时检查子文件夹中的更改,如果没有,则返回绿色。我这是推荐的方法吗?
答案 0 :(得分:0)
我猜Drone强制执行特定的项目布局,因为有一个约束:
以下两个约束也很重要,但在这种情况下不是决定因素:
.drone.yml
,一个管道.drone.yml
必须位于项目根目录如果您有一个包含多个项目的存储库,则无论结构如何,您都无法根据要更新的特定资产触发构建管道。
如果您有大型多模块项目并且您不想在每次推送时构建整个项目,那么最好的做法是重构项目,将每个模块放在自己的存储库中,并配置Drone管道以触发下游/ upstream根据需要构建依赖项/依赖项。
答案 1 :(得分:0)
由于以下原因,我认为在Drone 1.x中应该会更好一些:
触发器将修复假的构建问题,因为如果不满足触发条件,则无人机将无法启动构建。
一个无人机文件中现在支持多个管道。例如:
kind: pipeline
name: frontend
steps:
- name: build
image: node
commands:
- npm install
- npm test
---
kind: pipeline
name: backend
steps:
- name: build
image: golang
commands:
- go build
- go test
每个触发器可以有不同的触发器。
现在也可以通过cli在除根目录之外的其他目录中指定无人机文件:
drone repo set octocat/hello-world config.path .github/.drone.yml
来源:https://github.com/drone/drone/issues/1965。
对于具有基本分支为master
的拉取请求的问题,我认为无法解决。我能想到的解决方法是:
仅当成员通过无人机cli或UI批准时,这才允许“拉取请求”构建和分支构建。因此,您可以为PR推送设置其他Webhook接收器,这些接收器会自动批准这些分支机构在无人机上的对应版本,而对其他分支机构则不批准。
通过一个仅在请求请求时触发的步骤来创建虚拟管道。
在完成后,如果需要使用our_project
的分支,请使用webhook甚至是此虚拟管道本身中的一个步骤,通过无人机API将此构建升级到特定的目标(环境)。在该目标上有另一个管道触发器。
答案 2 :(得分:0)
针对此问题,目前有多种解决方案。
首先,您可以使用exit (78)代码跳过管道中的后续步骤,但是此解决方法要求您定义多个可以跳过的管道。
示例:
- name: Check_src_for_changes
image: alpine/git
commands:
- if (git diff --exit-code $DRONE_COMMIT_BEFORE $DRONE_COMMIT_AFTER -- src); then exit 78; fi
此外,由于Drone插件的新类别(称为配置插件),当前还可以处理多个扩展名:
任何人都可以使用无人机入门项目创建扩展
扩展名可用于覆盖Drone如何获取Yaml,从而允许您即时创建或修改Yaml文件。今天可以使用多种扩展程序来解决此问题。这里有一些:
有关此问题的更多信息,请参阅issue#1021