Gitlab CI/CD 在管道之间传递工件/变量

2023-12-27

tl;dr

我如何传递数据,例如这$BUILD_VERSION变量,Gitlab CI 中不同管道中的作业之间?

所以(就我而言):

Pipeline 1 on push ect.            Pipeline 2 after merge

    `building` job ...                `deploying` job
          │                                ▲
          └─────── $BUILD_VERSION ─────────┘

背景

考虑以下示例(完整yml below):

building:
    stage: staging
    # only on merge requests
    rules:
        # execute when a merge request is open
        - if: $CI_PIPELINE_SOURCE == "merge_request_event"
          when: always
        - when: never
    script:
        - echo "BUILD_VERSION=1.2.3" > build.env
    artifacts:
        reports:
            dotenv: build.env

deploying:
    stage: deploy
    # after merge request is merged
    rules:
        # execute when a branch was merged to staging
        - if: $CI_COMMIT_BRANCH == $STAGING_BRANCH
          when: always
        - when: never
    dependencies: 
        - building
    script:
        - echo $BUILD_VERSION

我有两个阶段,staging and deploy. The building job in staging构建应用程序并创建一个“审核应用程序”(为了简单起见,没有单独的构建阶段)。这deploying job in deploy然后上传新的应用程序。

管道包含building每当打开合并请求时作业就会运行。这样,应用程序就构建完成了,开发人员可以单击合并请求中的“审核应用程序”图标。这deploying作业在合并请求合并后立即运行。这个想法如下:

                      *staging* stage (pipeline 1)        *deploy* stage (pipeline 2)

<open merge request> -> `building` job (and show)   ...   <merge> -> `deploying` job
                             │                                            ▲
                             └───────────── $BUILD_VERSION ───────────────┘

对我来说问题是staging/building创建一些数据,例如A$BUILD_VERSION。我想要这个$BUILD_VERSION in the deploy/deploying,例如用于通过 Gitlab API 创建新版本。

所以我的问题是:我如何通过$BUILD_VERSION(和其他数据)来自staging/building to deploy/deploying?


到目前为止我尝试过的

artifacts.reports.dotenv

所描述的情况在 gitlab 文档中处理得更少将环境变量传递给另一个作业 https://docs.gitlab.com/ee/ci/variables/#pass-an-environment-variable-to-another-job。还有yml下面显示的文件深受此示例的启发。尽管如此,它仍然不起作用。

The build.env工件创建于building,但每当deploying作业执行后,build.env文件被删除,如下第 15 行所示:“删除 build.env”。我尝试添加build.env to the .gitignore但它仍然被删除。

经过几个小时的搜索我发现这个gitlab问题评论 https://gitlab.com/gitlab-org/gitlab/-/issues/246777#note_417210007 and 这个 stackoverflow 帖子 https://stackoverflow.com/a/65878853/5934316认为artifacts.reports.dotenv不适用于dependencies or the needs关键词。

去除dependencies不起作用。使用needs只是也不起作用。不允许同时使用两者。

有谁知道如何让它发挥作用?我觉得这就是它应该发挥的作用。

将工件作为文件获取

stackoverflow 帖子的这个答案Gitlab ci cd 删除合并请求的工件 https://stackoverflow.com/a/65878853/5934316建议使用build.env作为普通文件。我也尝试过这个。 (相关)yml如下:

building:
    # ...
    artifacts:
        paths:
            - build.env

deploying:
    # ...
    before_script:
        - source build.env

结果与上面相同。这build.env被删除。然后source build.env命令失败,因为build.env不存在。 (没关系,如果build.env在里面.gitignore或没有,都测试过)

从 API 获取工件

我还找到了 stackoverflow 帖子的答案在 GitLab CI 中使用合并请求作业中的工件 https://stackoverflow.com/a/66344557/5934316建议将该 API 与$CI_JOB_TOKEN。但由于我需要非合并请求管道中的工件,因此我无法使用建议的CI_MERGE_REQUEST_REF_PATH.

我尝试使用$CI_COMMIT_REF_NAME。 (重要部分)yml那么就是:

deploying:
    # ...
    script:
        - url=$CI_API_V4_URL/projects/jobs/artifacts/$CI_COMMIT_REF_NAME/download?job=building
        - echo "Downloading $url"
        - 'curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --output $url'
        # ...

但 API 请求被拒绝并显示“404 Not Found”。自从不支持提交 SHA https://docs.gitlab.com/ee/api/job_artifacts.html#download-a-single-artifact-file-from-specific-tag-or-branch, $CI_COMMIT_BEFORE_SHA or $CI_COMMIT_SHA也不工作。

