乐趣区

关于go:工作中对git的简单和进阶使用

Git 简略介绍

本篇不会介绍根本的 git 原理之类的,只记录在工作中的 git 应用教训。如果要学习 git 的根底与进阶,能够参考这个网站 git-tower

本篇会简略介绍我在工作中都应用 git 做了哪些工作:

1、根底应用。应用 gitlab 治理咱们的源代码

2、自动化。咱们应用 gitlab 的 CI 进行主动代码查看、单元测试、代码打包

3、多零碎合作。咱们应用 gitlab 的 issue+webhook+ 钉钉作为简略的工单零碎,撑持咱们进行日常撑持工作

1. 治理源码进行开发

以下都以 gitlab 为例,所有开发人员应用同一个仓库,基于不同的个性分支进行开发

咱们的分支:
1、master 分支: 正式分支,也是打包分支

2、develop 分支: 开发分支,放弃和 master 分支保持一致

3、feature 分支: 性能个性分支,不同的性能别离在对应的个性分支上进行开发测试。

咱们的开发流程:
1、建分支。建设个性 /bug 对应的 issue,依据 issue 创立对应的分支(在 web 页面间接操作), 或者间接从 develop 分支迁出一个新的个性分支

2、开发。在个性分支上进行开发 / 测试,直到测试验收结束,每次提交都会触发部分动态代码查看

3、合并前 rebase 并整顿提交记录。分两步,先 rebase develop 放弃个性分支为最新的 develop 代码,再 rebase -i 变基 commitid 整顿个性分支的 commit 记录

4、合并前 code-review。在 gitlab 网页界面创立 merge-request,并指派其余开发进行 review,直到所有人都无异议,此时会触发全局动态代码查看。

5、合并更新版本信息。研发主管将代码合并到 develop 分支后,在 develop 分支批改代码内的版本信息,再合并到 master 分支

6、打包公布。研发主管基于 master 分支进行打 tag,此时会触发 CI 主动基于 tag 打包。

这样,咱们的一次性能需要的开发就算实现了。目前整个流程还存在一些问题:
1、无奈主动创立及更新 CHANGELOG.md,即版本记录无奈主动生成,跟咱们的提交不标准有关系

2、没法主动触发 CD,跟咱们的服务架构有关系。

2. 基于 gitlab 的 CI 进行自动化代码查看、打包

gitlab 如何搭建 CI,此处不做赘述,查看官网文档即可。Runner 局部教你如何搭建 CI 环境,CICD 局部教你如何让 CI 运行起来

咱们一共有 4 个工作: test,code_check_push,code_check_merge,feat_build,tag_build

  • test。执行单元测试代码,每次 push 时触发
  • code_check_push。执行部分动态代码查看,每次提交代码时触发,查看范畴为提交的 Py 文件代码,且只查看 Error 级别的
  • code_check_merge。执行全局动态代码查看,创立 merge-request 后触发,查看范畴为工程内的次要 python 包,只查看 error 级别的
  • feat_build。执行打包,每次 push 时触发,用于个性分支提测时配置
  • tag_build。执行打包,只有提交创立 tag 时触发,用于正式环境的打包。

3. 基于 webhook 和 issue+ 钉钉的繁难工单零碎

本零碎波及三个局部 gitlab 服务 钉钉服务 简略的直达服务

直达服务

为一个简略的 http 服务,用于接管 gitlab 内的 issue 相干变更的告诉,并转发给钉钉机器人。

  • 创立一个转发接口 api,将该 api 设置到 gitlab 的 webhook 局部即可接管 gitlab 的告诉
  • 保护一个反对人员列表(转发钉钉时以对应手机号为准),收到 gitlab 告诉时转发到钉钉时艾特对应的反对人员进行解决

gitlab 服务

  • 建设一个公开的我的项目,用于接管 issue,内部人员基于该项目标 issue 局部提交工单
  • 依据不同的业务类型,建设不同的工单模板,模板为 markdown 文件,须要搁置于.gitlab/issue_templates/ 目录下,须要手动创立
  • 在该项目标 webhook 局部增加上述直达服务的接管告诉的 api,后续所有 issue 的变更 (建设、更新、敞开) 都会告诉到该 api

