使用 "Drone Conditions" 运行存储库的构建部分



我们的项目嵌套在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管道,以根据需要触发依赖项/依赖项的下游/上游构建。

相关内容

  • 没有找到相关文章

最新更新