1. ホーム
  2. yaml

[解決済み] .gitlab-ci.ymlにワイルドカードで成果物のサブディレクトリを指定する方法とは?

2023-07-07 05:53:09

質問

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 を使って構築され、現在は ファイルパス.Glob() で指定されたアーティファクトをスキャンするために ファイル_archiver.go .

Goは、別の質問で説明したように、二重の星のグロブ表現をサポートしていないようです。 ここで にあるように、Goは二重星型グロブ表現をサポートしていないようです。では を使用する方法はないようです。 **/bin を使う方法は今のところありません。 .

しかし、私のプロジェクトはすべてソリューションルートの下の同じレベルに配置されているので、次のようなものを使用することは可能です。

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

なお,引用符( " ) が必要なようです。 いいえ のパス区切り文字が必要なようです。

また、より多くのグロビング表現を追加することで、より多くのレベルを明示的に追加することが可能であるべきです(説明されているように ここで ):

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

GitLabはこの問題を追跡しています。 ここで で、おそらく将来のバージョンで修正されるでしょう。