在gitlab-ci.yml上动态设置伪影路径/文件夹结构



i具有以下gitlab-ci.yml文件,该文件使用JQ处理器读取package.json以动态设置Artifact文件夹的变量名称,这是

的行
image: node:latest
stages:
 - build
before_script:
    ## steps ignored for purpose of question
    - export NAME_OF_ARTIFACT_FOLDER=$(cat package.json | jq -r .name)"_"$(cat package.json | jq -r .version)".zip"
    - echo $NAME_OF_ARTIFACT_FOLDER ##prints the expected name here eg. myApp_1.0.0.zip
prod_build:
  stage: build
  script:
   - echo $NAME_OF_ARTIFACT_FOLDER ##prints the expected name here eg. myApp_1.0.0.zip
   - yarn run build
  artifacts:
    paths:
    - dist/$NAME_OF_ARTIFACT_FOLDER ## this does not work
    expire_in: 2 hrs

这里的问题是- dist/$NAME_OF_ARTIFACT_FOLDER不起作用,不确定是否在这里缺少某些内容。

编辑

在硬编码预期路径(例如以下内容(时,它可以正常工作,这意味着文件夹名称有效并且确实适当地识别了工件,但在来自$NAME_OF_ARTIFACT_FOLDER

时不起作用
 artifacts:
    paths:
    - dist/myApp_1.0.0.zip ##hardcoding the expected works just fine
    expire_in: 2 hrs

好吧,当前是不可能的。手册说如下:

工件:名称变量可以使用任何预定义变量。

这是您的脚本中没有设置的作业部分的变量。

这是gitlab

上的一个开放问题

无法使用动态变量设置伪影文件名

我有一个项目变量,它在脚本中定义了zip文件的路径,我在artifacts:路径级别重复使用。如果工件:路径实例完全未能分配,则链接的问题会更加明显,但是在我的情况下,它与我的工作中的两行相同的值!

而@jakub kania的摘要

没有错

https://stackoverflow.com/a/49659852/529977这是您的脚本中未设置的变量。

,我必须在@matt Bracewell的帖子

下重新评估自己的评论

https://stackoverflow.com/a/66707954/529977我看不到这将有所帮助,因为它解决了工件:名称,但没有伪像:路径。您在https://docs.gitlab.com/ee/ci/variables/where_variables_can_be_used.html

中仍然无法动态使用路径。

~~ 无证件的部分说: __ ~~

您可以使用工件中的任何变量:在作业级别可用的路径

即。

  prod_build:
+   variables:
+      NAME_OF_ARTIFACT: "myApp_*.zip"
    stage: build
    script:
     - echo $NAME_OF_ARTIFACT
     - yarn run build
    artifacts:
      paths:
      - dist/$NAME_OF_ARTIFACT
      expire_in: 2 hrs

这确实是由于伪像中所要求的文件而无法使用动态变量设置的,即使他们不要求paths,但names

generate for myself:
  script:
    - mkdir build
    - |
      cat > build/artifact1$$.txt <<EOF
      Hello World! ${CI_PROJECT_ID} ${CI_PIPELINE_IID}
      EOF
    - export MY_VAR_FILE_NAME=artifact1$$
    - echo "MY_VAR_FILE_NAME=${MY_VAR_FILE_NAME}" >> generate.env
    - |
      cat > build/artifact2$$.txt <<EOF
      The end is near! ${CI_PROJECT_ID} ${CI_PIPELINE_IID}
      EOF
    - export MY_VAR_FILE2_NAME=artifact2$$
    - echo "MY_VAR_FILE2_NAME=${MY_VAR_FILE2_NAME}" >> generate.env
    - |
      cat > build/ci${CI_PIPELINE_IID}.txt <<EOF
      Happy to hear you! ${CI_PROJECT_ID} ${CI_PIPELINE_IID}
      EOF
  artifacts:
    reports:
      # using the https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportsdotenv 
      # does NOT do the trick to fill a job variable before artifact:paths is evaluated!
      dotenv: generate.env
    paths: 
      - build/ci${CI_PIPELINE_IID}.txt # WORKS!
      - build/$MY_VAR_FILE_NAME.txt    # doen't work
      - build/$MY_VAR_FILE2_NAME.txt   # doen't work

⚠️未知变量扩展到空,build/$MY_VAR_FILE_NAME.txt变为 build/,即构建文件夹中的所有文件都是工件 - 在管道中提到的 WARNING: build/.txt: no matching files. Ensure that the artifact path is relative to the working directory resp。意外的build/: found 4 matching files and directories

作为解决方法 - 但是,是的,这很丑陋 - 您可以通过使用通配符来做到这一点(但我认为您有充分的理由不这样做(

prod_build
  artifacts:
    paths:
      - dist/*.zip

或分成两个作业

generate before save:
  script:
    - mkdir build
    - |
      cat > build/artifact1$$.txt <<EOF
      Hello World! ${CI_PROJECT_ID} ${CI_PIPELINE_IID}
      EOF
    - export MY_VAR_FILE_NAME=artifact1$$
    - echo "MY_VAR_FILE_NAME=${MY_VAR_FILE_NAME}" >> generate.env
    - |
      cat > build/artifact2$$.txt <<EOF
      The end is near! ${CI_PROJECT_ID} ${CI_PIPELINE_IID}
      EOF
    - export MY_VAR_FILE2_NAME=artifact2$$
    - echo "MY_VAR_FILE2_NAME=${MY_VAR_FILE2_NAME}" >> generate.env
  artifacts:
    reports:
      # using the https://docs.gitlab.com/ee/ci/yaml/artifacts_reports.html#artifactsreportsdotenv trick to fill a job variable for downstream of successor job
      dotenv: generate.env
    paths: 
      - build/*.txt
save artifacts:
  variables:
    MY_VAR_FILE_NAME: #filled by dotenv
    MY_VAR_FILE2_NAME: #filled by dotenv
  needs:
    - generate before save
  script:
    - find build/
    - echo "expecting … "
    - echo "- $MY_VAR_FILE_NAME"
    - echo "- $MY_VAR_FILE2_NAME"
  artifacts:
    paths: 
      - build/$MY_VAR_FILE_NAME.txt    # WORKS
      - build/$MY_VAR_FILE2_NAME.txt   # WORKS

即。在您的情况下:

image: node:latest
stages:
 - build
pre_prod_build:
  stage: build
  script:
    ## steps ignored for purpose of question
    - export NAME_OF_ARTIFACT_FOLDER=$(cat package.json | jq -r .name)"_"$(cat package.json | jq -r .version)".zip"
    - echo $NAME_OF_ARTIFACT_FOLDER ##prints the expected name here eg. myApp_1.0.0.zip
    - echo "NAME_OF_ARTIFACT_FOLDER=${NAME_OF_ARTIFACT_FOLDER}" >> artifact_name.dotenv
  artifacts:
    reports:
      dotenv: artifact_name.dotenv
prod_build:
  stage: build
  variables:
    NAME_OF_ARTIFACT_FOLDER: # set by pre_prod_build dotenv
  needs:
    - job: pre_prod_build
  script:
   - echo $NAME_OF_ARTIFACT_FOLDER ##prints the expected name here eg. myApp_1.0.0.zip
   - yarn run build
  artifacts:
    paths:
    - dist/$NAME_OF_ARTIFACT_FOLDER ## NOW IT WORKS
    expire_in: 2 hrs

最新更新