我正在使用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
答案 0 :(得分:61)
gitlab-ci-multi-runner构建运行器使用Go构建,目前使用filepath.Glob()扫描file_archiver.go中的任何指定工件。
Go似乎不支持双星球形表达式,正如在SO的另一个问题here中所讨论的那样。所以目前似乎没有办法使用功能齐全的**/bin
表达。
因为然而我的所有项目都位于解决方案根目录下的同一级别,所以仍然可以使用类似
的内容artifacts:
paths:
- "*/bin"
- "*/obj"
请注意,似乎需要引号("
),以及最后的否结尾路径分隔符。
还应该可以通过添加更多的globbing表达式来显式添加更多级别(如here所述):
paths:
...
- "*/obj"
- "*/*/bin"
- "*/*/obj"
...