钉钉服务

  • 建设反对钉钉群,并增加 webhook 机器人,此机器人用于接管直达服务的告诉

这样,一个繁难的工单零碎就建设起来了。内部人员建设 issue 反馈的时候,钉钉群内机器人就能够立马艾特对应反对人员进行解决,
处理完毕后在 issue 内同步后果信息,issue 创建者会收到 gitlab 告诉邮件

git 罕用场景

记录我了解的以及我应用的业务中场景的解决方法,如果有谬误的或者有差别的还请斧正

1、拉取近程我的项目的指标 (如 develop) 分支

git clone 我的项目地址 我的项目下来通常只蕴含 master 分支,这个时候又不想应用git fetch all 拉取所有分支下来,而只想拉取指定的分支。能够应用

git checkout -b develop origin/develop

这样就切换到想要的分支了,并且曾经拉取到了对应分支的代码

2、我须要为我的性能新建一个分支,并且同步到近程

办法 1:创立分支并间接关联近程分支 git checkout -b new_branch origin/new_branch

办法 2:先创立分支,先迁出新分支git checkout -b new_branch 再手动设置关联近程分支,手动设置近程分支也有两种办法

  • 第一种 git branch --set-upstream-to=origin/new_branch new_branch
  • 第二种 git push --set-upstream origin new_branch(近程分支名)

3、我在本人的 feature 分支进行开发,然而 develop 分支产生了改变,我须要更新下来

先在本地的 develop 拉取最新的近程 develop 代码 git pull origin develop

而后切回 feature 分支,间接针对 develop 分支进行 rebase。git rebase develop

4、master 版本为 10,然而我想回退到版本 9

执行git reset --hard 版本 9 的 commit_id

前提是要提交未 push 到近程, 否则本地再略微批改生成一次新的提交git push --force

然而如果指标是受爱护的分支,那么 –force 不失效

5、个性分支开发结束后,删除掉该分支

先删除本地的分支 git branch -D feat/xxxx

再删除近程的分支 git push origin --delete feat/xxxx

6、依据 commit log 生成 changelog

conventional-changelog,须要应用 npm 装置

7、git rebase 之后,合并的提交其 message 不标准,须要从新批改 message

执行git commit --amend

8、本地代码以及改的面目全非,拉取近程最新代码笼罩本地,且不合并抵触

先拉取近程所有代码 git fetch --all

再重置版本 git reset --hard origin/feature/ 以后分支

9、从某个 tag 分支上迁出新的分支进行开发

局部项目组可能未应用最新的 tag 进行研发,而是基于之前某个稳定版,此时增加紧急 个性时,须要从项目组应用的 tag 上迁出分支

git branch 新分支名 迁出 tag 版本

例如:git branch feature/add-new-feat v1.3.4 则会从 1.3.4 版本迁出分支

10、在本地长期切换到某个提交

执行git checkout $commit_id。此时就能够切换到这次提交上,而后能够 checkout 回原分支,这么做能够定位某次提交是否出问题

11、CICD 脚本里的一些操作

  • 获取以后分支名。git rev-parse --abbrev-ref HEAD
  • 获取以后分支最新的提交。git rev-parse HEAD
  • 获取最新版本的 tag VERSION=git describe --abbrev=0 --tags
  • git 获得两个 tag 之间的 commit,用于生成版本更新的 changelog。git log --pretty=oneline tagA...tagB > change.log
  • 获取倒数第二新的 tag

    • 先获取所有 tag git tag > tags.log
    • 获取所有 tag 数量 tags_num=awk 'END {print NR}' tags.log
    • 计算倒数第二个 tag 的行数 num=$(($tags_num-1))
    • 取倒数第二行 tag 内容 latest_tag=sed -n $num'p' tags.log

参考

Commit message 和 Change log 编写指南 - 阮一峰
git-flow 的工作流程
git clone –mirror 和 git clone –bare 之间的区别是什么
gogs 迁徙 gitlab
手写 git-hooks 钩子
Git – 基于 GitLab 服务端、客户端钩子介绍
GitHub Actions 入门教程
hugo 应用 github action 主动部署到 github pages

本文由博客一文多发平台 OpenWrite 公布!

退出移动版