82

我正在使用 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/and一样/**/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
4

1 回答 1

100

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

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

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

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

请注意,引号 ( ") 似乎是必需的,并且末尾没有尾随路径分隔符。

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

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

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

于 2016-06-27T13:50:07.053 回答