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工作流所有工具。

联系方式

手机:13822161573 微信:txsolarterms QQ:419396409

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux父子进程管道通信是指在Linux操作系统中,父进程和子进程之间通过管道进行通信的过程。管道是一种特殊的文件,可以实现进程间的数据传输。在父进程中创建管道后,可以通过fork()系统调用创建子进程,并将管道的文件描述符传递给子进程。子进程可以通过管道读取父进程发送的数据,也可以向管道中写入数据,供父进程读取。这种通信方式可以实现进程间的数据共享和协作,是Linux操作系统中常用的进程间通信方式之一。 ### 回答2: 在Linux操作系统中,进程间通信是非常重要的一个功能。父子进程管道通信也是一种非常常用的进程间通信方式。 在Linux中,管道分为匿名管道和命名管道两种类型。匿名管道是由父进程创建,并将其写端的文件描述符传递给子进程。子进程就可以使用这个文件描述符来读取父进程写入管道的数据。而父进程也可以通过管道的另一端来读取子进程写入管道的数据。 在创建管道之前,我们需要使用系统调用pipe()来创建一个管道。具体的操作有两种方式,一种是用fcntl系统调用函数打开管道,另一种是用mkfifo函数创建命名管道。 在匿名管道中,父进程会在fork()函数之后,创建一个新的子进程。子进程会继承父进程的文件描述符,包括匿名管道的读端和写端。父进程在创建子进程后,将匿名管道的写端关闭,并使用管道的读端来从管道中读取数据。同时,子进程在继承父进程的文件描述符之后,也会关闭读端,并使用管道的写端来向管道中写入数据。 在命名管道中,父进程在创建命名管道后,可以打开命名管道的读端和写端,并使用这个文件描述符来读取和写入数据。而子进程只需要打开命名管道的读端或写端即可,以便向管道中写入或读取数据。 总之,父子进程管道通信是Linux操作系统中非常常见的一种进程间通信方式。通过匿名管道和命名管道,父进程和子进程可以方便地将数据传递给对方,从而实现进程间通信。 ### 回答3: Linux父子进程管道通信是指在一个进程中创建了另一个进程,它们之间通过管道通信来实现信息的传递。管道是一种特殊的文件类型,分为匿名管道和命名管道两种。在Linux系统中使用最广泛的是匿名管道,它只能在局部范围内进行数据传输。 借助管道机制,父进程可以向子进程传递数据,也可以从子进程读取数据。通常情况下,父进程负责向子进程传递命令,子进程负责接收并处理命令,然后将结果返回给父进程。 当父进程创建子进程后,它需要使用fork函数来完成进程复制。复制成功后,父进程和子进程就拥有了各自独立的内存空间和寄存器状态,它们之间的通信就需要通过特殊的IPC(Inter-Process Communication,进程间通信)机制来实现。 管道通信相对于其他的IPC方式来说比较简单,但是也存在一定的限制和缺陷。管道的数据传输是基于流的方式进行,因此无法识别消息之间的边界。同时,管道的传输速度依赖于缓冲区的大小和传输数据的大小,如果数据量过大可能会导致阻塞。 除了管道通信,Linux还提供了其他多种IPC方式,如消息队列、共享内存、信号量等,每种方式都有自己的优缺点和适用范围。在使用IPC机制时,需要根据实际需要选择最合适的方式来完成进程间的通信,以提高程序运行效率和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值