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

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

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從業人員的重複、繁瑣的工作量。

相關焦點

  • 使用Jenkins、Docker 構建部署 Serverless 應用
    Kubernetes 雲廠商提供的解決方案 …… 筆者這裡使用 Docker 運行 Jenkins,因為構建步驟也會運行在 Docker 中,需要將 docker.sock 和 docker 命令掛載到容器中,啟動 jenkins 命令如下: 注意:由於容器內
  • 手把手教你用 Jenkins+K8S 打造流水線環境
    朋友的真實操作流程,使用 Jenkins 和 Kubernetes 完成持續集成和持續部署,有搭建,有入門,手把手教學文檔,幹得擰不出水來,分享一波。 本文作者:孫丹丹,女,單身,DevOps 運維工程師,CKA 認證。
  • ELK入門使用-與springboot集成
    的分布式開源搜尋引擎,無須預先定義數據結構就能動態地對數據進行索引;Logstash用於日誌集中管理,包括從多臺伺服器上傳輸和轉發日誌,並對日誌進行豐富和解析,是一個數據管道,提供了大量插件來支持數據的輸入和輸出處理;最後是Kibana,提供了強大而美觀的數據可視化,Kibana完全使用HTML和Javascript編寫,它利用Elasticsearch 的RESTful API來實現其強大的搜索能力
  • 如何在Kubernetes容器環境下部署Spinnaker?
    本文重點介紹spinnaker的概念、安裝與踩過的坑,spinnaker在kubernetes的持續部署,以及線上容器服務的選擇與多區容災。 1、關於Spinnaker Spinnaker 是什麼?我們先來了解下它的概念。 Spinnaker 是 Netflix 的開源項目,是一個持續交付平臺,它定位於將產品快速且持續的部署到多種雲平臺上。Spinnaker 有兩個核心的功能集群管理和部署管理。
  • 如何在 Kubernetes 上配置 Jenkins?
    https://docs.docker.com/get-docker/2.Kubernetes集群。如果沒有運行中的Kubernetes集群的話,請參閱章節「使用minikube創建Kubernetes集群」3.HelmCLI。可以按照下方連結中的步驟安裝Helm CLI。
  • 企業安全之內部代碼管理平臺Gitlab下載及權限審計
    0x00 快速部署gitlab筆者使用了docker進行快速部署:docker pull gitlab/gitlab-eedocker run --detach --hostname gitlab.example.com --publish 443:443 --publish 80:80 --publish
  • GitLab 12.5發布,帶來EKS集成、Crossplane多雲託管和環境面板等
    GitLab的GKE集成旨在使Kubernetes的安裝更加容易,而且使多雲更加容易。GKE集成只是一個開始。更大願景是可以從各種雲廠商中可自由選擇,我們可以利用每個提供程序提供的獨特優勢並獲得可移植性,以將應用程式和工作負載移動到所選擇的雲中,並同GitLab保持相同的一致工作流。
  • 10分鐘搞定讓你困惑的 Jenkins 環境變量
    這類關鍵詞弄懵,也能很快構建出 pipeline 的骨架但是當向骨架中填充內容的時候,尤其如何利用環境變量(系統內置 | 自定義),多數人都會變得比較混亂,浪費很多時間,本文就幫助大家快速通關環境變量準備如果你想一邊閱讀本文,一邊實踐,但是沒有 Jenkins 服務可用,又想快速嘗試,可以應用 Docker 一個命令快速搭建 Jenkins 服務docker
  • GitLab 11.7發布支持Release,多級Epics和NPM 註冊
    將其集成到GitLab中意味著可以在git源碼中共享一個簡單的包命名約定,在任何Node.js項目中使用該庫。Kubernetes集成API支持新版本中, Kubernetes集成新添加了API支持。現在可以通過API訪問GUI中當前可用的所有操作,例如列出,添加和刪除Kubernetes集群。開發團隊可以使用此新功能將群操作集成添加到工作流程中。
  • 將Docker與pipeline一起使用
    例如,存儲庫可能同時具有基於Java的後端API實現和基於JavaScript的前端實現。結合使用Docker和Pipeline可以通過將指令與不同階段結合Jenkinsfile使用 多種技術agent {}。
  • 持續集成引擎 Jenkins 2.138.1 和 2.141 發布
    (issue 50336) Upgrade Winstone from 4.2 to 4.4 to update Jetty from 9.4.8.v20171121 to 9.4.11.v20180605, adding an option to enable JMX when running Jenkins using java -jar jenkins.war.
  • GitLab也開始國家封鎖?部分職位對中國、俄羅斯關閉,引社區熱議
    時隔幾個月,GitHub的對手——GitLab卻對中國下了手。近日,美國代碼託管網站 GitLab 在其官網上發表了一篇 issue,稱他們將啟用一份「職位國家封鎖」令,停止招聘居住在中國和俄羅斯的人擔任網絡可靠性工程師及支持職位,並禁止擔任這兩個職位的員工移居中國或俄羅斯。該公司稱,在當前的地緣政治環境下,「這是最為人道的解決方案」。
  • GitLab 發布新版本12.3,新增加Web應用防火牆和生產力分析等
    批准規則顯示在合併請求小部件中,因此可以輕鬆找到下一位審閱者。在GitLab 12.3中,已將對批准規則的支持添加到了項目和合併請求的API中。未解決討論的鍵盤快捷鍵審查,討論和解決反饋是GitLab中代碼審查的基礎。跳轉到下一個未解決的討論按鈕可以讓我們輕鬆地快速從討論轉到討論。
  • Docker & Singularity
    自從微軟更新了WSL2(雖然我一直在用WSL),但是發現docker只能在WSL2下使用,又是被需求更新。於是上網查了下window 家庭版的更新方法。打個補丁就好(可以參考該連結https://www.jianshu.com/p/a20c2d58eaac)。
  • 雲計算核心技術Docker教程: Docker 容器連接
    下面我們來實現通過埠連接到一個 docker 容器。我們創建了一個 python 應用的容器。命令如下:# docker run -d -P training/webapp python app.py另外,我們可以指定容器綁定的網絡地址,比如綁定 127.0.0.1。
  • Docker邁入雲(DockerHub)+端(Docker引擎)時代
    中國社區之前發表過OpenStack對Docker支持的思路,本次分析下Docker 新發布的 雲+端 開放平臺戰略。Docker簡介和快速發展開源項目Docker於2013年3月啟動,是由PaaS 提供商 dotCloud 開源的一個基於 LXC 的高級容器引擎,原始碼託管在 Github 上,基於谷歌發布的開源程式語言 Go。
  • 微服務部署到docker中
    可以看到項目根目錄下新增一個名為Dockerfile的文件6.通過Xftp將項目從Windows下的磁碟位置拷貝到Linux的root目錄下二、Linux下通過Docker構建應用1.通過Xshell連接上Linux虛擬機,進入到項目目錄下
  • CoreOS實踐指南(七):Docker容器管理服務
    事實上,Android實現沙盒同樣的基於Linux內核的cgroup和namespace機制用於限制和隔離資源的使用,所使用的技術與Docker如出一轍。這些早在Linux 2.6.x版本就已經加入了的新特性,已經通過了較長時間的檢驗,被證實是可行並且可靠的。
  • [易學springboot]對controller層進行單元測試
    在springboot中進行單元測試,大家已經非常熟悉。我們通常測試的是service層和dao層。對controller層的直接測試可能進行的較少。下面介紹一下在SpringBoot中進行Controller層的Rest請求測試的方法。