将脚本附加到一个阶段 .gitlab-ci.yml

Posted

技术标签:

【中文标题】将脚本附加到一个阶段 .gitlab-ci.yml【英文标题】:Append the script on one stage .gitlab-ci.yml 【发布时间】:2020-09-23 14:52:14 【问题描述】:

如何在.gitlab-ci.yml文件的一个stage中追加script部分?

例如在这个例子中

stages:
  - stage1_name

.a:
  script:
    - echo "String 1"

.b:
  script:
    - echo "String 2"


stage1_name:
  stage: stage1_name
  extends: .a
  extends: .b
  script:
    - echo "String 3"

如何获得输出:

String 1
String 2
String 3

代替:

String 3

【问题讨论】:

【参考方案1】:

Gitlab 13.9 引入了一个!reference-tag,这使得这成为可能;

.setup:
  script:
    - echo creating environment

test:
  script:
    - !reference [.setup, script]
    - echo running my own command

【讨论】:

【参考方案2】:

您可以像这样使用 YAML anchors:

stages:
  - stage1_name

.a: &a
  - echo "String 1"

.b: &b
  - echo "String 2"

stage1_name:
  stage: stage1_name
  script:
    - *a
    - *b
    - echo "String 3"

【讨论】:

【参考方案3】:

我的解决方案是:

stages:
  - stage1_name

.b:
  script:
    - echo "String 2"


stage1_name:
  stage: stage1_name
  before_script:
    - echo "String 1"
  extends: .b
  after_script:
    - echo "String 3"

为了不覆盖 stage_1_name 中的 script 部分,我使用了 before_script 和 after_script。

【讨论】:

请注意,即使script 失败,after_script 也会运行。 还要注意 before_script 在同一个 shell 中执行,而 after_script 在新的 shell 中执行。这意味着 after_script 可能无法正常运行,具体取决于您的用例。 docs.gitlab.com/ee/ci/yaml/#before_script 另请注意,after_script 中的任何错误都会被忽略,并且不会导致作业失败。【参考方案4】:

这是不可能的,当你使用extends时你会覆盖整个块。

您可以使用 @user3106558 示例等依赖项

【讨论】:

我得到了这个“script2 工作:依赖 script1 没有在之前的阶段定义”【参考方案5】:

我不确定extends 的用法,但我通常在这种情况下使用dependencies

stages:
   - stage1

script1:
  stage: stage1
  script:
       //doSomething

script2:
  stage: stage1
  dependencies:
    - script1
  script:
      //doSomething

script3:
  stage: stage1
  depencencies:
     - script2
  script:
      //doSomething

这样,script2 将在 script1 完成后启动,而 script3 - 仅在第二个之后启动。

【讨论】:

我得到了这个“script2 工作:依赖 script1 没有在之前的阶段定义” 这不可能。 dependencies 只能引用先前阶段的作业,它的唯一功能是限制从这些作业中获取的工件。

以上是关于将脚本附加到一个阶段 .gitlab-ci.yml的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .gitlab-ci.yml 中指定通配符工件子目录?

如何将工件传递到另一个阶段?

在 GitLab 中创建标签时查找源分支(使用 gitlab-ci.yml)

构建后的测试将在 gitlab-ci 上的新环境中运行

使用“:”的脚本命令导致 .gitlab-ci.yml 执行错误

Gitlab-ci.yml 创建合并请求