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

2024-03-19

我有以下内容gitlab-ci.yml读取的文件package.json使用jq https://stedolan.github.io/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

这里的问题是- dist/$NAME_OF_ARTIFACT_FOLDER不起作用,不确定这里是否遗漏了一些东西。

EDIT

在对如下所示的预期路径进行硬编码后,它工作正常,这意味着文件夹名称是有效的,并且工件确实被正确识别,但来自以下位置时不起作用$NAME_OF_ARTIFACT_FOLDER

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

虽然@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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 查找权重仅为 1 和 2 的生成树的算法

    给定一个带权 连通 简单无向图 G 每条边的权重仅为 1 和 2 求 G 在 O V E 中的 MST 有任何想法吗 很抱歉问题的措辞 我尽力翻译它 In Prim 算法 http en wikipedia org wiki Prim 27
  • 在 require.js AMD 中添加 Mustache Temple 到 require

    在 js 中 您可以在定义模块时在 require 部分加载 html 模板 例如 模板文件 test html 在模块中 define template test function rest of code 但这会在获取文件名附加的文件时
  • python 打印一行相同的空格

    我需要在同一个地方打印 确定 有什么办法可以做到吗 我找到了解决方案 但它们不能正确地与 IDLE 配合使用 while count lt 9 if statusm
  • phpmyadmin 和外键

    我向我的字段之一添加了外键约束 插入时 该字段显示为下拉菜单而不是预期的文本框 但下拉菜单中的每个值都会列出两次 一次在值之前有一个减号 一次在值之后有一个减号 像这样 value1 value2 value3 value1 value2
  • 如何将 .pb 转换为 TFLite 格式?

    我下载了一个retrained graph pb and retrained labels txt我在 Azure 认知服务中训练的模型的文件 现在我想使用该模型制作一个 Android 应用程序 为此我必须将其转换为 TFLite 格式
  • 在渲染服务器端之前获取数据

    现在我正在发现Este js我对同构应用程序有一个小问题 我不明白如何在使用 renderToString 渲染服务器端之前进行 api 调用 一种解决方案是使用 React Router 在路由器级别获取所有数据 根据顶层路由 我可以预测
  • 在 MatSnackBar 中使用“snackBar.openFromComponent()”方法时如何放置操作按钮?

    我使用 MatSnackBar 进行通知 并且希望在小吃栏中有一个操作按钮 使用时如何插入 snackBar openFromComponent method Here is my code https stackblitz com edi
  • Facebook API 用于读取已添加书签的项目

    Facebook 最近添加了一项新功能 允许为有趣的链接添加书签以供以后阅读 保存的链接可在 保存 选项卡中找到 是否有任何 Facebook API 例如 Graph API 用于检索这些保存的项目 用于访问 Facebook 已保存链接
  • 如何进行全局字符串替换而不需要转义所有内容?

    我想用另一个字符串替换字符串中出现的所有模式 例如 让我们将所有 转换为 gt 纯 string replace 仅替换第一个匹配项 replace gives 正则表达式迫使我转义为特殊字符 replace g Pattern is no
  • 如何格式化 Multimarkdown 表格?

    我正在按照以下表格部分下的指南编写 Multimarkdown 表格语法指南 http fletcherpenney net multimarkdown users guide multimarkdown syntax guide 我希望使
  • 将根据数量复制记录的查询

    我正在使用 SQL Server 2008 并寻找一个将根据数量复制记录的查询 表具有 QTY 和 PartNumber 列 需要为每个数量添加一条附加记录 假设零件编号的数量为 3 我需要包含该零件编号的三行 任何帮助将不胜感激 谢谢 测
  • 如何删除注册表中损坏的符号链接

    我正在对注册表进行一些编辑原型 以创建从一个区域到另一个区域的符号链接 我使用了以下代码 HKEY hkFS HKEY hkSOFTWARE DWORD dwDisposition LSTATUS result result RegOpen
  • 比较函数指针

    如何比较 C 中的函数指针 稳定吗 例如 这样的事情是否有效 if pFnc myFnc Do something C 03 5 10 1 expr eq 等于 和 不等于 运算符具有相同的作用 语义限制 转换和结果类型作为关系 运算符 但
  • postgresSQL中NOT IN和NOT EXISTS的区别

    Here s my table 当我使用 NOT IN 执行以下查询时 它给出了 namal 和 Ann SELECT firstname FROM info student info WHERE firstname NOT IN SELE
  • ClickOnce 或 InstallShield 能否安装 SQL Server 或 SQL Server Express?

    可以 ClickOnce 或 InstallShield 设置或配置 SQL Server 或 SQL Server Express 专门添加sa密码 启用命名管道 授予从文件夹读取的权限 添加主数据库 mdf我的客户端应用程序所需的文件
  • Swift SpriteKit SKSpriteNode 的“有时”不出现

    我正在使用 Swift 和 SpriteKit 制作 iOS 但是 我的应用程序运行时遇到不规则现象 有时船舶 SKSpriteNodes 不会出现在屏幕上 有时子弹的 SKSpriteNodes 不会出现 有时一切都显示良好 我将子弹添加
  • AlertDialog 中的资源 ID #0x0

    我添加一个AlertDialog在 kotlin 文件中 但出现异常 btnLogin setOnClickListener view gt login fun login val builder AlertDialog Builder t
  • 如何对整数字符串进行排序?

    我在对具有整数值的字符串列表进行排序时遇到一个奇怪的问题 然而 某些值可以以某些字符作为前缀 e g B1 5 50 A10 7 72 B3 A1 A2 基本上有页码 应该按如下方式排序 A1 A2 A10 B1 B3 5 7 50 72
  • 我们可以让聊天机器人先说问候语,而不仅仅是作为反应吗

    我正在使用 Microsoftt Bot Framework 和 LUIS 认知服务开发聊天机器人 我想要一条初始欢迎消息 例如 你好 用户 你好吗 我的机器人一启动 在 MessageController 中可以做任何事情 public
  • 在 gitlab-ci.yml 上动态设置工件路径/文件夹结构

    我有以下内容gitlab ci yml读取的文件package json使用jq https stedolan github io jq 处理器动态设置工件文件夹的变量名称 类似于 image node latest stages buil