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)
虽然@Jakub Kania 的总结并没有那么错误
\n\n\n/sf/answers/3476189671/ \n即可以使用作业脚本部分中设置的变量。
\n
我必须在@Matt Bracewell 的帖子下修改我自己的评论
\n\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您可以使用在工件级别中可用的任何变量:路径
\nIE
\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\nRun Code Online (Sandbox Code Playgroud)\n这确实是工件文件名无法使用动态变量设置中所要求的结果,即使他们没有要求,paths但names
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\nRun 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
作为一种解决方法 - 但是的,它很难看 - 您可以通过使用通配符来实现这一点(但我认为您有充分的理由不这样做)
\nprod_build\n artifacts:\n paths:\n - dist/*.zip\nRun Code Online (Sandbox Code Playgroud)\n或者分成两份工作
\ngenerate 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\nRun Code Online (Sandbox Code Playgroud)\n即在你的情况下:
\nimage: 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\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
7153 次 |
| 最近记录: |