maven + protobuf + gRPC + gitlab CI

最近寫了一些 Java 的 gRPC, 涉及到 protobuf 和 maven 還有 gitlab CI 的問題, 整理一下.

0x00 proto 代碼管理

使用 gRPC 就少不了 protobuf. proto 文件的管理和項(xiàng)目間共享問題, 推薦一個思路:

  • 所有的 proto 文件放到一個項(xiàng)目里, 統(tǒng)一在一個 git 項(xiàng)目中管理
  • 使用 gitlab ci 自動檢查 proto 文件語法, 在 commit 的時候自動跑 ci
  • 所有人使用 Merge Request 修改 proto 文件, code review

0x01 Java 項(xiàng)目中引用 proto 文件

Java 項(xiàng)目中使用 proto 文件, 建議使用 git submodule 功能, 將 protobuf 項(xiàng)目作為 submodule 添加到工程項(xiàng)目中, 僅僅 include 用到的幾個文件.

maven 工程中配置如下:

<build>
    <extensions>
        <extension>
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>1.4.1.Final</version>
        </extension>
    </extensions>
    <plugins>
        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <version>0.5.0</version>
            <configuration>
                <protocArtifact>
                    com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
                </protocArtifact>
                <!-- pluginId 和 pluginArtifact 只有在需要生成 gRPC 服務(wù)的時候使用, 如果不需要 gRPC 服務(wù), 可以刪除這兩個元素 -->
                <pluginId>grpc-java</pluginId>
                <pluginArtifact>
                    io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
                </pluginArtifact>
                <!-- 這里是 protobuf 文件的路徑 -->
                <protoSourceRoot>${basedir}/{your_protobuf_dir}</protoSourceRoot>
                <includes>
                        <!-- 這里寫一些包含的文件相對路徑 -->
                    <include>{some_files}</include>
                </includes>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>compile-custom</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

這樣的好處有如下幾點(diǎn):

  • 所有的代碼都是 git 管理, 避免相互拷貝 proto 文件
  • build 過程全部依賴 maven 實(shí)現(xiàn), 無需額外腳本
  • 平臺無關(guān), 通過 os-maven-plugin 插件屏蔽了 os, mac 上開發(fā), *nix build 無障礙

0x02 gitlab ci 中 git submodule 問題

由于使用了 git submodule 功能, 導(dǎo)致在默認(rèn)情況下 gitlab 的 ci runner 僅僅 clone 了主項(xiàng)目代碼, 沒有 submodule 的內(nèi)容. 修復(fù)的辦法也很簡單:

  1. gitlab submodule 中使用相對路徑, 參見 gitlab 官方文檔
  2. 項(xiàng)目的 .gitlab-ci.yml 中添加如下變量, clone 的時候 recursive 下載 submodule 代碼
variables:
  GIT_SUBMODULE_STRATEGY: recursive

總結(jié)

看上去很簡單的事情, 折騰了好幾個小時. 寫出來大家開心一下, 開箱機(jī)用.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,632評論 19 139
  • 本文以Gitlab來講解Git使用以及持續(xù)集成, 持續(xù)集成采用的是Gitlab CI. 其他代碼托管網(wǎng)站,如Git...
    x1596357閱讀 5,565評論 0 6
  • 阿魯默默 136
    vern_guo閱讀 266評論 0 0
  • 我想我若是再不做點(diǎn)什么,就真的把你忘了。這已經(jīng)是高中畢業(yè)兩年,其中一年斷斷續(xù)續(xù)的還能聊天,其中一年卻是中斷了聯(lián)系。...
    無休止H閱讀 276評論 0 0
  • 讀這本書是緣于一則微信文章“神經(jīng)專家談大麻對青少年的危害”,微信鏈接如下,標(biāo)題很像目前最流行的“磚家”寫的文,要不...
    5467lq閱讀 477評論 1 1

友情鏈接更多精彩內(nèi)容