持續集成之 Spring Boot 實戰篇

本文作者: CODING 用戶 - 何健

這次實戰篇,我們借助「CODING 持續集成」,實現一個簡單的 Spring Boot 項目從編碼到最后部署的完整過程。本教程還有 B 站視頻版,幫助讀者更好地學習理解。

思路

在線上環境構建、測試、部署

這種情況,通常會將 jenkins 安裝在服務器上,確保構建測試等操作環境和線上環境一致。

此時通常會在 jenkins 中配置好需要持續集成的倉庫,以及具體流程。

這種方式非常簡單粗暴,也非常有效,但是缺點也很明顯。可能 jenkins 會成為線上環境的旁站漏洞,這是非常不安全的。

那么,我們就需要更高級的方式,可以線上環境之外的構建測試,最終部署到線上環境。「CODING 持續集成」正是提供這類持續集成模式的平臺。

不在實際部署服務器上構建、測試

為了避免占用線上服務器的資源,也為了避免安全問題,我們可以使用單獨的 jenkins (或者其它此類軟件)完成構建、測試、分發,實際部署通過單獨的 webhook 實現。這樣就可以避免在線上環境安裝 Jenkins,還可以避免更復雜的系統安全維護。

這樣做的優點:不會影響在線服務; 缺點:部署地機器最好是可以公網訪問的,否則會無法完成后續分發步驟。

終極解決方案:使用 SaaS 化的 Jenkins

Software as a Service,軟件即服務。「CODING 持續集成」集成了 SaaS 化的?Jenkins 等主流企業開發流程工具,實現了 DevOps 流程全自動化。開箱即用,直接用它就好!

捋一下思路

我們這次實戰針對后一種思路

  1. 檢出代碼

  2. 構建

  3. 測試

  4. 分發

  5. 觸發部署

實戰

實際體驗,還是很不錯的。

視頻地址:CODING 持續集成 - Spring Boot 項目

第一步:初始化一個持續集成

  1. 首先,我們需要進入準備持續集成的項目。

    這里我用 start.spring.io 初始化一個 demo 示例項目,并推送到倉庫。 為了方便大家,親自體驗,我準備了一個現成的倉庫,可以直接 git clone 下來再 git push 到自己賬戶下使用。倉庫地址:demoForCI

  2. 解壓 demo 項目,進入 demo 目錄,初始化倉庫。

      cd g:\demo\git initgit set remote giturlgit add ./git commit -m 'init repo'git push -u origin master
復制代碼

別忘了 git config user.name yournamegit config user.email youremail

  1. 開始體驗 倉庫準備好后,就可以開始體驗「CODING 持續集成」。

    第一次的使用,需要先創建一個 Jenkinsfile,很多小伙伴會說,第一次用,不知道是啥。

    沒關系,「CODING 持續集成」已經給我們準備好了模板,非常容易理解,可以認為是特定格式語法寫一套 task 流程。

    點擊一下 “簡易模板”,更具實際情況修改一下就可以。

第二步:編寫 Jenkinsfile

為了方便理解,我們從簡易模板開始,分別修改對應階段的任務。

  1. 配置構建環境,「CODING 持續集成」目前支持 java-8、python-3.5、ruby-2.3、go-1.11 等等。 在 Jenkinsfile 的 pipeline 里添加:
    agent {// 此處設定構建環境,目前可選有// default, java-8, python-3.5, ruby-2.3, go-1.11 等// 詳情請閱 https://dev.tencent.com/help/knowledge-base/how-to-use-ci#agentslabel "java-8"}
復制代碼
  1. 檢出 這里不得不說,「CODING 持續集成」這里做的還是很方便的,提供了適用于好幾種不同場景的模板。默認簡易模板是帶有檢出部分的,我們可以根據實際情況進行修改。默認情況下,env.GIT_BUILD_REF 的值就是 master 主分支,實際上我們可以定制為其它專門用于構建發的分支。

    這里,大家可以自己修改具體要檢出的分支。

    stage("檢出") {steps {sh 'ci-init'checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]])}}
復制代碼
  1. 構建
    stage("構建") {steps {echo "構建中..."sh 'java -version'sh 'mvn package'echo "構建完成."archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集構建產物}}
復制代碼

這里需要注意,Spring Boot 的 pom 中需要添加一個插件。 修改后:

    <plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!-- 下面是添加的插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.6</version><configuration><skipTests>true</skipTests></configuration></plugin>
