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