当前位置: 首页 > news >正文

Gitlab实现多项目触发式自动CICD

工作中可能会遇到这种场景,存在上游项目A和下游项目B,项目B的功能依赖项目A(比如B负责日志解析,A是日志描述语言代码),这种相互依赖的项目更新流程一般如下:

  1. A项目更新,通知B项目开发人员进行更新

  2. B项目开发人员收到通知,重新clone A项目代码到本地

  3. 将clone后的代码在本地重新编译打包生成可用的代码包

  4. 将代码包上传到线上服务器(或通过运维平台部署)

  5. 手动重启服务(如需要)

这个流程是这个场景下需要手动操作的必需的5个步骤。第4和第5步的自动化可以依赖运维平台的建设,基于.gitlab-ci.yml的配置实现自动化。本文主要讲述如何通过配置gitlab和.gitlab-ci.yml文件实现1-3步。

第一步:实现A项目更新触发B项目CICD

如果你拿这个问题去咨询chatgpt,那么它会给你类似下面这个答案

那么实现这个功能,又需要分解成两步

1.在B项目中生成触发器令牌

进入Gitlab B项目页面->Settings->CI/CD->Pipeline triggers

gitlab提供了3种使用pipeline triggers的方式,我们这里使用.gitlab-ci.yml,注意示例里提供的项目地址就是需要在配置文件里填写的地址,填写完触发器名称后,点击Add trigger即可获取B项目的触发器token

2.配置A项目的.gitlab-ci.yml文件

在获取了B项目的token后,就可以配置A项目的.gitlab-ci.yml了

这里我需要实现几个功能点

  • 只有A项目指定的某些分支更新才触发B项目pipeline运行
  • 触发B项目pipeline需要传入A项目更新的分支名,用于B项目拉取A项目指定分支
before_script:- echo "The name of the branch is ${CI_COMMIT_BRANCH}"   -- 这一步非必须,只未了在cicd时校验A项目的分支名stages:- trigger trigger_pipeline:stage: triggerscript:- "curl -X POST --fail -F token=ABCXXXXXX_1234_44                                 -- B项目触发器令牌-F ref=master                                              -- 要触发pipeline的B项目分支名-F variables[PROTO_VERSION_DEV]=${CI_COMMIT_BRANCH}        -- 触发pipeline传入A项目分支名参数 https://gitlab.example.com/api/v4/projects/YOUR_TARGET_PROJECT_ID/trigger/pipeline" -- 上一步提供的项目pipeline地址only:- /^.*abc$/             -- 只有A项目abc结尾的分支更新时会触发tags:- java

第二步:B项目CICD中自动clone A项目代码

通常情况下clone代码需要通过个人账密或SSH密钥认证,这两种方式都不适合用于打包机。因此我用到了gitlab中的项目访问令牌(Project access tokens).项目访问令牌允许通过API对一个特定的项目进行认证和授权,不同于个人访问令牌,项目访问令牌与特定项目关联,并用于控制对该项目资源的访问。它通常用于自动化、CI/CD流程、部署以及任何需要在没有人为直接交互的情况下与项目资源交互的场景。

下面时创建一个A项目访问令牌的步骤:进入Gitlab A项目页面->Settings->Access Tokens,设置token名称、过期日期、以及权限范围后即可创建一个可用的访问令牌。注意:在生成token后要记录下token内容,如果忘记录就无法查看到token内容,再生成一个新的即可。

生成A项目访问令牌后,就可以在B项目中添加bash脚本做代码拉取

#!/bin/bashPROJECT_BRANCH_NAME=$xxx   --分支名,由外部传参获取
PROJECT_ACCESS_TOKEN=xxxx
USERNAME=xxx               -- 经过测试用户名可以随意配置,但建议使用有意义的字符
PROJECT_GIT_URI=xxx        -- clone时候使用的路径
TARGET_DIR_NAME=xxx        -- clone的目标文件夹,使用相对路径git clone -b $PROJECT_BRANCH_NAME https://$USERNAME:$PROJECT_ACCESS_TOKEN@$PROJECT_GIT_URI $TARGET_DIR_NAME

第三步:配置B项目的.gitlab-ci.yml文件

由于不同语言编译打包的方式不同,这里不再给出统一的编译打包文件,只需要注意在编译打包前,执行第二步的bash脚本

script:- bash ./bash脚本所在路径/xx.sh $PROJECT_BRANCH_NAME
测试效果

正确完成上面三个配置步骤后,即可向A项目推送代码测试效果。预期达到的效果为:

1.A项目代码推送完成后,开始执行CICD

2.B项目的CICD被触发,完成代码编译打包和部署

3.建议在B项目中的.gitlab-ci.yml中配置altert stage,增加通知模块。这样每次CICD完成都会发送通知

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 机器学习:逻辑回归--过采样
  • 教育培训小程序开发,简单实用的入门指南
  • AI绘画与摄影新纪元:ChatGPT+Midjourney+文心一格 共绘梦幻世界
  • 机器学习与深度学习之间的区别
  • 诗文发布模板(python代码打造键盘录入诗文自动排版,MarkDown源码文本)
  • 职场 Death Note
  • 鸿蒙媒体开发系列06——输出设备与音频流管理
  • RK3568平台(网络篇)MAC地址烧录
  • 【Vmware16安装教程】
  • C++——求3个数中最大的数(分别考虑整数、双精度数、长整数的情况),用函数模板来实现。
  • sqlgun新闻管理系统
  • microchip中使用printf给AVR单片机串口重定向
  • 轴承表面缺陷检测系统源码分享
  • 医院用餐人次查询表——智慧大屏幕————未来之窗行业应用跨平台架构
  • Ansible——Playbook基本功能???
  • @angular/forms 源码解析之双向绑定
  • 2017 年终总结 —— 在路上
  • C# 免费离线人脸识别 2.0 Demo
  • Docker 笔记(2):Dockerfile
  • Effective Java 笔记(一)
  • gitlab-ci配置详解(一)
  • JavaScript DOM 10 - 滚动
  • js正则,这点儿就够用了
  • Nodejs和JavaWeb协助开发
  • pdf文件如何在线转换为jpg图片
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python_网络编程
  • Python连接Oracle
  • Redis 懒删除(lazy free)简史
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Terraform入门 - 3. 变更基础设施
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 开源SQL-on-Hadoop系统一览
  • 前端临床手札——文件上传
  • 使用docker-compose进行多节点部署
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 云大使推广中的常见热门问题
  • 如何正确理解,内页权重高于首页?
  • ​io --- 处理流的核心工具​
  • ######## golang各章节终篇索引 ########
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (04)odoo视图操作
  • (PADS学习)第二章:原理图绘制 第一部分
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (状压dp)uva 10817 Headmaster's Headache
  • **PHP二维数组遍历时同时赋值
  • .mysql secret在哪_MySQL如何使用索引
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET 中让 Task 支持带超时的异步等待
  • .Net多线程总结
  • .NET命令行(CLI)常用命令