最终目标:
- 所有 proto 文件的改动都体现在版本号中;
- 开发者不需要手动编译 proto 文件;
- 同一个版本号在各个语言中是通用的;
配置方案:
- 配置 gitlab CI,实现 merge request 通过之后自动打包并生成版本号;
- 每个版本号生成之后自动生成对应语言的接口定义和 message 文件;
- 配置 Dockerfile, 在生产环境构建时使用对应版本号的包;
操作步骤:
1. 配置 gitlab CI runner
gitlab 的 CI runner 可以自行查找官方文档配置。配置完成之后在 proto 文件仓库中添加 \`.gitlab-ci.yaml\` 文件,大概内容如下:
整个 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 ,专门用来构建。在这里配置:
同时我们需要调用 gitlab 的 api 发布 release。其中 release 的 API 可以参见官网,为了方便调用我用 Go 写了一个 cmd 编译好二进制文件,然后直接调用。代码在: https://github.com/airylinus/releaser 。生成 release 的目地是为了保证 repeatable build, git tag 是可以删除的但是 release 不可以。 最终效果如下
2. 配置 Go 应用的 Dockerfile,使用生成的包
因为 Go 的 1.13 以后版本支持了私有仓库配置,且 gitlab 支持 go get。所以我们只要 release 了,就可以保证这个版本的代码是一直可用的。唯一需要配置的就是 build 的时候需要 gitlab 访问权限。这里使用了粗暴的方式配置。
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
至此所有链路都配置好了,后面按照规范使用即可。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。