復制代碼
  1. 測試 這里我偷個懶,只做了單元測試, 沒有提取測試報告,大家可以根據實際項目定制這個流程。
    stage("測試") {steps {echo "單元測試中..."sh 'mvn test'echo "單元測試完成."//junit 'target/surefire-reports/*.xml' // 收集單元測試報告的調用過程}}
復制代碼
  1. 分發 jar 包到目標服務器 這里比較無奈,我沒有單獨針對這次演示寫部署 jar 包和上傳 jar 包的 webhookApi,但是構建好的 jar 包需要要放置到待部署的服務器。

    于是有了這個過程,借助 scp私鑰來上傳構建好的jar包。

    這里千萬記著提前部署好密鑰。并且將密鑰放到倉庫一份,用于分發jar包。

    stage("分發jar包") {steps {echo "分發中..."echo "chmod 600 pkey"sh 'chmod 600 authorized_keys.pem'echo "upload"sh 'scp -i authorized_keys.pem ./target/*.jar root@yourip:/root/'echo "準備部署"}}
復制代碼
  1. 部署

    前面有提到,這里部署仍然需要觸發一個鉤子,否則只能手動部署了。 這里我寫了一個最簡單的,實際上我們可以寫細致一點,判斷一下接口返回的結果再根據結果輸出部署情況。

    stage("部署") {steps {sh 'curl http://youapi'echo "部署完畢"}}
復制代碼

第三步:保存 Jenkinsfile 并運行

修改好 Jenkinsfile 和 pom.xml。

我們要保存 Jenkinsfile,編輯框可以直接編輯內容,編輯好可以直接提交到倉庫下的 ./Jenkinsfile

接下來, 平臺會自動讀取 Jenkinsfile 并開始走持續集成的流程:

持續集成的流程是可以看到的:

每個階段都對應 Jenkinsfile 一個 stage, 我們可以點擊查看對應階段的構建結果。

第四步:排查持續集成的報錯

如果某個過程出錯,「CODING 持續集成」的流程會停止,并提示失敗。此時我們可以進入具體節點查看具體失敗原因。

比如現在是提示“分發 jar 包失敗”,那么我們可以點擊對應節點展開看看日志,排查具體分發失敗的原因。

現在可以清晰地看到,報錯原因是我沒有填寫正確的主機 ip。

文中涉及的文件及代碼

Jenkinsfile

pipeline {agent {// 此處設定構建環境,目前可選有// default, java-8, python-3.5, ruby-2.3, go-1.11 等// 詳情請閱 https://dev.tencent.com/help/knowledge-base/how-to-use-ci#agentslabel "java-8"}stages  {// 檢出倉庫stage("檢出") {steps {// 這里sh調用ci-init 初始化sh 'ci-init'// 這里檢出倉庫,默認檢出分支為環境變量中的GIT_BUILD_REFcheckout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]])}}// 構建jar包stage("構建") {steps {echo "構建中..."// 輸出java版本sh 'java -version'// 調用maven 構建jar包sh 'mvn package'echo "構建完成."//收集構建產物,這一步成功,我們就可以在平臺上看到構建產物archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集構建產物}}// 測試stage("測試") {steps {echo "單元測試中..."// 做單元測試sh 'mvn test'echo "單元測試完成."}}// 分發jar包,這里只是簡單的通過scp分發jar包到目標機器指定目錄stage("分發jar包") {steps {echo "分發中..."echo "chmod 600 pkey"sh 'chmod 600 authorized_keys.pem'echo "upload"sh 'scp -i authorized_keys.pem ./target/*.jar root@youip:/root/'echo "準備部署"}}// 部署jar包stage("部署") {// 這里需要觸發一個部署的webhook,可以是一個很簡單的重啟java進程的操作steps {// 用curl 來觸發hooksh 'curl http://baidu.com'echo "請登錄服務器手動部署"}}}
}
復制代碼

pom.xml

文中所用 Spring Boot 示例項目的 pom.xml

實際上,大家可以直接去 start.spring.io 參考照這份 pom 來創建一個 demo。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>tech.hejian</groupId><artifactId>codingj8</artifactId><version>0.0.1-SNAPSHOT</version><name>codingj8</name><description>coding project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.6</version><configuration><skipTests>true</skipTests></configuration></plugin></plugins></build></project>
復制代碼

總結

CODING?是一個面向開發者的云端開發平臺,提供 Git/SVN 代碼托管、任務管理、在線 WebIDE、Cloud Studio、開發協作、文件管理、Wiki 管理、提供個人服務及企業服務,其中「CODING 持續集成」集成了 SaaS 化的?Jenkins 等主流企業開發流程工具,實現了 DevOps 流程全自動化,為企業提供軟件研發全流程管理工具,打通了從團隊構建、產品策劃、開發測試到部署上線的全過程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536834.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536834.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java靜態工廠方法模式_設計模式:簡單工廠模式(靜態工廠方法模式)

簡單工廠的構成包括三個角色&#xff1a;1)抽象產品類2)具體產品類(繼承抽閑產品類)3)工廠類(生產具體產品)具體代碼實現1、抽象產品類/*** 抽象類*/public abstract class Car {/*** 產品抽象方法&#xff0c;將會由具體產品類實現*/public abstract void driving();}2、具體產…

Kibana中的Coordinate Map地圖報索引錯誤的問題

今天做地圖定位展示&#xff0c;展示的是ApacheWeb服務器的訪問日志文件中的來源IP。但是中間出現了報錯環節&#xff0c;說是索引不能匹配到geo_point類型&#xff0c;實在是不懂這是在說什么&#xff0c;后來在網站找了方法就解決了。主要報錯如下&#xff1a; 報錯信息&…

mysql數據庫安裝在unix_Linux下的數據庫二:在Linux/Unix平臺安裝MySQL

推薦使用RPM工具來進行Linux下的MySQL數據庫安裝。目前的MySQLrpm安裝文件包是在SuSE Linux7.3系統平臺上打造而成的&#xff0c;但是在絕大多數支持RPM和glibc的其他Linux平臺中也可以進行安裝。如果選擇通用的RPM安裝包&#xff0c;那么RPM將靜態鏈接到Linux的線程中。下面步…

mysql時區設置gmt_將MySQL數據庫時區設置為GMT

不,不可能在MySQL實例中更改單個數據庫的時區.您可以檢索服務器和客戶端time_zone設置&#xff1a;SELECT global.time_zone, session.time_zone;您還可以更改整個MySQL實例的客戶端時區或時區.但要敏銳地了解現有客戶端連接的含義,以及如何解釋已存儲在實例中的DATETIME和TIME…

javaSE知識點匯總

javaSE知識點匯總Java基礎知識精華部分寫代碼&#xff1a;1&#xff0c;明確需求。我要做什么&#xff1f;2&#xff0c;分析思路。我要怎么做&#xff1f;1,2,3。3&#xff0c;確定步驟。每一個思路部分用到哪些語句&#xff0c;方法&#xff0c;和對象。4&#xff0c;代碼實現…

java中412是什么錯_HTTP 412 錯誤 – 先決條件失敗 (Precondition failed)

HTTP 412 錯誤 – 先決條件失敗 (Precondition failed)介紹您的 Web 服務器認為&#xff0c;該服務器檢測到客戶端發送的 HTTP 數據流包括一個沒有滿足的‘先決條件’規范。HTTP 循環中的 412 錯誤任何客戶端 ( 例如您的瀏覽器或我們的 CheckUpDown 機器人 ) &#xff0c;都需要…

細談頁面回流與重繪

你將了解到&#xff1a; 什么是回流 什么是重繪 回流何時發生 重繪何時發生 如何避免回流和重繪 復制代碼帶著上面的問題&#xff0c;我們一探究竟 什么是回流 回流&#xff1a;英文是reflow 當render tree中的一部分(或全部)&#xff0c;因為元素的規模尺寸、布局、隱藏等改變…

安卓 java中改布局_android-選項卡布局中的地圖視圖throwing,java....

我創建了一個具有選項卡布局的應用程序,單擊選項卡后,我將打開一個使用Web視圖的新活動.另外另一個選項卡使用地圖視圖,列表視圖,圖像視圖.現在,我在Samsung Galaxy Y上安裝了我的應用程序-運行正常.當我在Samsung Galaxy Tab 2上安裝相同的應用程序時,當我第一次打開地圖視圖,…

怎么樣修改PuTTY的默認字體和字符集

1.在窗口標題上點擊右鍵&#xff0c;選擇 Change Settings...2.在打開的配置窗口左邊選擇 Appearance&#xff0c;在右邊點 Font settings 里面的 Change 按鈕&#xff0c;選擇好中文字體&#xff0c;比如&#xff1a;宋體、新宋體之類的3.選擇配置窗口左邊的 Translation&…

python 元組比較大小_為什么元組比列表更快?

所報道的“build設速度”比率只適用于常量元組(項目用文字表示)。 仔細觀察(并在機器上重復 – 只需在shell /命令窗口input命令&#xff01;)…&#xff1a;$ python3.1 -mtimeit -sx,y,z1,2,3 [x,y,z] 1000000 loops, best of 3: 0.379 usec per loop $ python3.1 -mtimeit […

windows軟鏈接的建立及刪除

2019獨角獸企業重金招聘Python工程師標準>>> 1.建立舉例 # 建立d:develop鏈接目錄&#xff0c;指向遠程的目標服務器上的e盤的對應目錄。 mklink /d d:\develop \\138.20.1.141\e$\develop# 建立d:develop鏈接目錄&#xff0c;指向遠程的目標服務器上的e盤的對應目錄…

php原生類,反序列化之PHP原生類的利用

正文文章圍繞著一個問題&#xff0c;如果在代碼審計中有反序列化點&#xff0c;但是在原本的代碼中找不到pop鏈該如何?N1CTF有一個無pop鏈的反序列化的題目&#xff0c;其中就是找到php內置類來進行反序列化。基礎知識首先還是來回顧一下序列化中的魔術方法&#xff0c;下面也…

Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[貪婪算法選特征]

目錄 概括Sparse PCA Formulation非常普遍的問題Optimality ConditionsEigenvalue Bounds算法代碼概括 這篇論文&#xff0c;不像以往的那些論文&#xff0c;構造優化問題&#xff0c;然后再求解這個問題&#xff08;一般都是凸化&#xff09;。而是&#xff0c;直接選擇某些特…

js php調用webservice,php調用web services兩種方法soap和curl

以http://www.webxml.com.cn/zh_cn/index.aspx一、使用soap調用//服務器支持soap擴展:/*Example 1:$client new SoapClient("http://fy.webxml.com.cn/webservices/EnglishChinese.asmx?wsdl");$parameters array("wordKey">"test");//中英…

JS基礎-3

1.for in 對象中有多少組鍵值對,我們的FOR IN 循環就遍歷多少次(不一定) 每一次循環KEY這個變量存儲的都是當前循環這組鍵對值的屬性名 1、KEY存儲的值都是字符串格式的(不管屬性名是否為數字) 2、在FOR IN 循環遍歷的時候&#xff0c;大部分瀏覽器都是先把對象中的鍵值對進行排…

Python常用的幾個函數

print()函數&#xff1a;用于打印輸出信息到控制臺。 input()函數&#xff1a;用于從控制臺獲取用戶輸入。 len()函數&#xff1a;用于獲取字符串、列表、元組、字典等對象的長度。 range()函數&#xff1a;用于生成一個整數序列&#xff0c;常用于循環中。 type()函數&…

數據結構——常見的定義

問題答案Ο標記法&#xff08;大Ο標記法&#xff09;是一種用于衡量算法時間復雜度的表示方法。它描述了算法在最壞情況下的運行時間增長率。當我們使用Ο標記法時&#xff0c;我們關注的是算法的上界&#xff0c;即算法的運行時間不會超過Ο(f(n))&#xff0c;其中 f(n) 是輸…

TikTok與環保:短視頻如何引領可持續生活方式?

在數字時代&#xff0c;社交媒體平臺扮演著塑造文化和價值觀的關鍵角色。而TikTok&#xff0c;作為一款全球短視頻平臺&#xff0c;不僅塑造著用戶的娛樂方式&#xff0c;還在悄然地引領著可持續生活方式的潮流。本文將深入探討TikTok與環保之間的關系&#xff0c;分析短視頻如…

Spring源碼分析---Bean 的生命周期 03

來源&#xff1a;Spring 3. Bean 的生命周期 自定義一個 SpringBoot 的主啟動類&#xff1a; SpringBootApplication public class A03Application {public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(A03Applicatio…

go-carbon v2.3.0 圣誕特別版發布,輕量級、語義化、對開發者友好的 Golang 時間處理庫

go-carbon v2.3.0 圣誕節特別版發布&#xff0c;這應該是 2023 年的最后一個版本&#xff0c;祝大家圣誕節快樂&#xff01; carbon 是一個輕量級、語義化、對開發者友好的 golang 時間處理庫&#xff0c;支持鏈式調用。 目前已被 awesome-go 收錄&#xff0c;如果您覺得不錯…