8

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

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

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

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

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

4

3 回答 3

1

这个问题现在有多种解决方案。

首先,您可以使用退出 (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

于 2020-10-14T13:11:29.210 回答
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 接收器,以自动批准这些分支在无人机上的相应构建,并拒绝其他分支。

促销活动

使用仅在拉取请求时触发的单个步骤创建一个虚拟管道。

完成后,使用 webhook 甚至在这个虚拟管道本身中的一个步骤,通过无人机 API 将这个构建提升到某个特定目标(环境),如果它是用于该目标的一个分支our_project并且在该目标上有另一个管道触发器。

于 2019-08-10T12:26:33.240 回答
-1

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

  • Drone 由以下事件触发:push、pull request、tag、deployment。所有触发器都是存储库级别的事件。

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

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

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

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

于 2017-06-14T15:28:43.523 回答