Using needs

Update: 我找到这个版块了同一项目中管道之间的工件下载 https://docs.gitlab.com/ee/ci/yaml/#artifact-downloads-between-pipelines-in-the-same-project在 gitlab 文档中,这正是我想要的。但是:我无法让它工作。

The yml从文档中进行更少的复制后,看起来如下所示:

building:
    # ...
    artifacts:
        paths:
            - version
        expire_in: never

deploying:
    # ...
    needs:
        - project: $CI_PROJECT_PATH
          job: building
          ref: staging # building runs on staging branch, main doesn't work either
          artifacts: true

Now the deploying作业立即失败,我收到以下错误横幅:

我尝试设置artifacts.expire_in = never(如图所示)但我仍然遇到同样的错误。也在Settings > CI/CD > 文物选择“保留最近成功作业的工件”。所以神器应该存在。我在这里错过了什么?根据文档,这应该有效!


我希望有人能帮助我获得$BUILD_VERSION to the deploying工作。如果除了我尝试过的方法之外还有其他方法,我很高兴听到它们。提前致谢。


这个例子.gitlab-ci.yml:

stages:
    - staging
    - deploy

building:
    tags: 
        - docker
    image: bash
    stage: staging
    rules:
        - if: ($CI_PIPELINE_SOURCE == "merge_request_event") && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "staging"
          when: always
        - when: never
    script:
        - echo "BUILD_VERSION=1.2.3" > build.env
    artifacts:
        reports:
            dotenv: build.env
    environment:
        name: Example
        url: https://example.com

deploying:
    tags: 
        - docker
    image: bash
    stage: deploy
    rules:
        - if: $CI_COMMIT_BRANCH == "staging"
          when: always
        - when: never
    dependencies:
        - building
    script:
        echo $BUILD_VERSION

根据 Gitlab 文档,应该可以通过 URL 下载任何作业的工件(如果它尚未过期)。

此外,您还可以使用 Gitlab API 从其他项目下载(未过期的)工件;您可以使用 Gitlab API 来标记作业的工件以保留无论过期策略,或删除工件。

但我自己还没有尝试过。

对于您的情况,假设“构建”和“部署”作业都在main分支,你有望像这样传递工件。

如果您有其他方法可以在deploying工作是什么 分支机构名称 Xbuilding作业继续运行,然后您可以从分支 X 下载工件,而不是总是从main就像我下面做的那样。

# Assuming
# domain: example.com
# namespace: mygroup
# project: myproject

building:
    # on latest commit on `main`, because we need a predictable
    # branch name to save/retrieve the artifact.
    stage: staging
    script:
        - echo "BUILD_VERSION=1.2.3" > build.env
    artifacts:
        # 'paths', not 'reports'
        paths:
            - build.env

deploying:
    # after merge request is merged
    stage: deploy
    dependencies: 
        - building
    script:
        # could use ${CI_PROJECT_URL} to get https://example.com/mygroup/myproj
        - curl https://${CI_SERVER_HOST}/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}/-/jobs/artifacts/main/raw/build.env?job=building > build.env
        - source build.env
        - echo $BUILD_VERSION  # should print '1.2.3'.

文档的相关部分,包含链接和摘录:

通过 URL 访问分支或标签的最新作业工件 https://docs.gitlab.com/ee/ci/pipelines/job_artifacts.html#access-the-latest-job-artifacts-by-url

要浏览或下载分支的最新工件,请使用这两个 URL 之一。 [我觉得/file/变体用于 Gitlab Pages 工件,但我不确定。 ——埃斯蒂斯]

  • 浏览文物:
    https://example.com/<namespace>/<project>/-/jobs/artifacts/<ref>/browse?job=<job_name>
  • 下载所有工件的 zip:
    https://example.com/<namespace>/<project>/-/jobs/artifacts/<ref>/download?job=<job_name>
  • 下载一个工件文件:
    https://example.com/<namespace>/<project>/-/jobs/artifacts/<ref>/raw/<path/to/file>?job=<job_name>
  • 下载一个工件文件(与 Gitlab Pages 相关?):
    https://example.com/<namespace>/<project>/-/jobs/artifacts/<ref>/file/<path>?job=<job_name>

例如,要下载带有域的工件gitlab.com, 命名空间gitlab-org, 项目gitlab, 最新提交main分行、工作coverage, 文件路径review/index.html: https://gitlab.com/gitlab-org/gitlab/-/jobs/artifacts/main/raw/review/index.html?job=coverage https://gitlab.com/gitlab-org/gitlab/-/jobs/artifacts/main/raw/review/index.html?job=coverage

