本文作者:CODING 用戶 - 高文
持續集成 (Continuous integration) 是一種軟體開發實踐,即團隊開發成員經常集成他們的工作,通過每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。成員之間的代碼相互影響,可能會出現各種編譯、運行的錯誤,為了避免提交代碼影響到其他開發者,每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而儘早地發現錯誤,使得開發過程更加簡單方便。
通用的持續集成流程大體是像上圖所示一樣,藉助 Jenkins 連通 Git 與 Docker 鏡像倉庫,為後續的持續部署做準備。
而在「CODING 持續集成」中,可以省去其中很多環境部署的麻煩事,下面說一下我在 CODING 平臺做的持續集成工作。
CODING 是國內首個一站式雲端軟體服務平臺,致力於通過技術創新推動軟體開發升級轉型,讓開發更簡單。將代碼託管、項目管理、Cloud Studio、一鍵部署等開發工具集成到瀏覽器中,免除繁雜的開發環境部署,降低軟體開發部署成本。
最初瞭解 「CODING」 ,是我在開發微信小程序時,騰訊雲推薦託管代碼到 CODING 上,於是註冊了一個 CODING 賬號。
開始使用時,主要以Web版開發工具為主,覺得只是一個 Eclipse 的 Che 版本,當時也自己部署一個 Eclipse 的 Che 版本。但部署 Che 版本時,才發現, CODING 其實比 Che 好用得不是一點半點。流暢性、易用性已經高出 Che 一個等級了,功能上也比 Che 更豐富。後來逐漸用起來了,發現 「CODING」 不只是 WebIDE ,還是 Git 、 Jenkins 、 Wiki 、敏捷開發工具、項目管理工具……現在持續集成功能出來了,可以免費試用15天,於是註冊一個玩一玩。
wencst 的個人主頁
基礎操作
本文所使用的源代碼為本人開源的自動開發框架。
Git 操作
下面為 Git 的操作了,相信看文章的大部分人可以略過這一步。
詳細的 Git 步驟可以參考:《 CODING 中的 Git 操作》
Git 操作主要為後續持續集成操作的觸發器。
持續集成
持續集成操作的設置相對比較簡單,按照提示一步步下來即可。有一塊需要注意的,就是構建所用的分支,在配置持續集成時,需要選擇構建觸發方式,觸發時間(代碼上傳時觸發/手動觸發),以及完成時郵件發送提醒(提醒觸發者/不做任何事/只有失敗時提醒)。對於多分支代碼工程一定要注意,選擇自己所需的配置。我這裡所用的為系統默認配置,即當有人提交代碼至 master 時觸發構建,完成時總是發郵件提示開發者。
「CODING 持續集成」提供了三套不同的 Jenkinsfile 模板供開發者使用:簡易模板、並行模板、自定義模板。我這裡選用簡易模板,並稍作修改。
pipeline { agent { label "default" } stages { stage("檢出") { steps { sh ci-init checkout( [$class: GitSCM, branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]] ) } } ? stage("構建") { steps { echo "構建中..." sh mvn clean install echo "構建完成." archiveArtifacts artifacts: **/target/*.jar, fingerprint: true // 收集構建產物 } } stage("Docker") { steps { echo "Docker鏡像生成中..." sh cd wencst-generatorJPA/target && cp classes/Dockerfile . && docker build -t wencst/wencst-generatorJPA . echo "鏡像生成完成." sh docker push wencst/wencst-generatorJPA echo "鏡像上傳完畢" } } } }
更新 Jenkinsfile 後,代碼 push 到對應的分支上,會自動執行構建,發現構建失敗。
點開後,查看構建失敗的具體原因,輸出與 maven 編譯時輸出的沒有什麼差別。
原因提示: there is no POM in this directory。
原來我中間還有一層目錄,需要進入目錄後才能編譯。
pipeline { agent { label "default" } stages { stage("檢出") { steps { sh ci-init checkout( [$class: GitSCM, branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]] ) } } ? stage("構建") { steps { echo "構建中..." sh cd wencst-generatorJPA && mvn clean install echo "構建完成." archiveArtifacts artifacts: **/target/*.jar, fingerprint: true // 收集構建產物 } } ? stage("Docker") { steps { echo "Docker鏡像生成中..." sh cd wencst-generatorJPA/target && cp classes/Dockerfile . && docker build -t wencst/wencst-generatorJPA . echo "鏡像生成完成." sh docker push wencst/wencst-generatorJPA echo "鏡像上傳完畢" } } } }
提交代碼後,會自動執行構建。
可以顯示程序編譯過程,可以顯示每一步詳細輸出,可以增加狀態徽標到相應的文檔或網頁中。可以說「CODING 持續集成」 想的是比較周到的,基本集成了絕大部分開源系統中相應的職能。
構建使用默認的 https://repo.maven.apache.org 源,構建速度也還可以。
至此持續集成完成,界面清晰整潔,並且可以對測試報告和構建結果進行下載,構建過程也會發郵件給相關人員。確實讓開發更簡單了。以前在做這一系列工作時,架構師起碼要做幾件事情:
1.搭建 git 倉庫
2.搭建 jenkins
3.在 git 倉庫中增加 CI 配置
4.郵箱配置
「CODING 持續集成」為開發者省去了很多工作,除了構建過程中必要的工作以外,其他的基本一鍵搞定,不用關心各個組件的安裝配置,環境情況,網路情況,存儲備份等內容。
重點解釋一下 stages 部分,整體分為三個 stages:
stage("檢出") { steps { sh ci-init checkout( [$class: GitSCM, branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]] ) } }
這一步檢出項目中的代碼到 jenkins 的 workspace 目錄下,這一步是 「CODING 持續集成」 默認的配置,無需過多解釋。
stage("構建") { steps { echo "構建中..." sh cd wencst-generatorJPA && mvn clean install echo "構建完成." archiveArtifacts artifacts: **/target/*.jar, fingerprint: true } }
這一步是執行代碼編譯,我所用的是 maven 編譯 spring boot 工程, 「CODING 持續集成」 集成了 mvn 命令,可以直接執行 maven 操作。
注意: jenkins 執行 sh 命令的根路徑都是在當前 workspace 下,所以切換路徑與 maven 編譯命令要在同一個 sh 命令下。
編譯執行後,收集編譯的產物,archiveArtifacts artifacts: **/target/*.jar, fingerprint: true這一步的意思是,將所有工程的 target 路徑下的 jar 包都算作工程產物。
archiveArtifacts artifacts: **/target/*.jar, fingerprint: true
stage("Docker") { steps { echo "Docker鏡像生成中..." sh cd wencst-generatorJPA/target && cp classes/Dockerfile . && docker build -t wencst/wencst-generatorJPA . echo "鏡像生成完成." sh docker push wencst/wencst-generatorJPA echo "鏡像上傳完畢" } }
對於熟悉 docker 的人並不是很陌生,依舊使用 shell 命令來執行 docker build 操作。 cd wencst-generatorJPA/target 首先切換路徑到 jar 包所在目錄。 cp classes/Dockerfile . 拷貝 Dockerfile 到當前路徑下。 docker build -t wencst/wencst-generatorJPA .執行 docker build 操作,用以創建 docker 鏡像。 docker push wencst/wencst-generatorJPA 將創建出來的 docker 鏡像上傳到 dockerhub 中去。
cd wencst-generatorJPA/target
cp classes/Dockerfile .
docker build -t wencst/wencst-generatorJPA .
docker push wencst/wencst-generatorJPA
整體來說 「CODING 持續集成」 想的很周全了,無論從易用性、美觀度以及人性化角度上來說,做得都非常不錯。下面著重說說我使用 「CODING 企業版」 的持續集成後的感受:
希望 CODING 會越來越完善,越來越好!
推薦閱讀: