SpringBoot+GitLab+Docker+Jenkins實現持續集成下

2020-12-16 黑馬程式設計師

5. 編寫SpringBoot項目

Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力於在蓬勃發展的快速應用開發領域(rapid application development)成為領導者。

接下來我們來編寫一個最簡單的SpringBoot入門項目。

<?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 [url=http://maven.apache.org/xsd/maven-4.0.0.xsd]http://maven.apache.org/xsd/maven-4.0.0.xsd[/url]"> <modelVersion>4.0.0</modelVersion> <groupId>com.itheima</groupId> <artifactId>springboot_jenkins01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <!--所有的springboot工程都必須繼承spring-boot-starter-parent--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <!--web功能的起步依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </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> </plugins> </build></project>

5.2. 核心配置文件application.properties

由於我們是基礎入門項目,所以我們只需要新建一個application.properties文件放在resources目錄下(當然不放置也是可以的),內容為空即可。

5.3. Controller類

package com.itheima.controller;import org.springframework.web.bind.annotation.DeleteMapping;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class QuickController {@GetMapping("/quick") public String quick(){ return "歡迎使用 springboot !Jenkins"; }}

5.4. 引導類

package com.itheima;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class SpringbootQuickApplication {public static void main(String[] args) { SpringApplication.run(SpringbootQuickApplication.class, args); }}

5.5. 運行項目

我們運行引導類的main方法即可運行項目,此時控制臺會輸出如下日誌,注意觀察標紅的部分,由於我們並沒有進行任何的配置,項目自動運行在了埠號為8080的tomcat中,項目名也默認為「」。

我們在瀏覽器中輸入"localhost:8080/quick",可以觀察到下圖的輸出,這說明我們的項目已正常運行。

5.6. pom_docker_registry.xml

由於我們接下來會使用Jenkins把項目打包成Docker鏡像,我們需要添加一個專門用於Docker的pom文件。內容為如下代碼塊:

<?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 [url=http://maven.apache.org/xsd/maven-4.0.0.xsd]http://maven.apache.org/xsd/maven-4.0.0.xsd[/url]"> <modelVersion>4.0.0</modelVersion> <groupId>com.itheima</groupId> <artifactId>springboot_jenkins01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <!--web功能的起步依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <finalName>${project.artifactId}-${project.version}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <!--docker鏡像相關的配置信息--> <configuration> <!--鏡像名,這裡用工程名--> <imageName>${project.artifactId}-${project.version}</imageName> <!--Dockerfile文件所在目錄--> <dockerDirectory> ${project.basedir}/src/main/resources </dockerDirectory> <!--TAG,這裡用工程版本號--> <imageTags> <imageTag>${project.version}</imageTag> </imageTags> <registryUrl>192.168.25.130:5000</registryUrl> <pushImage>true</pushImage> <imageName> 192.168.25.130:5000/${project.artifactId}:${project.version} </imageName> <!--構建鏡像的配置信息--> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include> ${project.artifactId}-${project.version}.jar </include> </resource> </resources> </configuration> </plugin> </plugins> </build></project>

5.7. 配置Dockerfile

在resources目錄下創建Dockerfile文件,該文件用於構建docker鏡像,文件名稱必須是Dockerfile。

FROM java:8ENV ARTIFACTID springboot_jenkins01ENV ARTIFACTVERSION 1.0-SNAPSHOTENV HOME_PATH /homeWORKDIR $HOME_PATHADD /$ARTIFACTID-$ARTIFACTVERSION.jar $HOME_PATH/$ARTIFACTID.jarENTRYPOINT ["java", "-jar", "springboot_jenkins01.jar"]

這一切都準備完畢之後,我們把項目push到上一節搭建好的GitLab中。

6. Jenkins

Jenkins是一個開源軟體項目,是基於Java開發的一種持續集成工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續集成變成可能。

6.1. 安裝Jenkins6.1.1. 下載Docker鏡像

docker pull jenkinsci/blueocean

6.1.2. 創建Docker容器

docker create --name jenkins -u root -p 8889:8080 --privileged=true -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v /home/jenkins:/home docker.io/jenkinsci/blueocean

6.1.3. 啟動Docker容器

docker start Jenkins

6.1.4. 訪問Jenkins

在瀏覽器中輸入192.168.25.130:8889,可以觀察到下面的頁面,第一次啟動需要耐心的等待,時間比較久,另外還需要解鎖密碼,密碼在下圖標紅的位置。

6.1.5. 進入容器查看密碼

docker exec -it jenkins /bin/bashcat /var/jenkins_home/secrets/initialAdminPassword

6.2. 配置Jenkins6.2.1. 插件安裝

進入Jenkins中,我們可以進行插件的安裝,先選擇下圖第一個選項即可。

6.2.2. 創建用戶

6.2.3. 保存進入

6.2.4. 設置JDK、Maven、Git

進入【系統管理】,點擊【全局工具配置】,設置JDK、Git和Maven,我們可以選擇自動安裝。

6.2.5. 設置全局憑據

根據下圖我們設置下全局的憑據,注意此處要設置的是當前CentOS7的用戶名和密碼

6.3. 創建Jenkins任務6.3.1. 輸入任務名稱,選擇【構建一個自由風格的軟體項目】

6.3.2. 設置GitLab中項目的地址

6.3.3. 添加構建腳本

腳本內容:

#!/bin/bashresult=$(docker ps | grep "192.168.25.130:5000/springboot_jenkins01")if [[ "$result" != "" ]]thenecho "stop springboot_jenkins01"docker stop springboot_jenkins01firesult1=$(docker ps -a | grep "192.168.25.130:5000/springboot_jenkins01")if [[ "$result1" != "" ]]thenecho "rm springboot_jenkins01"docker rm springboot_jenkins01firesult2=$(docker images | grep "192.168.25.130:5000/springboot_jenkins01")if [[ "$result2" != "" ]]thenecho "192.168.25.130:5000/springboot_jenkins01:1.0-SNAPSHOT"docker rmi 192.168.25.130:5000/springboot_jenkins01:1.0-SNAPSHOTfi

6.3.4. 添加頂層Maven目標

clean package -f pom_docker_registry.xml -DskipTests docker:build

6.3.5. 添加Shell執行腳本

腳本內容

docker run --name springboot_jenkins01 -p 50101:50101 -idt 192.168.25.130:5000/springboot_jenkins01:1.0-SNAPSHOT docker logs -f springboot_jenkins01

6.4. 執行任務

點擊項目的左側菜單中的【立即構建】,可以觀察到下面的日誌內容,日誌太長,我分段給大家截取:

從gitlab中拉取源碼

2.停止並刪除之前運行的容器

3.通過Maven構建Docker鏡像

4.創建並運行Docker容器

此時在瀏覽器中訪問192.168.25.130:28080/quick,可以看到以下頁面,這也正是我們最初在本機運行時看到的內容

6.5. 配置鉤子

到此為止,我們已經實現了運行Jenkins任務,自動執行GitLab的代碼,但是我們還無法實現當GitLab中的代碼發生變化時,Jenkins自動構建任務的功能。接下來,我們配置下WebHook,來實現該功能。

6.5.1. 安裝GitLab插件

6.5.2. 安裝GitLab WebHook插件

6.5.3. Jenkins中配置Build Triggers

打開我們在Jenkins的任務進行設置,勾選Build Triggers,選擇下面標紅的複選框,並且複製其中的超連結。

6.5.4. GitLab配置webhook

打開GitLab中我們的項目,點擊設置中的Integrations,在URL中填入我們剛剛在Jenkins中粘貼的超連結。

6.5.5. 測試webhook

添加完webHook之後,我們點擊test按鈕,進行推送測試。

觀察Jenkins中,會發現Jenkins已經自動執行了該任務。這說明我們的webhook也已經正確配置了。

7. 總結

經過我們多款軟體的安裝配置,我們逐步掌握了如何上傳SpringBoot項目到GitLab中,並使用Jenkins自動構建任務,另外依託於Docker,讓這一切變得更加方便,希望大家都多多思考,讓機器自動幹活,減少我們IT從業人員的重複、繁瑣的工作量。

相關焦點

  • SpringBoot+GitLab+Docker+Jenkins實現持續集成上
    概述本文主要介紹持續集成的搭建方式,採用Docker的方式去搭建Jenkins環境,另外會涉及到SpringBoot和Git等技術。2.可以採用持續集成來解決上述問題,那持續集成又是什麼呢?大師Martin Fowler對 持續集成 是這樣定義的:持續集成是一種軟體開發實踐,即團隊開發成員經常集成他們的工作,通常每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而儘快地發現集成錯誤。
  • Docker安裝Jenkins+Shell腳本自動化部署項目
    接下我們會分成三部分來講解:docker安裝JenkinsJenkins首次登錄配置構建一個項目完成自動部署docker安裝Jenkins我們在linux環境使用Docker安裝一個Jenkins,你需要事先安裝Docker
  • Jenkins持續集成
    1.1 持續集成介紹1.1.1問題描述傳統的軟體開發流程如下:1、項目經理分配模塊給開發人員2、每個模塊的開發人員並行開發,並進行單元測試1.1.2 什麼是持續集成持續集成(Continuous integration)簡稱CI,持續集成的思想是每天要多次將代碼合併到主幹,並進行集成、測試,這樣就可以提早發現錯誤,進行修正。
  • Docker+jenkins小知識,講解通俗易懂,有必要收藏
    持續集成是軟體開發中一個非常重要的環節,我們都知道持續集成的這種方式,不僅僅是影響軟體開發的效率,實際上還會對我們軟體開發的流程會產生一定的影響,例如:我們所選擇的構建的方式,那麼你的應用程式的部署的方式,軟體開發與測試需要不斷地對應用進行持續構建,這些都會受我們持續集成的構建的方案所影響。
  • Jenkins+Docker+SpringCloud+K8s構建持續集成平臺
    Jenkins是什麼Jenkins是一個開源軟體項目,是基於Java開發的一種持續集成工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續集成變成可能。Jenkins的6大特徵:開源的ava語言開發持續集成工具,支持持續集成,持續部署易於安裝部署配置可通過yum安裝,或下載war包以及通過docker容器等快速實現安裝部署可方便web界面配置管理。
  • 手把手教你利用Docker+jenkins部署你的網站
    中文版docker pull jenkinszh/jenkins-zh這裡選擇的是中文的鏡像創建存儲目錄並授權(很重要)mkdir /home/jenkins_homedocker run -d -p 9090:8080 -p 50000:50000 --name myjenkins -v /home/jenkins_home/:/var/jenkins_home -v /usr/bin/git:/usr/bin/git -v /root/envi/java:/usr/local/java -v /root/envi
  • Jenkins 憑證管理 - 看這一篇就夠了~
    Credential 使用參考: https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#handling-credentials存儲在Jenkins中的credentials可以被使用:
  • 微服務下的持續集成-Jenkins自動化部署GitHub項目
    @目錄一、前言二、DevOps概念三、為什麼要做持續集成四、常見雲服務五、手動部署Jenkins 5.1 準備工作5.2 下載三、為什麼要做持續集成持續集成服務(Continuous Integration,簡稱 CI)它綁定 Github 上面的項目,只要有新的代碼,就會自動抓取。然後,提供一個運行環境,執行測試,完成構建,還能部署到伺服器。
  • 手把手教你用 Jenkins+K8S 打造流水線環境
    朋友的真實操作流程,使用 Jenkins 和 Kubernetes 完成持續集成和持續部署,有搭建,有入門,手把手教學文檔,幹得擰不出水來,分享一波。 本文作者:孫丹丹,女,單身,DevOps 運維工程師,CKA 認證。
  • 京東、華為都在用的Jenkins持續集成,但是真的有那麼好嗎
    >開源的Java語言開發持續集成工具,支持持續集成,持續部署。易於安裝部署配置:可通過yum安裝,或下載war包以及通過docker容器等快速實現安裝部署,可方便web界面配置管理。消息通知及測試報告:集成RSS/E-mail通過RSS發布構建結果或當構建完成時通過e-mail通知,生成JUnit/TestNG測試報告。
  • Jenkins與GitLab CI/CD的深入評估和比較
    【51CTO.com快譯】近年來,隨著持續集成(CI)和持續交付(CD)在業界的廣泛採用,針對DevOps質量檢查的測試也在與時俱進。目前,在眾多CI/CD測試工具中,最常用的莫過於Jenkins和GitLab CI/CD這兩個工具。Jenkins發布於2011年,專注於CI/CD業務,一直是測試人員的首選。
  • Jenkins Pipeline實例
    Jenkins 多分支流水線 Jenkins 流水線是一套插件,它支持實現和集成持續交付流水線到 Jenkins。流水線提供了一組可擴展的工具,用於通過流水線 DSL 將簡單到複雜的交付流水線建模為「代碼」。
  • 手把手教你在Linux下搭建Jenkins實現自動部署
    Jenkins是一個開源的自動化伺服器,可以用來輕鬆地建立持續集成和持續交付(CI/CD)管道。持續集成(CI)是一種DevOps實踐,在這種實踐中,團隊成員定期將他們的代碼更改提交到版本控制存儲庫,然後運行自動化的構建和測試。
  • Jenkins 多環境 CI/CD 架構設計
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫來源:https://url.cn/5VKO1Gu自動化部署主要是為了解決項目多、環境多、持續集成慢、部署操作麻煩、手動操作易出錯、自動化運維等問題。
  • 使用Kubernetes 和 Jenkins 創建一個 CI/CD 流水線
    CI/CD 表示持續集成/持續交付和/或部署。如果一個團隊不接入 CI/CD 流程就必須要在產生一個新的軟體產品時經歷如下的階段:產品經理(代表了客戶利益)提供了產品需要有的功能以及產品需要遵從的行為。文檔必須要越詳實越好。
  • 12個可以替代jenkins的CI/CD工具
    精華推薦:重磅發布 - 自動化框架基礎指南pdfJenkins是一個開源的持續集成平臺,是DevOps生命周期中的一個重要工具。但是,與當前的用戶界面趨勢相比,它的界面已經過時,用戶界面也不夠友好(苦葉子推薦你用script pipeline:Jenkins之jenkinsfile基礎)。此外,Jenkin配置可能比較複雜,而且它還有許多其他缺點。這裡列出了幾種可以替代Jenkins的工具。這個列表折衷了具有流行特性和最新下載連結的商業和開源的continuos集成工具。
  • GitLab 13.7,增加MR審閱者,部署失敗時自動回滾等功能
    此功能的實現與底層的日誌記錄庫緊密耦合,這是我們在不影響可用功能的情況下切換依賴關係的能力的限制。為了簡化註冊表功能和配置,將刪除對日誌記錄Hook的支持。在GitLab Runner 14.0中,我們計劃刪除非尖峰時間模式下的舊配置選項。
  • GitLab 12.7發布支持父子管道、blame視圖、結構化日誌等
    GitLab支持使用增量式對Kubernetes生產系統的手動觸發和定時式部署,以支持持續交付和持續部署的應用程式。該策略已經在Auto DevOps項目中可用。新版本提供一份新指南,顯示僅使用GitLab CI/CD時如何獲得相同的結果。
  • Jenkins 從持續交付基金會畢業
    持續交付基金會宣布 Jenkins 成為其第一個畢業項目。
  • 如何在 Kubernetes 上配置 Jenkins?
    https://docs.docker.com/get-docker/2.Kubernetes集群。如果沒有運行中的Kubernetes集群的話,請參閱章節「使用minikube創建Kubernetes集群」3.HelmCLI。可以按照下方連結中的步驟安裝Helm CLI。