持續集成之 Spring Boot 實戰篇

本文做者: CODING 用戶 - 何健

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

思路

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

這種狀況,一般會將 jenkins 安裝在服務器上,確保構建測試等操做環境和線上環境一致。python

此時一般會在 jenkins 中配置好須要持續集成的倉庫,以及具體流程。git

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

那麼,咱們就須要更高級的方式,能夠線上環境以外的構建測試,最終部署到線上環境。「CODING 持續集成」正是提供這類持續集成模式的平臺。spring

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

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

這樣作的優勢:不會影響在線服務;
缺點:部署地機器最好是能夠公網訪問的,不然會沒法完成後續分發步驟。api

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

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

  • 捋一下思路

咱們此次實戰針對後一種思路ruby

  1. 檢出代碼
  2. 構建
  3. 測試
  4. 分發
  5. 觸發部署

實戰

  • 實際體驗,仍是很不錯的。

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

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

一、首先,咱們須要進入準備持續集成的項目。

這裏我用 start.spring.io 初始化一個 demo 示例項目,並推送到倉庫。

爲了方便你們,親自體驗,我準備了一個現成的倉庫,能夠直接 git clone 下來再 git push 到本身帳戶下使用。倉庫地址:demoForCI

二、解壓 demo 項目,進入 demo 目錄,初始化倉庫。

cd g:\demo\
      git init
      git set remote giturl
      git add ./
      git commit -m 'init repo'
      git push -u origin master

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

三、開始體驗

倉庫準備好後,就能夠開始體驗「CODING 持續集成」

第一次的使用,須要先建立一個 Jenkinsfile,不少小夥伴會說,第一次用,不知道是啥。
不要緊,「CODING 持續集成」已經給咱們準備好了模板,很是容易理解,能夠認爲是特定格式語法寫一套 task 流程。

點擊一下 「簡易模板」,更具實際狀況修改一下就能夠。

  • 第二步:編寫 Jenkinsfile

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

一、配置構建環境,「CODING 持續集成」目前支持 java-八、python-3.五、ruby-2.三、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#agents
      label "java-8"
    }

二、檢出

這裏不得不說,「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]]]
          )
      }
    }

三、構建

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>

四、測試

這裏我偷個懶,只作了單元測試,
沒有提取測試報告,你們能夠根據實際項目定製這個流程。

stage("測試") {
      steps {
          echo "單元測試中..."
          sh 'mvn test'
          echo "單元測試完成."
          //junit 'target/surefire-reports/*.xml' // 收集單元測試報告的調用過程
      }
    }

五、分發 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 "準備部署"
      }
    }

六、部署

前面有提到,這裏部署仍然須要觸發一個鉤子,不然只能手動部署了。

這裏我寫了一個最簡單的,實際上咱們能夠寫細緻一點,判斷一下接口返回的結果再根據結果輸出部署狀況。

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#agents
        label "java-8"
    }
    stages  {
        // 檢出倉庫
        stage("檢出") {
            steps {
                // 這裏sh調用ci-init 初始化
                sh 'ci-init'
                // 這裏檢出倉庫,默認檢出分支爲環境變量中的GIT_BUILD_REF
                checkout(
                  [$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 來觸發hook
                sh '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 流程全自動化,爲企業提供軟件研發全流程管理工具,打通了從團隊構建、產品策劃、開發測試到部署上線的全過程。

相關文章
相關標籤/搜索