【问题标题】:YML syntax: How do I get the same commands to run before each stage without repeating myself in the YML file?YAML 语法:如何在每个阶段之前运行相同的命令而不在 YAML 文件中重复自己?
【发布时间】:2026-01-25 06:15:02
【问题描述】:

我为我的自托管运行器设置了一个.gitlab-ci.yml 文件,如下所示。

stages:
  - set-environment
  - check-code

set-environment:
  stage: set-environment
  script:
    - C:\Users\9279\Documents\WindowsPowerShell\profile.ps1
    - conda activate temp

run_tests:
  stage: check-code
  script:
    - pytest test.py

type_checker:
  stage: check-code
  script:
    - (ls -recurse *.py).fullname | foreach-object {echo "`n$_`n";mypy --strict $_} 

我打算使用set-environment 阶段使mypypytest 可用于随后的check-code 阶段。不幸的是,它不是这样工作的。 GitLab 在每个阶段完成后销毁 shell。

我知道这是我对 Gitlab Runner 工作原理的理解上的一个缺陷。我怎样才能让set-environment 中的命令在run_teststype_checker 之前运行而不在YML 文件中重复它们?

【问题讨论】:

    标签: gitlab yaml pipeline cicd


    【解决方案1】:

    在 gitlab-ci.yaml 中,您可以定义一个全局 before_script。它看起来像这样。

    stages:
      - check-code
    
    before_script:
      - C:\Users\9279\Documents\WindowsPowerShell\profile.ps1
      - conda activate temp
    
    run_tests:
      stage: check-code
      script:
        - pytest test.py
    
    type_checker:
      stage: check-code
      script:
        - (ls -recurse *.py).fullname | foreach-object {echo "`n$_`n";mypy --strict $_} 
    

    我强烈建议您阅读gitlab-ci.yaml documentation。像这样的功能还有很多。

    【讨论】:

    • 谢谢。那行得通。