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

标签 yaml gitlab-ci gitlab-8

我正在使用 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

最佳答案

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

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

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

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

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

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

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

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

UPD:由于提到issue已关闭,由于 documentation ,从 GitLab runner 13.0 开始,它支持 doublestar.Glob .

所以现在可以写这样的东西:

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

它将包括工件中名为 binobj 的所有嵌套目录

关于yaml - 如何在 .gitlab-ci.yml 中指定通配符工件子目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38009869/

相关文章:

ssh - GitLab CI 因 SSH 错误加载 key 无效格式而失败

docker - Gitlab在Docker中从6.x迁移到8

performance - GitLab CI 加速

python - 在python中加载带有占位符的文本文件

vagrant - Homestead.yaml *Shell provisioner `args` 必须是字符串或数组

r - Knitr 中的标题

spring - 未知生命周期阶段 ".qualitygate.wait=true"

gitlab - 在 GitLab-CI 中删除分支之前执行脚本

go - Gitlab-CI 运行器 : ignore self-signed certificate

amazon-web-services - 对预签名 S3 URL 的 Lambda HTTP 请求超时