虽然@Jakub Kania 的总结并没有那么错误
https://stackoverflow.com/a/49659852/529977 https://stackoverflow.com/a/49659852/529977也就是说,您的脚本部分中设置的变量没有可以使用。
我必须在@Matt Bracewell 的帖子下重定向我自己的评论
https://stackoverflow.com/a/66707954/529977 https://stackoverflow.com/a/66707954/529977我认为这不会有任何帮助,因为它解决了 artifacts:name 但没有解决 artifacts:paths 。正如您所看到的,路径仍然不能动态使用https://docs.gitlab.com/ee/ci/variables/where_variables_can_be_used.html https://docs.gitlab.com/ee/ci/variables/where_variables_can_be_used.html
~~无证部分说:__~~
您可以在工件中使用任何变量:在作业级别可用的路径
i.e.
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
这确实是所要求的结果工件文件名无法使用动态变量设置 https://gitlab.com/gitlab-org/gitlab-runner/-/issues/1664即使他们不要求paths
but 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
分别。意外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