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

Jay*_*aya 10 gitlab gitlab-ci gitlab-ci-runner

我有以下gitlab-ci.yml文件,它读取package.json使用jq处理器动态设置工件文件夹的变量名称,类似于

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
Run Code Online (Sandbox Code Playgroud)

这里的问题是- 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
Run Code Online (Sandbox Code Playgroud)

chi*_*.de 5

虽然@Jakub Kania 的总结并没有那么错误

\n
\n

/sf/answers/3476189671/ \n即可以使用作业脚本部分中设置的变量。

\n
\n

我必须在@Matt Bracewell 的帖子下修改我自己的评论

\n
\n

/sf/answers/4669556811/ \n我认为这不会有任何帮助,因为它解决了 artifacts:name 但没有解决 artifacts:paths 。正如您在https://docs.gitlab.com/ee/ci/variables/where_variables_can_be_used.html中看到的,路径仍然不能动态使用

\n
\n

~~未记录的部分说: __~~

\n

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

\n

IE

\n
  prod_build:\n+   variables:\n+      NAME_OF_ARTIFACT: "myApp_*.zip"\n    stage: build\n    script:\n     - echo $NAME_OF_ARTIFACT\n     - yarn run build\n    artifacts:\n      paths:\n      - dist/$NAME_OF_ARTIFACT\n      expire_in: 2 hrs\n
Run Code Online (Sandbox Code Playgroud)\n

这确实是工件文件名无法使用动态变量设置中所要求的结果,即使他们没有要求,pathsnames

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

\xe2\x9a\xa0\xef\xb8\x8f 未知变量扩展为空并build/$MY_VAR_FILE_NAME.txt变为build/即构建文件夹中的所有文件都是工件 - 在管道输出中提到WARNING: build/.txt: no matching files. Ensure that the artifact path is relative to the working directory 。意外build/: found 4 matching files and directories

\n

作为一种解决方法 - 但是的,它很难看 - 您可以通过使用通配符来实现这一点(但我认为您有充分的理由不这样做)

\n
prod_build\n  artifacts:\n    paths:\n      - dist/*.zip\n
Run Code Online (Sandbox Code Playgroud)\n

或者分成两份工作

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

即在你的情况下:

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


Jak*_*nia 3

嗯,目前这是不可能的。手册说如下:

artifacts:name 变量可以使用任何预定义的变量。

也就是说,您的脚本部分中设置的变量没有可以使用。

  • 我的问题是关于工件路径而不是名称。我很困惑 (3认同)