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

最终目标:

  1. 所有 proto 文件的改动都体现在版本号中;
  2. 开发者不需要手动编译 proto 文件;
  3. 同一个版本号在各个语言中是通用的;
配置方案:
  1. 配置 gitlab CI,实现 merge request 通过之后自动打包并生成版本号;
  2. 每个版本号生成之后自动生成对应语言的接口定义和 message 文件;
  3. 配置 Dockerfile, 在生产环境构建时使用对应版本号的包;
操作步骤:
1. 配置 gitlab CI runner gitlab 的 CIrunner 可以自行查找官方文档配置。配置完成之后在 proto 文件仓库中添加 `.gitlab-ci.yaml` 文件,大概内容如下:
protobuf|使用 gitlab 实现 proto 文件的 semantic version 管理(2) - 配置篇
文章图片

整个 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 ,专门用来构建。在这里配置:
【protobuf|使用 gitlab 实现 proto 文件的 semantic version 管理(2) - 配置篇】protobuf|使用 gitlab 实现 proto 文件的 semantic version 管理(2) - 配置篇
文章图片

同时我们需要调用 gitlab 的 api 发布 release。其中 release 的 API 可以参见官网,为了方便调用我用 Go 写了一个 cmd 编译好二进制文件,然后直接调用。代码在: https://github.com/airylinus/releaser 。生成 release 的目地是为了保证 repeatable build, git tag 是可以删除的但是 release 不可以。 最终效果如下
protobuf|使用 gitlab 实现 proto 文件的 semantic version 管理(2) - 配置篇
文章图片

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

2. 配置 Go 应用的 Dockerfile,使用生成的包 因为 Go 的 1.13 以后版本支持了私有仓库配置,切 gitlab 支持 go get。所以我们只要 release 了,就可以保证这个版本的代码是一直可用的。唯一需要配置的就是 build 的时候需要 gitlab 访问权限。这里使用了粗暴的方式配置。
protobuf|使用 gitlab 实现 proto 文件的 semantic version 管理(2) - 配置篇
文章图片

3. 配置和 deploy maven 包 需要一些 maven 的配置文件,可以事先做好模板放到仓库中
mv ./protoc-gen-grpc-java-1.22.3-linux-x86_64.exe ./grpc-java.binchmod +x ./protoc ./protoc-gen-go ./grpc-java.binprotoc -I protos/ -I ./ --go_out=plugins=grpc:../protos/*.protoecho -n "Build for Java"rm -rf ./${project}mkdir -p ./${project}/src/main/javaprotoc -I protos/ --plugin=protoc-gen-grpc-java=./grpc-java.bin --grpc-java_out=./${project}/src/main/java --java_out=./${project}/src/main/java protos/*.protosed "s/__VERSION__/${v}/g" ./tools/template-pom.xml | sed "s/__PROJECT__/${project}/g" > ./${project}/pom.xmlmkdir ~/.m2/rm -rf /usr/local/maven3/conf/settings.xmlcp ./tools/settings.xml /usr/local/maven3/conf/cd ./${project}mvn compile package deploy -e

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

    推荐阅读