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

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


Airy
2.4k 声望69 粉丝

github.com/airylinus