配置设置:保留每个分支最近成功作业的工件 https://docs.gitlab.com/ee/ci/pipelines/job_artifacts.html#keep-artifacts-from-most-recent-successful-jobs

  • 该选项默认开启
  • AFAICT https://gitlab.com/gitlab-org/gitlab/-/issues/16267 it keeps the most recent artifact for
    • 每个活动分支或标签(又名“ref”);
    • 如果在该引用上运行多个管道,则最后一个管道的工件将覆盖较早管道生成的工件。
  • 所有其他工件仍受expire_in设置在.gitlab-ci.yml产生了它们。

用于工作工件的 Gitlab API https://docs.gitlab.com/ee/api/job_artifacts.html

使用 Gitlab API 的优点是,如果您可以获得正确的令牌,您还可以从其他项目下载工件。如果您的脚本在 Gitlab CI 中运行,您将需要数字项目 ID,即 $CI_PROJECT_ID。

要下载工件存档:

  • curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/${CI_PROJECT_ID}/jobs/artifacts/main/download?job=test"

要下载单个工件文件:

  • curl --location --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/${CI_PROJECT_ID}/jobs/artifacts/main/raw/some/release/file.pdf?job=pdf"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gitlab CI/CD 在管道之间传递工件/变量 的相关文章

  • Gitlab CI - 不支持:外部构建目录

    我在保存工件时遇到问题 该项目分为3个模块 其中一个已保存 另外两个不保存 克隆项目 克隆到 home gitlab runner builds Gso uWvA 0 www project infoserwis project root
  • 将 Gitlab CI 阶段配置为不并行运行

    我有一个具有多个阶段的 Gitlab CI 管道 默认情况下 两个作业之间的同一阶段将并行运行 我所经历的阶段之一是集成测试阶段 该阶段一次只能有一个正在运行的实例 因为它依赖于正在设置和拆除的特定资源 有没有一种简单的方法来指定某个阶段应
  • 无法从 Gitlab CI 访问私有 MySQL Docker 映像

    我一直在尝试将私有 自定义 MySQL 映像从我的 Docker Hub 存储库拉入 gitlab ci yml 管道作为服务 我添加了一个 before script 尝试使用我的用户名和密码 CI 变量 登录 dockerhub 失败的
  • 被拒绝:将映像推送到 gitlab 注册表时,请求的资源访问被拒绝

    我正在尝试将图像推送到 gitlab 注册表 我已经做过很多次了 所以我想知道为什么会出现这个错误 我使用最新标签构建图像 Successfully tagged registry gitlab com mycompany rgpd api
  • 自动将所有 GitHub 存储库镜像到 gitlab

    对于 GitLab 必须手动为每个存储库设置拉 推镜像 我想知道那里有any way可以自动将所有 Github 存储库同步到 GitLab 这样 当您在 GitHub 中创建新的存储库时 GitLab 中的存储库将自动创建 并充当拉取镜像
  • gitlab-ci 的缓存虚拟环境

    我使用 Gitlab CI 脚本缓存了 Pip 包 所以这不是问题 现在我还想赶上Conda虚拟环境 因为它减少了设置环境的时间 我缓存了一个虚拟环境 不幸的是 最后需要很长时间才能缓存所有 venv 文件 我尝试仅缓存 CI PROJEC
  • gitlab:带有大型存储库的 git clone https 失败

    当尝试通过 https 克隆大型存储库 700MB 时 git 失败并显示 c git projects gt git clone https git mycompany de fs git Cloning into fs Username
  • 指纹已经被gitlab采集了

    我格式化了我的 Windows 7 笔记本电脑 并尝试让 git 设置再次工作 我安装了 git 和源代码树应用程序 我从 gitlab 删除了 SSH 密钥并使用重新生成了密钥ssh keygen 但是当我尝试在 gitlab 添加 SS
  • Jenkins 和 Gitlab 不获取代码

    当我设置自己的项目时 我遇到了问题 我开始配置我的 Jenkins 作业 我这样做了 在 Jenkins 上为 gitlab 用户帐户创建凭证 在 gitlab 上创建访问令牌并在 Jenkins 中使用此令牌来启用它 and this i
  • 如何从 GitLab CI 将构建发布到 Artifactory?

    我正在寻找一种简单干净的方法来将使用 GitLab CI 构建的工件发布到 Artifactory 上 我能够发现https gitlab com gitlab org omnibus blob af8af9552966348a15dc1b
  • 由于未经授权的错误,无法使用 dotnet CLI 将 nuGet 包推送到 GitLab

    GitLab 现在支持 nuget 公共和私有 feed 存储库 我有一个公共项目 例如 https gitlab com sunnyatticsoftware sasw test support https gitlab com sunn
  • Gitlab-runner 更改 builds_dir

    我在生产服务器上的默认 builds dir 是 root builds qL8eZYTH 0 faramarzqoshchi testing gitlab runner 我希望它是这样的 home domain name public h
  • GitLab 是否通过 git-annex 或其他方式支持大文件?

    我运行一个 GitLab 实例 并希望允许我的用户上传几乎任何大小的文件 众所周知 git 在处理大文件方面仍然存在问题 我知道通过将文件存储在其他地方并仅对元数据进行版本控制来规避此问题的方法 例如git annex git media
  • 将更改推送到 Cloud Foundry 时出错

    从我的本地主机 我连接到 blue mix cf api https api ng bluemix net 我登录然后用以下命令推送更改 cf push 然而 在控制台中 Uploading MY PROJECT Uploading app
  • GitLab API 如何获取最后一次提交?日志树?

    GitLab API 如何获取最后一次提交 GET projects id repository tree name assets type tree mode 040000 id 6229c43a7e16fcc7e95f923f8ddad
  • Gitlab-CI:有条件的allow_failure

    我最近开始为我的代码实现自动测试 我注意到 CI 没有捕获编译器的警告 即使有警告 测试也显示为成功 我最初为编译器添加了一个标志 将警告转化为错误allow failure True 但问题是编译器在第一个警告 gt 错误时停止 并没有完
  • 在 gitlab 中创建一个 wiki 页面

    我正在尝试在 gitlab 上创建一个简单的 wiki 页面 有人知道有什么好的教程可以帮助我实现这一目标吗 我尝试在谷歌上搜索任何教程 但找不到任何相关的教程 您可以使用http pad haroopress com http pad h
  • Gitlab Ci 无法从运行器推送分支

    我正在尝试使用 Gitlab 设置 CI CD 管道 这是我想做的 注意 这是一个打字稿项目 单元测试和集成测试 促进分支开发到分支集成 从分支集成构建 docker 镜像 部署到集成环境 这里是 gitlab ci yml我正在使用 我
  • Gitlab ci - 工件应用程序 jar 中的差异

    我的泊坞窗文件 FROM openjdk 8u201 jdk alpine3 9 ADD target app snapshot 0 0 1 jar 在 gitlab ci runner 中 maven 构建过程中 maven image
  • gitlab ci缓存没有匹配的文件

    我尝试使用 gitlab runner 构建 apk 当我构建 apk 时 我不想每次都下载所有构建包 所以我尝试缓存 gradle caches 和 gradle wrappers 以下是我的 gitlab ci yml sdk buil

随机推荐

  • 天/小时/分钟/秒的快速倒计时器标签

    我正在创建一个倒计时器 倒计时到NSDate设置在一个UIDatePicker 我有一个标签 显示我们正在倒计时的日期 效果很好 我还想添加的是当天剩余天数和当天剩余小时 分钟 秒数的标签 即永远不会超过 23 59 59 这是我目前所做的
  • Firefox 无法解压 gzip 文件

    我有 gz 文件存储在 AWS s3 上 使用 s3 REST API 我生成指向各个文件的经过身份验证的链接 我还设置了内容标头选项 以便请求这些 URL 的浏览器将解压缩并下载 gzip 压缩的文件作为附件 生成的 s3 url 如下所
  • 使用 Matplotlib 在半对数刻度上拟合直线

    我一直在努力在用 Matplotlib 和 Python 3 制作的半对数图上拟合直线 我见过很多双对数比例尺数字的例子 但我尝试过的解决方案都不起作用 使用numpy 线最终总会在某个地方弯曲 以下是我迄今为止所掌握的 import os
  • Git 将功能分支中的单个文件重置为与 master/main 中的相同[重复]

    这个问题在这里已经有答案了 我正在尝试恢复我的更改单个文件在我的功能分支中 我希望该文件与 master main 中的文件相同 I tried git checkout filename git checkout filename git
  • Postman在新版本中删除了离线模式(Scratch Pad),有办法启用吗?

    Postman 删除了离线模式 Scratch Pad https learning postman com docs getting started basics using scratch pad https learning post
  • 使用 ALAsset 来自 GRKPhoto 的 UIImage

    我在用着grabKit https github com pierrotsmnrd grabKit为了允许用户将他们的 Instagram Facebook 和本地图片导入到我的应用程序中 当照片是本地时就会出现问题 在本例中 我使用了一种
  • elasticsearch 使用查询字符串设置排序顺序

    我有以下简单的弹性搜索查询 http localhost 9200 apn presupuesto search q subcuenta penal sort anio 而且效果很好 现在我尝试通过 anio desc 订购 我尝试了所有这
  • 为什么Java 8的Optional不能在参数中使用

    我在许多网站上读过 Optional 应该仅用作返回类型 而不应在方法参数中使用 我正在努力寻找一个合乎逻辑的理由 例如 我有一段逻辑 它有 2 个可选参数 因此 我认为像这样编写我的方法签名是有意义的 解决方案 1 public int
  • 在 Haskell 中实现类型类时的任意类约束

    我正在尝试实现一个简单的Set在 Haskell 中 我陷入了如何表达它包含的元素的类约束的困境 The Set类型类相当简单 class Set s where empty s a isEmpty s a gt Bool insert s
  • ggplot图例不显示

    以下代码不显示图例 library ggplot2 g ggplot g g geom line aes x 1 10 y 1 10 color red size 0 2 g g geom line aes x 5 12 y 15 22 c
  • R中的sqldf包,查询数据框

    我正在尝试使用 R 中的 sqldf 库重写一些代码 这应该允许我在数据帧上运行 SQL 查询 但我遇到一个问题 每当我尝试运行查询时 R 似乎都会尝试查询我使用的实际 MySQL 数据库 con 并通过我试图搜索的数据框的名称查找表 当我
  • System.Threading.ThreadAbortException:线程被中止

    我在执行该过程时收到此错误 此问题仅出现在生产中 而不出现在测试和开发系统中 而且这个问题也不会一直发生 当出现此错误时 通过应用程序使用此数据库的所有用户都会被挂起 这意味着与数据库的所有用户连接都将被重置 几秒钟后它会恢复并正常工作 错
  • 如何在Python中处理大的小数?

    我正在解析数据列表 数据是一个值列表 它们非常大 有很多小数点 例如 3 21446735874 48 4505248207 0 3 21476825075 48 4504325609 0 我需要能够在计算中使用这些数字 而无需 pytho
  • Excel文本连接字符串文件路径无效[重复]

    这个问题在这里已经有答案了 我正在尝试编写一个连接字符串 txt使用 C 文件 我不断收到错误消息 指出我的文件路径无效 string excelConnectionString Provider Microsoft Jet OLEDB 4
  • 更改MYSQL日期格式

    我在 MYSQL 中有一个表 其中 3 列有日期 并且它们的格式不符合要求 目前我有 月 日 年我想将这些日期更改为日 月 年 表名称为 Vehicles 列名称为 CRTD INSR SERD 您当前列的数据类型不是date正确的 您需要
  • 如何在 python 中使用 pandas 获取所有重复项的列表?

    我有一份可能存在出口问题的物品清单 我想获得重复项目的列表 以便我可以手动比较它们 当我尝试使用 pandas 时重复法 http pandas pydata org pandas docs dev generated pandas Dat
  • Servlet 和 Filter 在 Grails 中注册为 Spring Bean,而不是 web.xml

    在圣杯中 从 2 x 升级到 3 0 6 文档 https grails github io grails doc latest guide upgrading html有人指出 新的 servlet 和过滤器可以分别注册为 Spring
  • 如何将 Objective-C 和 Swift Pod 集成到 iOS 应用程序的同一项目中

    我正在 iOS 应用程序中做 Objective C 但问题是我想添加一些 Objective C api 到我之前用 cocoa pods 成功添加的地方 但是 现在我想通过 cocoa pods 添加 Swift Api 但是安装时遇到
  • Keras 准确率没有改变

    我有几千个音频文件 我想使用 Keras 和 Theano 对它们进行分类 到目前为止 我生成了每个音频文件的 28x28 频谱图 越大越好 但我只是想让算法在这一点上工作 并将图像读入矩阵中 所以最后我把这个大图像矩阵输入到网络中进行图像
  • Gitlab CI/CD 在管道之间传递工件/变量

    tl dr 我如何传递数据 例如这 BUILD VERSION变量 Gitlab CI 中不同管道中的作业之间 所以 就我而言 Pipeline 1 on push ect Pipeline 2 after merge building j