我们的项目嵌套在mono存储库中。想象一下,我们在"项目"文件夹中有一个项目。例如"项目/我们的项目"。好吧,我们希望能够将.drone.yml检查为"我们的项目",但drone似乎希望配置文件位于项目的根目录,这是可以的,我们可以通过更改构建的"命令"部分来处理它。我们遇到的问题是,我们只想在"我们的项目"中的某些内容发生变化时运行构建。我找不到用Drone精确地做到这一点的方法,所以我们下一个最接近的赌注是条件,我想我们可以为"我们的项目"创建命名空间所有分支,比如"我们的工程/某个分支"。然后我们可以设置一个条件,只在"我们的项目/某个分支"one_answers"主"上运行构建,这将限制我们从其他项目分支运行的"假构建"数量:
build:
when:
branch:
- master
- our-project/*
问题是,当我们试图将请求从"我们的项目/"分支拉到"master"时,构建不会运行,我猜是因为它是在不在master或"我们的工程/"中的合并提交上运行的
我的问题有两个方面:1.使用单一存储库模式(多个项目,一个存储库(利用无人机的最佳方式是什么2.如果无人机不支持这种模式,或者不是为它设计的,那么限制"虚假构建"的最佳方法是什么
注意:我们可以在构建开始时检查子文件夹中的更改,如果没有,则返回绿色。这是推荐的方法吗?
现在有多种解决方案可以解决这个问题。
首先,您可以使用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
此外,由于被称为配置插件的无人机插件的新类别,目前正在处理多个扩展:
- docs.drone.io/extensions/conversion
- docs.drone.io/extensions/configuration
任何人都可以使用无人机入门项目创建扩展
- 无人机/锅炉转换
- 无人机/锅炉配置
扩展可以用来覆盖Drone获取yaml的方式,从而允许您动态创建或修改yaml文件。现在有多种扩展可以解决这个问题,您可以使用这些扩展。以下是一些:
- 融水/无人机转换路径
- bitsbeats/drone树配置
- microadam/drone配置变更集条件
有关此问题的更多信息,请参阅问题#1021
我认为这在无人机1.x中应该会更好,因为:
触发器
触发器将修复虚假构建问题,因为如果无人机不满足触发条件,它将不会启动构建。
Muti Machine Builds
一个drone文件现在支持多个管道。例如:
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
每个触发器可以有不同的触发器。
此外,现在可以通过drone cli:在根目录以外的目录中指定drone文件
drone repo set octocat/hello-world config.path .github/.drone.yml
来源:https://github.com/drone/drone/issues/1965.
对于拉请求的基本分支为master
的问题,我认为这是无法解决的。我能想到的解决办法是:
将回购标记为受保护
当成员通过drone cli或UI批准时,这将只允许Pull Request构建,甚至允许分支构建。因此,你可以为PR推送设置一些其他的webhook接收器,它会自动批准这些分支机构在drone上的相应构建,而不批准其他分支机构。
促销
制作一个只在pull请求时触发的具有单个步骤的虚拟管道。
在它完成后,使用一个webhook,甚至这个虚拟管道本身的一个步骤,通过无人机API将这个构建推广到某个特定的目标(环境(,如果它是针对our_project
的一个分支,并且在该目标上有另一个管道触发器的话。
我想Drone强制执行特定的项目布局是因为一个约束:
- 无人机由以下事件触发:推送、拉取请求、标记、部署。所有触发器都是存储库级别的事件
在这种情况下,以下两个约束也是重要的,但不是决定性的:
- 一个存储库、一个
.drone.yml
、一个管道 .drone.yml
必须在项目根目录中
如果您有一个包含多个项目的存储库,无论结构如何,都无法根据正在更新的特定资产触发构建管道。
如果你有大型的多模块项目,并且你不想在每次推送上构建整个项目,最好的办法是重构项目,将每个模块放在自己的存储库中,并配置Drone管道,以根据需要触发依赖项/依赖项的下游/上游构建。