使用“Drone Conditions”运行构建存储库的一部分

时间:2016-02-29 17:54:15

标签: drone drone.io

我们的项目嵌套在单一存储库中。想象一下,我们在“projects”文件夹中有一个项目。例如“projects / our-project”。好吧,我们希望能够将我们的.drone.yml检查到“我们的项目”中,但看起来Drone想要项目根目录下的配置文件,没关系,我们可以通过更改“命令“我们构建的部分。我们遇到的麻烦是我们只想在“我们的项目”中的某些内容发生变化时运行构建。我无法找到一种方法与Drone精确地做到这一点,所以我们下一个最接近的赌注是conditions,我想我们可以命名为“我的项目”的命名空间,就像这个“我的项目/某个分支” 。然后我们可以设置一个条件,只在“我的项目/某个分支”和“主”上运行构建,这将限制我们从其他项目分支运行的“假构建”的数量:

build:
  when:
    branch:
      - master
      - our-project/*

问题是当我们尝试将请求从“my-project / ”分支拉到“master”时,构建将无法运行,我猜测因为它是在合并提交上运行的,因为它不是'在主人或“我们的项目/

我的问题有两个:   1.使用单声道存储库模式(多个项目,一个存储库)利用无人机的最佳方法是什么?   2.如果无人机不支持该模式或不是为此设计的,那么限制“虚假构建”的最佳解决办法是什么

注意:我们可以在构建开始时检查子文件夹中的更改,如果没有,则返回绿色。我这是推荐的方法吗?

3 个答案:

答案 0 :(得分:0)

我猜Drone强制执行特定的项目布局,因为有一个约束:

  • 无人机由以下事件触发:推送,拉取请求,标记,部署。所有触发器都是存储库级事件。

以下两个约束也很重要,但在这种情况下不是决定因素:

  • 一个存储库,一个.drone.yml,一个管道
  • .drone.yml必须位于项目根目录

如果您有一个包含多个项目的存储库,则无论结构如何,您都无法根据要更新的特定资产触发构建管道。

如果您有大型多模块项目并且您不想在每次推送时构建整个项目,那么最好的做法是重构项目,将每个模块放在自己的存储库中,并配置Drone管道以触发下游/ upstream根据需要构建依赖项/依赖项。

答案 1 :(得分:0)

由于以下原因,我认为在Drone 1.x中应该会更好一些:

Triggers

触发器将修复假的构建问题,因为如果不满足触发条件,则无人机将无法启动构建。

Muti Machine Builds

一个无人机文件中现在支持多个管道。例如:

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接收器,这些接收器会自动批准这些分支机构在无人机上的对应版本,而对其他分支机构则不批准。

Promotions

通过一个仅在请求请求时触发的步骤来创建虚拟管道。

在完成后,如果需要使用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