.gitlab-ci 阶段的执行顺序

9

我有这个.gitlab-ci.yml文件:

stepA:
  script:
    - echo "A"
deploy:
  script:
    - echo "1"
stepB:
  script:
    - echo "B"

我如何设置第一个应该运行的阶段? 一些作业可以由多个GitLab Runner并行运行。 我只想确保在运行部署阶段之前完成了步骤A到B


你的问题相当令人困惑。你想要确保在部署之前完成A和B步骤吗? - Akshay barahate
是的,就是这样,这就是我想要的。 - Bob5421
刚刚创建了示例管道并更新了答案。 - Akshay barahate
请注意,JobsStages是不同的东西。Stage是一组作业。 - KargWare
2个回答

14
这正是stages存在的目的。在此处,您用到了“stage”这个词,但实际上您描述的是一个“job”。
同一阶段中的作业可以并行运行(如果有运行工具支持),但阶段按顺序运行。
首先,在.gitlab-ci.yml的顶层定义您的两个阶段:
stages:
  - build
  - dist

然后在每个作业上指定它所属的阶段:

stepA:
  stage: build
  script:
    - echo "A"
deploy:
  stage: dist
  script:
    - echo "1"
stepB:
  stage: build
  script:
    - echo "B"

现在先运行stepAstepB(可以任意顺序或甚至并行),只有第一阶段成功后,才会运行deploy

我有一个问题:由步骤A生成的文件和步骤B文件没有被保留以供部署阶段使用。 - Bob5421
你需要的是作业中的“artifacts”和“depends”部分。指定一个作业生成的文件,然后指定另一个作业需要依赖结果的作业。 - SpencerPark
但是你如何强制执行这两个“构建”阶段的顺序呢? - swade
@swade 为了帮助你更好地进行谷歌搜索,纠正一下你的术语:在一个“构建”阶段中有两个“作业”。你无法控制阶段内作业的顺序。因此,如果你需要在“stepB”之前运行“stepA”,那么请在构建之前创建一个新的阶段,并将“stepA”移动到新的早期阶段中。 - SpencerPark
@SpencerPark 啊,真遗憾。这只是我挑剔的用户界面问题。 - swade
尽管理论是正确的,但请注意GitLab不保证执行顺序。https://gitlab.com/gitlab-org/gitlab/-/issues/16548 - Gajus

1

这里输入图像描述以下代码使用继承

Stages:
  - Step-A
  - Step-B
  - Deploy

.Perform-Step-A:
  stage: Step-A
  script:
   - echo "A"

.Perform-Step-B:
  stage: Step-B
  script:
   - echo "B"

.Perform-Deploy:
  stage: Deploy
  script:
   - echo "1"

Server1-Step-A:
  extends: .Perform-Step-A
  tags: Server-1-As-Runner //Else add SSH steps in Perfrom-A block

Server1-Step-B:
  extends: .Perform-Step-B
  tags: Server-1-As-Runner //Else add SSH steps in Perfrom-B block

Server1-Step-Deploy:
  extends: .Perform-Deploy
  tags: Server-1-As-Runner //Else add SSH steps in Perfrom-Deploy block

假设:

  1. 您正在使用专用的运行程序来运行应用程序,并且这些运行程序配置在同一台机器上。如果不是,请随意修改并进行ssh步骤。
  2. 这是我在此处回答的概念性构建块,可以根据要求进行调整。

  3. 在同时部署多个服务器时最好工作。

注意:由于隐私原因,图像中的标记已被删除。


非常感谢。最后一个问题:协调员服务在哪里?如果运行者不在同一台服务器上会发生什么?协调员是放置在每个服务器上还是一个公共的协调员?谢谢。 - Bob5421
协调器是GitLab CI服务的核心,它构建Web界面并控制运行者(构建实例)。在GitLab CI中,运行者运行在.gitlab-ci.yml中定义的代码。它们是通过GitLab CI的协调器API获取作业的隔离(虚拟)机器。因此,它应该安装在gitlab服务器上,并在每个运行者上进行配置。 - Akshay barahate
如果您想在多个服务器上部署应用程序,但不想涉及SSH密钥破解的繁琐过程。我建议采用的方法完全可以胜任。例如:如果您想在多个服务器上部署应用程序,则在每个部署服务器上安装个别运行器并在.gitlab-ci.yml中使用它们即可。 - Akshay barahate
如果您不想使用特定的Runner(必须使用共享Runner),那么您可能需要从共享Runner通过SSH连接到部署服务器,然后执行部署步骤。以下是一些示例以便理解。 https://codeburst.io/gitlab-build-and-push-to-a-server-via-ssh-6d27ca1bf7b4 https://forum.gitlab.com/t/help-deploying-same-code-to-multiple-prod-servers-at-same-time/8215 - Akshay barahate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接