coding 上通过流水线更新subTree模块

大家好,由于我在的项目组用的是 subTree 去实现公共模块,并且每次 subTree 有变动的时候都需要每个子系统去手动更新 subTree 的内容,这就导致了一旦公共模块有更新,需要在各个子系统进行更新,进行打开该子系统的代码 => 运行 git subTree pull ... => git push 这种操作,而我们现在具有十一个子系统,就代表着每次公共模块的更新,都需要在这十一个子系统进行手动的更新,相当繁琐。

其实通过流水线可以很方便地实现这些更新,那么由于我使用的是 coding,这里就用 coding 做示范了。coding 背后是采用 Jenkinsfile 去进行流水线的配置的,因此如果读者编写流水线的程序也是基于 Jenkinsfile 去实现的话,本文写的配置可以被复用。

首先需要监听各个子系统配置,因此每个子系统都需要建立一条流水线。

一、流水线配置编写

第一步就是检出代码, coding 流水线自带的配置,采用 scm 语言编写。

scm 复制代码
checkout([
  $class: 'GitSCM',
  branches: [[name: GIT_BUILD_REF]],
  userRemoteConfigs: [[
    url: GIT_REPO_URL,
    credentialsId: CREDENTIALS_ID
  ]]])
}
        

然后是执行 subTree的更新

shell 复制代码
steps {
       sh "git subtree pull --prefix=shared-lib https://${PROJECT_TOKEN_GK}:${PROJECT_TOKEN}@e.coding.net/[公共项目项目ssh地址].git master --squash"
 }

最后推入主线

css 复制代码
steps {
      sh "git push https://${PROJECT_TOKEN_GK}:${PROJECT_TOKEN}@e.coding.net/[子系统项目ssh地址].git HEAD:master"
    }

完整的流水线配置代码如下:

lua 复制代码
pipeline {
  agent any
  stages {
    stage('检出') {
      steps {
        checkout([
          $class: 'GitSCM',
          branches: [[name: GIT_BUILD_REF]],
          userRemoteConfigs: [[
            url: GIT_REPO_URL,
            credentialsId: CREDENTIALS_ID
          ]]])
        }
      }
      stage('更新subTree') {
        steps {
          sh "git subtree pull --prefix=shared-lib https://${PROJECT_TOKEN_GK}:${PROJECT_TOKEN}@e.coding.net/[公共模块ssh地址].git master --squash"
        }
      }
      stage('推入主线') {
        steps {
          sh "git push https://${PROJECT_TOKEN_GK}:${PROJECT_TOKEN}@e.coding.net/[子系统项目ssh地址].git HEAD:master"
        }
      }
    }
  }

二、监听公共模块更新

接下来从各个子系统的流水线中复制手动触发的 curl 操作,当公共模块的代码有更新的时候,其会自动触发一条新的流水线,该流水线去执行各个子系统的更新。

因此只需要让各个子系统同步更新就可以了,我们添加多个并行步骤,把对应的curl指令复制进去。

三、Q&A

1. 是否可以直接监听公共模块后直接进行子系统代码的更新?

是可以的,但是相对来说脚本会写得更加复杂一点,感兴趣的读者可以试试。

2. 如果遇到保护分支应该怎么处理?

这也是我一键同步时遇到的问题,有的子系统把 master 确定为保护分支,就导致了我们流水线操作中的直接推到主线的这个步骤会失败,因此对于这个问题,要不就放弃流水线人工去进行处理,要不就需要推送到另外一个分支,在流水线发起合并请求,然后进行自动的合并。

相关推荐
华仔啊5 小时前
jQuery 4.0 发布,IE 终于被放弃了
前端·javascript
一心赚狗粮的宇叔5 小时前
03.Node.js依赖包补充说明及React&Node.Js项目
前端·react.js·node.js
子春一5 小时前
Flutter for OpenHarmony:音律尺 - 基于Flutter的Web友好型节拍器开发与节奏可视化实现
前端·flutter
JarvanMo5 小时前
150万开发者“被偷家”!这两款浓眉大眼的 VS Code 插件竟然是间谍
前端
亿元程序员5 小时前
大佬,现在AI游戏开发教程那么多,你不搞点卖给大学生吗?
前端
未来龙皇小蓝6 小时前
RBAC前端架构-02:集成Vue Router、Vuex和Axios实现基本认证实现
前端·vue.js·架构
晓得迷路了6 小时前
栗子前端技术周刊第 116 期 - 2025 JS 状态调查结果、Babel 7.29.0、Vue Router 5...
前端·javascript·vue.js
顾北126 小时前
AI对话应用接口开发全解析:同步接口+SSE流式+智能体+前端对接
前端·人工智能
摸鱼的春哥6 小时前
春哥的Agent通关秘籍07:5分钟实现文件归类助手【实战】
前端·javascript·后端
念念不忘 必有回响6 小时前
viepress:vue组件展示和源码功能
前端·javascript·vue.js