GitLab父子管道

GitLab引入父子管道改进,扩展应用程序存储库结构。

存储库结构复杂性增加,.gitlab-ci.yml文件难管理。越来越流行“ monorepo ”模式,团队将多个相关服务代码保存一个存储库。开发人员用同.gitlab-ci.yml文件为不同应用组件触发不同自动化过程,导致合并冲突和生产率下降,团队等待管道“其一部分”运行和完成。

大型复杂项目管理自动化工作流程,Gitlab添加两新功能以使管道强大:父子管道及动态生成管道配置功能。

  • 认识父子管道

解决团队同存储库协作多关联服务痛苦?GitLab 12.7发布父子管道。允许子管道同时运行,将复杂管道拆分父子关系多管道提高性能。使配置和可视化分不同文件和视图。

项目结构如下

  • 创建子管道

通过include将父项包含子项为密钥参数,trigger触发子管道配置文件。命名子管道文件,须是YAML。

C++程序:

#include <iostream>
int main()
{
  std::cout << "Hello GitLab!" << std::endl;
  return 0;
}

配置触发两子管道,构建Windows和Linux版C ++程序。

stages:
  - triggers
 
 
build_windows:
  stage: triggers
  trigger:
    include: ci/.win-gitlab-ci.yml
  rules:
    - changes:
      - cpp_app/*
 
 
build_linux:
  stage: triggers
  trigger:
    include: ci/.linux-gitlab-ci.yml
  rules:
    - changes:
      - cpp_app/*

流水线含stage名为triggers, 有两并行作业,为build_windows,build_linux。每作业设rules限制只cap_app目录文件变化才运行作业。trigger定义触发运行子配置文件,父管道触发后继续运行。用include用本地,远程或模板配置文件,最多三子管道。

父子管道另一有用模式rules触发子管道密钥。对cpp_app文件夹中文件更改时触发。

Windows构建子管道(.win-gitlab-ci.yml)有以下配置,除要触发其他子管道,遵循标准配置格式:

image: gcc
build:
  stage: build
  before_script:
    - apt update && apt-get install -y mingw-w64
  script:
    - x86_64-w64-mingw32-g++ cpp_app/hello-gitlab.cpp -o helloGitLab.exe
  artifacts:
    paths:
      - helloGitLab.exe

不要忘-y参数为apt-get install命令一部分,否则作业卡住,等用户输入。

Linux构建子管道(.linux-gitlab-ci.yml)有以下配置,除非触发其他子管道,遵循标准配置格式:

image: gcc
build:
  stage: build
  script:
    - g++ cpp_app/hello-gitlab.cpp -o helloGitLab
  artifacts:
    paths:
      - helloGitLab

子管道生成工件,“作业结果”屏幕“ *作业工件”*部分下载。

创建文件推送新分支,管道结果,看到两作业及后续子作业。

创建下游管道,trigger作业以success状态完成。父管道不在子管道运行成功后再显示流水线成功,而子管道触发成功则父管道成功。strategy: depend自身状态从触发管道合并到源作业。

stages:
  - triggers
 
 
build_windows:
  stage: triggers
  trigger:
    include: ci/.win-gitlab-ci.yml
    strategy: depend
  rules:
    - changes:
      - cpp_app/*
 
 
build_linux:
  stage: triggers
  trigger:
    include: ci/.linux-gitlab-ci.yml
    strategy: depend
  rules:
    - changes:
      - cpp_app/*

  • 动态生成管道

进一步扩展父子管道,从父管道动态生成子配置文件。存储库清除分散管道配置文件,允许应用中生成配置,将变量传递给文件。

父管道配置文件:

stages:
  - setup
  - triggers
 
 
generate-config:
  stage: setup
  image: ruby
  script:
    - ruby write-config.rb
    - git status
    - cat .linux-gitlab-ci.yml
    - cat .win-gitlab-ci.yml
  artifacts:
    paths:
      - .linux-gitlab-ci.yml
      - .win-gitlab-ci.yml
 
 
trigger-linux-build:
  stage: triggers
  trigger:
    include:
      - artifact: .linux-gitlab-ci.yml
        job: generate-config
       
trigger-win-build:
  stage: triggers
  trigger:
    include:
      - artifact: .win-gitlab-ci.yml
        job: generate-config

自定义setup阶段,管道运行write-config.rb脚本。Ruby脚本编写子管道配置文件,可用任何脚本语言。子管道配置文件与非动态子管道配置文件同。artifacts存为CI运行子配置文件,用于子管道阶段。

Ruby脚本生成YAML,确保缩进正确,否则管道作业失败。

#!/usr/bin/env ruby
 
 
linux_build = <<~YML
    image: gcc
    build:
        stage: build
        script:
            - g++ cpp_app/hello-gitlab.cpp -o helloGitLab
        artifacts:
            paths:
                - helloGitLab
YML
 
 
win_build = <<~YML
    image: gcc
    build:
        stage: build
        before_script:
            - apt update && apt-get install -y mingw-w64
        script:
            - x86_64-w64-mingw32-g++ cpp_app/hello-gitlab.cpp -o helloGitLab.exe
        artifacts:
            paths:
                - helloGitLab.exe
YML
 
 
File.open('.linux-gitlab-ci.yml', 'w'){ |f| f.write(linux_build)}
File.open('.win-gitlab-ci.yml', 'w'){ |f| f.write(win_build)}

triggers阶段,父管道运行生成子管道,与本非动态运行方式相似,用保存artifact文件和指定job

创建所有文件推送新分支,管道结果,看到三作业(一个连接其他两个)及随后两个子作业。

一个父,多个子并动态生成配置,找到构建CI/CD工作流所有工具。

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值