1. 名词解释
父仓库:用于方便运维和开发人员管理各组件信息的仓库,父仓库包括组件版本信息汇总表、1个或多个组件子仓库。使用带子仓库的父仓库是为了方便运维人员获取所有组件的最新安装包。
组件仓库:存放某特定组件的仓库,该仓库中通常是对应组件的RPM包,组件仓库可以独立存在,也可作为子仓库关联到父仓库。组件仓库通常由组件负责人更新、然后由运维人员使用。为方便起见,组件负责人通常使用独立存在的组件仓库,运维人员通常使用关联到父仓库的组件子仓库。
组件负责人:负责组件的开发和组件版本(通常为RPM包)的发布,发布组件版本时需要同时提交对应组件仓库并更新父仓库中的组件版本信息汇总表。
项目分支:父仓库和组件仓库中与某特定项目相关的分支,父仓库项目分支中的组件版本信息汇总表和组件仓库项目分支中包括的组件版本与项目一一对应。
2. 管理员:设置父仓库并关联子组件仓库
2.1 简介
设置父仓库并关联子组件仓库的目的是在这两个仓库的主分支下存放必要的信息,后续项目分支只能从主分支拉取,即项目分支不能基于任何状态(发布或开发中)的项目分支拉取。存放的固定信息建议如下:
- 父仓库主分支:版本信息excel表,这个表可以包括组件名称、版本号、日期等信息。
- 组件仓库主分支:readme文件,可以描述该组件的作用等。
2.2 步骤
如图所示,假定远程仓库上已经创建了仓库f1-repo, m1-repo, m2-repo,它们都只有master分支,作用如下:
- f1-repo: 父仓库
- m1-repo: 组件仓库1
- m2-repo: 组件仓库2
2.2.1 克隆父分支并提交组件版本信息汇总表
代码 |
$ git clone ssh://admin@localhost:9080/r/f1-repo.git $ git add . $ git commit -m "f1-repo/master => add 组件版本信息汇总表.xlsx" $ git push |
2.2.2 关联组件子仓库
代码 |
$ git submodule add ssh://admin@localhost:9080/r/m1-repo.git $ git submodule add ssh://admin@localhost:9080/r/m2-repo.git |
上述两条关联命令后,父仓库的master中可以看到新增未提交文件,这些文件就是关联子组件仓库用的,也需要提交到父仓库的master分支中。
代码 |
jis1@LAPTOP-A0E71DH2 MINGW64 /d/99-tmp/submodule/f1-repo (master) $ git status On branch master Your branch is up to date with 'origin/master'.
Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: .gitmodules new file: m1-repo new file: m2-repo
$ git add . $ git commit -m "f1-repo/master => add submodule m1-repo, m2-repo" $ git push |
父仓库提交后,它的每个子组件仓库都有对应的commit ID与之关联。
3. 管理员:创建父仓库和子仓库的项目分支
3.1 简介
父仓库中的项目分支和子仓库中的项目分支名称需要保持一致,虽然git并不要求保持一致,但为了使用方便,这里最后保持一致。
3.2 步骤
假定项目分支为p1
3.2.1 创建父仓库的项目分支
(1) 创建并切换到项目分支
代码 |
$ git branch p1 $ git switch p1 |
(2) 修改组件版本信息汇总表,新增sheet "项目 p1"
(3) 推送项目分支到远程仓库
代码 |
$ git push -u origin p1:p1 |
(4) 可以看到远程仓库已经有p1分支了
3.2.2 创建子仓库的项目分支
(1) 创建分支并推送到远程仓库
代码 |
$ git submodule foreach "git branch p1" $ git submodule foreach "git switch p1" $ git submodule foreach "git push -u origin p1:p1" |
(2) 远程仓库已经有项目分支
4. 组件负责人:更新组件和组件版本信息汇总表
4.1 步骤
假定组件负责人当前要跟新m1组件版本为m1-1.0.0.rpm
4.1.1 拉取组件仓库切换到项目分支
代码 |
$ git clone ssh://admin@localhost:9080/r/m1-repo.git $ cd m1-repo/ $ git checkout p1 |
4.1.2 提交组件到远程仓库
代码 |
$ git add . $ git commit -m "m1-repo/p1: update m1 to m1-1.0.0.rpm" $ git push |
注1:这里的提交信息"m1-repo/p1: update m1 to m1-1.0.0.rpm"为示例,正式项目中以项目要求为准。
注2:如果选项“-m”的信息较多,可以把信息添加到一个文件中,例如comment.txt,然后使用 git commit -F comment.txt来添加信息。
4.1.3 拉取父仓库切换到项目分支
代码 |
$ git clone ssh://admin@localhost:9080/r/f1-repo.git $ cd f1-repo/ $ git checkout p1 |
更新组件版本信息汇总表中m1组件相关信息,并提交。
5. 运维人员:获取最新组件包
假定m1-repo下已经有版本m1-1.0.0.rpm和m1-1.0.1.rpm, m2-repo下已经有版本m2-1.0.0.rpm,运维人员要获取最新版本m1-1.0.1.rpm和m2-1.0.0.rpm对设备升级。
5.1 步骤
5.1.1 拉取父仓库及其所有子仓库
代码 |
$ git clone ssh://admin@localhost:9080/r/f1-repo.git --recurse-submodules |
5.1.2 切换分支到项目分支
代码 |
$ git checkout p1 $ git submodule foreach "git checkout p1" |
5.1.3 获取最新的RPM包核对组件版本信息汇总表后升级设备
代码 |
$ git pull $ git submodule foreach "git pull" $ find . -name "*.rpm" ./m1-repo/m1-1.0.0.rpm ./m1-repo/m1-1.0.1.rpm ./m2-repo/m2-1.0.0.rpm |
5. 总结
每个角色在本地创建文件夹并切换好分支后,后续不用每个步骤都执行,直接操作核心步骤,这样既方便又不容易出错。核心步骤为:
组件负责人:
- 组件仓库下提交组件到远程仓库
- 父仓库下git pull后更新《组件版本信息汇总表.xlsx》并提交
运维人员:
- git pull父仓库获取更新《组件版本信息汇总表.xlsx》
- git submodule foreach "git pull"获取最新的组件版本