使用 gitlab 实现 proto 文件的 semantic version 管理(2) - 配置篇

最终目标:

  1. 所有 proto 文件的改动都体现在版本号中;
  2. 开发者不需要手动编译 proto 文件;
  3. 同一个版本号在各个语言中是通用的;

配置方案:

  1. 配置 gitlab CI,实现 merge request 通过之后自动打包并生成版本号;
  2. 每个版本号生成之后自动生成对应语言的接口定义和 message 文件;
  3. 配置 Dockerfile, 在生产环境构建时使用对应版本号的包;

操作步骤:

1. 配置 gitlab CI runner

         gitlab 的 CI  runner 可以自行查找官方文档配置。配置完成之后在 proto 文件仓库中添加 \`.gitlab-ci.yaml\` 文件,大概内容如下:

image.png

整个 ci 过程就是使用 proto 文件生成各种语言的代码文件,然后打 tag 并 push 到仓库中。我使用了下面的代码来生成版本号,保证十年内不会重复:


year=$(date +"%y" --date="+1 year" | sed "s/2//1")
v="v1.\${year}.\$CI\_JOB\_ID”
git tag $v
git push release $v

其中 \`\$D\_PRIVATE\_KEY\` 、\`$D\_PUB\_KEY\` 是生成的 rsa key pair ,专门用来构建。在这里配置:

image.png

同时我们需要调用 gitlab 的 api 发布 release。其中 release 的 API 可以参见官网,为了方便调用我用 Go 写了一个 cmd 编译好二进制文件,然后直接调用。代码在: https://github.com/airylinus/releaser 。生成 release 的目地是为了保证 repeatable build, git tag 是可以删除的但是 release 不可以。 最终效果如下

image.png

image.png

2. 配置 Go 应用的 Dockerfile,使用生成的包

因为 Go 的 1.13 以后版本支持了私有仓库配置,且 gitlab 支持 go get。所以我们只要 release 了,就可以保证这个版本的代码是一直可用的。唯一需要配置的就是 build 的时候需要 gitlab 访问权限。这里使用了粗暴的方式配置。

image.png

3. 配置和 deploy maven 包

需要一些 maven 的配置文件,可以事先做好模板放到仓库中

mv ./protoc-gen-grpc-java-1.22.3-linux-x86_64.exe ./grpc-java.bin

chmod +x ./protoc ./protoc-gen-go ./grpc-java.bin

protoc -I protos/ -I ./ --go_out=plugins=grpc:../protos/*.proto

echo -n "Build for Java"

rm -rf ./${project}

mkdir -p ./${project}/src/main/java

protoc -I protos/ --plugin=protoc-gen-grpc-java=./grpc-java.bin --grpc-java_out=./${project}/src/main/java --java_out=./${project}/src/main/java protos/*.proto

sed "s/__VERSION__/${v}/g" ./tools/template-pom.xml | sed "s/__PROJECT__/${project}/g" > ./${project}/pom.xml

mkdir ~/.m2/

rm -rf /usr/local/maven3/conf/settings.xml

cp ./tools/settings.xml /usr/local/maven3/conf/

cd ./${project}

mvn compile package deploy -e

至此所有链路都配置好了,后面按照规范使用即可。


github.com/airylinus

2.4k 声望
67 粉丝
0 条评论
推荐阅读
记一次 go mod vendor 报错排查经过
该步骤将以 go.mod 文件中写明的包和版本为准下载第三方依赖并保存到本地的 vendor 目录。下载过程中将校验 go.sum 中的 hash 值是否同文件 hash 一致。

Airy阅读 894

IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf
Protobuf最大的特点是数据格式拥有极高的压缩比,这在移动互联时代是极具价值的(因为移动网络流量到目前为止仍然昂贵的),如果你的APP能比竞品更省流量,无疑这也将成为您产品的亮点之一。

JackJiang1阅读 450

封面图
写给go开发者的gRPC教程-protobuf基础
序列化协议。gRPC使用protobuf,首先使用protobuf定义服务,然后使用这个文件来生成客户端和服务端的代码。因为pb是跨语言的,因此即使服务端和客户端语言并不一致也是可以互相序列化和反序列化的

liangwt1阅读 991评论 1

封面图
protocol-buffers namespace conflict
在运行grpc服务,加载*.pb.go时可能会报冲突错误,如文件名命名冲突:其实针对文件名冲突的错误处理开发者有移除过"文件冲突检测":[链接]后来发现有问题又加上了"文件冲突检测":[链接]

AVOli阅读 839

protobuf 使用其他消息类型message的三种方式
在我们写protobuf最基础的是有 基本的数字,字符串,枚举类型组成,在这些基础的类型基础上,我们组合成一个message类型。接下来我们探讨一下,如何在message里面再使用其他的message类型。

海生阅读 795

IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)
跟移动端IM中追求数据传输效率、网络流量消耗等需求一样,随手记客户端与服务端交互的过程中,对部分数据的传输大小和效率也有较高的要求,普通的数据格式如 JSON 或者 XML 已经不能满足,因此决定采用 Google 推...

JackJiang阅读 733

封面图
IM通讯协议专题学习(五):Protobuf到底比JSON快几倍?全方位实测!
本系列的前几篇主要是从各个角度讲解Protobuf的基本概念、技术原理这些内容,但回过头来看,对比JSON这种事实上的数据协议工业标准,Protobuf到底性能到底高多少?本篇将以Protobuf为基准,对比市面上的一些主流...

JackJiang阅读 700

封面图

github.com/airylinus

2.4k 声望
67 粉丝
宣传栏