【问题标题】:Append the script on one stage .gitlab-ci.yml将脚本附加到一个阶段 .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

【问题讨论】:

    标签: gitlab yaml gitlab-ci pipeline


    【解决方案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 只能引用先前阶段的作业,它的唯一功能是限制从这些作业中获取的工件。
        猜你喜欢
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 2022-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多