本文作者:CODING 用戶 - 高文

持續集成 (Continuous integration) 是一種軟體開發實踐,即團隊開發成員經常集成他們的工作,通過每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。成員之間的代碼相互影響,可能會出現各種編譯、運行的錯誤,為了避免提交代碼影響到其他開發者,每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而儘早地發現錯誤,使得開發過程更加簡單方便。

通用的持續集成流程大體是像上圖所示一樣,藉助 Jenkins 連通 Git 與 Docker 鏡像

倉庫,為後續的持續部署做準備。

而在「CODING 持續集成」中,可以省去其中很多環境部署的麻煩事,下面說一下我在 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 的個人主頁


「CODING 持續集成」

基礎操作

  • 首先需要創建企業賬號;
  • 然後創建自己的項目;
  • 進入項目維護項目代碼。

本文所使用的源代碼為本人開源的自動開發框架。

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 持續集成」為開發者省去了很多工作,除了構建過程中必要的工作以外,其他的基本一鍵搞定,不用關心各個組件的安裝配置,環境情況,網路情況,存儲備份等內容。


Jenkinsfile 拆解

重點解釋一下 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 包都算作工程產物。

  • 第三步為 docker 鏡像生成

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 中去。


總結

整體來說 「CODING 持續集成」 想的很周全了,無論從易用性、美觀度以及人性化角度上來說,做得都非常不錯。下面著重說說我使用 「CODING 企業版」 的持續集成後的感受:

  1. 滿足了從開發到代碼管理,到代碼集成,到單元測試,甚至到後續部署,一站式管理;
  2. 配置相對簡單,只需配置 Jenkinsfile 即可完成,無需花費大量的人力物力來做各系統間的整合操作;
  3. 系統集成後,會給開發人員發送郵件,報告集成成功或失敗,這一點還是比較人性化的;
  4. 「CODING 持續集成」平臺集成了很多種命令,起碼我用到的 mvn/java/docker/git 這一類的命令基本都集成在服務中了。

希望 CODING 會越來越完善,越來越好!

推薦閱讀:

相關文章