如何动态设置gitlab-ci变量?

Bha*_*ula 8 gitlab-ci

如何通过脚本设置 gitlab-ci varibales,而不仅仅是在 .gitlab-ci.yaml 中的“varibales”部分?这样我就可以在一项作业中设置变量并在不同的作业中使用

Iva*_*van 12

目前 GitLab 无法在阶段或作业之间传递环境变量。

但有这样的请求:https ://gitlab.com/gitlab-org/gitlab/-/issues/22638

当前的解决方法是使用工件- 基本上是传递文件。
我们有一个类似的用例 - 从中​​获取 Java 应用程序版本pom.xml并将其传递给管道中的各个作业。

我们是如何做到的.gitlab-ci.yml

stages:
  - prepare
  - package

variables:
  VARIABLES_FILE: ./variables.txt  # "." is required for image that have sh not bash

get-version:
  stage: build
  script:
    - APP_VERSION=...
    - echo "export APP_VERSION=$APP_VERSION" > $VARIABLES_FILE
  artifacts:
    paths:
      - $VARIABLES_FILE
package:
  stage: package
  script:
    - source $VARIABLES_FILE
    - echo "Use env var APP_VERSION here as you like ..."

Run Code Online (Sandbox Code Playgroud)


edo*_*put 1

如果运行脚本,您可以设置环境变量

export MY_VAR=the-value
Run Code Online (Sandbox Code Playgroud)

设置环境变量后,它应该保留在当前环境中。

现在来说说为什么你不想这样做。

像 Gitlab CI 这样的工具旨在实现工件的可重复性。一致性就是这里的问题。如果第二个作业 必须从第一个作业中获取变量,会发生什么情况?那么你就有了多条路!

# CI is a sequence
first -> second -> third -> fourth -> ...

# not a graph

first -> second A -> third ...
     \> second B />

Run Code Online (Sandbox Code Playgroud)

你是如何获得第三名的?现在,如果您必须调试第三条路径,您会测试哪条路径?如果第三个构建被破坏,谁负责第二个 A 或第二个 B?

如果您需要一个变量,请立即使用它,而不是稍后在另一个作业/脚本中使用。每当您想要编写更长的命令序列时,请将其作为脚本并执行该脚本!