如何在 .gitlab-ci.yml 中指定通配符工件子目录?

Posted

技术标签:

【中文标题】如何在 .gitlab-ci.yml 中指定通配符工件子目录?【英文标题】:How to specify wildcard artifacts subdirectories in .gitlab-ci.yml? 【发布时间】:2016-10-26 20:45:40 【问题描述】:

我正在使用 GitLab CI 构建 C# 解决方案,并尝试将一些构建工件从一个构建阶段传递到另一个构建阶段。

问题是,工件不是位于单个目录中,而是位于不同的子目录中,但是它们都具有相同的名称 bin/obj/

我的.gitlab-ci.yml 如下所示:

...
stages:
  - build
  - test

build:
  stage: build
  script:
    CALL %MSBuild% ...
  artifacts:
    paths:
      - /**/bin/
      - /**/obj/
    expire_in: 6 hrs

test:
  stage: test
  dependencies:
    - build
  ...

我尝试使用不同的方式捕获工件,例如

**/bin/
**/obj/

(无效语法),或

.*/bin/
.*/obj/

但是那个没有发现任何文物,就像/**/bin//**/obj/一样,给我以下错误:

Uploading artifacts...
WARNING: /**/bin/: no matching files
WARNING: /**/obj/: no matching files

如何指定要扫描工件的子目录模式?或者这甚至可能吗?

简单地使用

artifacts:
  untracked: true

不是一个选项,因为有一个巨大的未跟踪 packages/ 子目录,这会导致由于存档太大而导致工件上传失败:

Uploading artifacts...
untracked: found 4513 files                        
ERROR: Uploading artifacts to coordinator... too large archive  id=36 responseStatus=413 Request Entity Too Large token=...
FATAL: Too large

【问题讨论】:

【参考方案1】:

gitlab-ci-multi-runner 构建运行程序是使用 Go 构建的,当前使用 filepath.Glob() 扫描 file_archiver.go 中的任何指定工件。

Go 似乎不支持 SO 的另一个问题 here 中讨论的双星 glob 表达式。所以目前似乎没有办法使用功能齐全的**/bin 表达式

因为我的所有项目都位于解决方案根目录下的同一级别,所以仍然可以使用类似的东西

artifacts:
  paths:
    - "*/bin"
    - "*/obj"

请注意,引号 (") 似乎是必需的,以及末尾的 no 尾随路径分隔符。

还应该可以通过添加更多通配表达式来显式添加更多级别(如here 所述):

paths:
  ...
  - "*/obj"
  - "*/*/bin"
  - "*/*/obj"
  ...

GitLab 正在跟踪此问题 here,并且可能会在未来的版本中得到修复。

【讨论】:

我发现双引号是必须的。 没有斜线!我花了很长时间才自己解决这个问题。我还发现,在以 * 或 %(Windows 批处理文件变量扩展)等字符开头的路径时,我只需要引号。 在 win64 上使用 gitlab-runner 11.11.0,使用 ** 通配工件可以正常工作。 (例如工件:路径:- BuildArtifacts\Cli\**) 您需要使用引号,因为* 是 YAML 中的一个特殊字符,alias。这是您必须引用的list of all the special characters。 “虽然你可以使用双引号,但是对于这些字符使用单引号会更方便,这样可以避免转义任何反斜杠\”。不知道为什么尾随 / 不适用于 glob。好像gitlab不允许,和YAML无关。 @dosentmatter tyvm - 真是头疼。

以上是关于如何在 .gitlab-ci.yml 中指定通配符工件子目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sonar-project.properties 中指定通配符

如何在 HTML5 缓存清单中指定通配符以加载目录中的所有图像?

gitlab-CI中使用tag作为版本号硬编译进程序中

有没有办法在 Ktor 中指定通配符路由?

如何创建一个工件,以便它可以在 .gitlab-ci.yml 中下载

如何排除 gitlab-ci.yml 更改触发作业