1. 程式人生 > >效能環境之Jenkins+Maven自動化部署SpringBoot壓測環境(Docker篇)

效能環境之Jenkins+Maven自動化部署SpringBoot壓測環境(Docker篇)

文章目錄

前言

在上文效能環境之Jenkins+Maven自動化部署SpringBoot壓測環境(實戰篇)中我們介紹了常規部署流程,本文將在上文的基礎上擴充套件Jenkins+Maven+Docker自動化部署我們的壓測環境。

關於Docker

Docker在這裡有什麼用?

Docker,是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低。
Docker是基礎架構的管理員。它將能夠打包軟體及其所有依賴項以作為容器執行。您可以將應用(作為docker映象打包)部署到安裝了docker的任何計算機中。它將軟體與硬體分開 - 因此開發人員可以放心,應用程式將在任何計算機上執行,​​而不管機器可能具有哪些可能與用於編寫和測試程式碼的機器不同的自定義設定。

題外話:本人覺得,每個Tester都應該瞭解下Docker,畢竟我們不是專業的運維,如果花費大量時間在倒騰一些環境的安裝,也是蠻枯燥乏味的。使用了Docker可以減少很多的時間,可以直接上手部署各式各樣的環境了。真的很Nice呀!

整體設計

在這裡插入圖片描述

新建Jenkins Job

我們在上文常規部署Job基礎上覆制一個新的job
在這裡插入圖片描述

配置Job

Post Steps

Send files or execute commands over SSH中的Exec command修改為jenkins-in/buildimage.sh
在這裡插入圖片描述

新建buildimage指令碼

測試應用服務上/root/jenkins-in

目錄新建buildimage.sh

# 設定系統時間
DATE=$(date +%Y%m%d)
# 設定程式目錄
DIR=/usr/local/app
# 設定Jar名稱
JARFILE=person-0.0.1-SNAPSHOT.jar
# 設定Docker映象&容器名稱
SERVER_NAME=springboot-docker-demo
# 容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
# 映象id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')

# 判斷是否存在backp目錄,如果不儲存就建立
if [ ! -d $DIR/backup ];then
   mkdir -p $DIR/backup
fi
cd $DIR

# 殺掉當前的容器及映象
docker stop $CID
docker rm $CID
docker rmi $IID

# 備份舊程式
mv $JARFILE $DIR/backup/$JARFILE$DATE
# 部署新程式
mv -f /root/jenkins-in/$JARFILE .
# build映象
docker build -t $SERVER_NAME .

echo "The service will be starting"
# 執行容器
docker run --name $SERVER_NAME -d -p 8081:8081 $SERVER_NAME

cd backup/
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
echo "starting success!!!"
~                                

建立Dockerfile

測試應用伺服器/usr/local/app下建立Dockerfile

# Dockerfile
# 基於的映象
FROM frolvlad/alpine-oraclejdk8

# 資料掛載點
VOLUME /usr/local/app/logs

# 指定路徑下的copy內容到容器中路徑下
ADD person-0.0.1-SNAPSHOT.jar /usr/local/app/app.jar

# 指定映象的預設入口
# -Djava.security.egd=file:/dev/./urandom 可解決tomcat可能啟動慢的問題
ENTRYPOINT java ${JAVA_OPTS} ${JVM_GC_LOG_PATH} -Djava.security.egd=file:/dev/./urandom -jar /usr/local/app/app.jar

# 對外埠
EXPOSE 8081

# 工作目錄
WORKDIR /usr/local/app

# JVM引數
ARG JAVA_OPTS="-server -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=256M \
-XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails \
-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 \
-Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false"

# log路徑
ARG JVM_GC_LOG_PATH="-XX:ErrorFile=/usr/local/app/logs/gc/hs_err_pid%p.log -XX:HeapDumpPath=/usr/local/app/logs/gc"

# JVM環境變數
ENV JAVA_OPTS=${JAVA_OPTS}
ENV JVM_GC_LOG_PATH=${JVM_GC_LOG_PATH}

部署專案

點選“立即構建”,任務控制檯將實時輸出相關資訊
在這裡插入圖片描述
我們看到輸出了starting success!!!,說明我們需要的應用容器已經跑起來了!

我們可以去測試應用伺服器驗證下

[[email protected] app]# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
springboot-docker-demo                 latest              c1916f7c7aac        46 minutes ago      197 MB
docker.io/frolvlad/alpine-oraclejdk8   latest              b81355b10fa3        6 days ago          168 MB
quay.io/influxdb/influxdb              nightly             4fb0d5f41632        7 weeks ago         262 MB
docker.io/influxdb                     latest              dff45714308e        7 weeks ago         213 MB
docker.io/mongo                        latest              a41c82c0998a        2 months ago        380 MB
docker.io/mysql                        5.7                 43b029b6b640        2 months ago        372 MB
docker.io/redis                        latest              4e8db158f18d        2 months ago        83.4 MB
docker.io/nginx                        latest              c82521676580        3 months ago        109 MB
docker.io/jenkins                      latest              cd14cecfdb3a        3 months ago        696 MB
docker.io/redis                        3.2                 e2e6164a20de        3 months ago        76 MB
docker.io/hello-world                  latest              2cb0d9787c4d        3 months ago        1.85 kB
docker.io/primetoninc/jdk              1.7                 2b2bf2dcec72        6 months ago        589 MB
docker.io/primetoninc/jdk              latest              4f4be6992080        9 months ago        879 MB
docker.io/primetoninc/jdk              1.8                 f4b4fccc65bb        9 months ago        657 MB
docker.io/ubuntu                       15.10               9b9cb95443b5        2 years ago         137 MB
[[email protected] app]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                              NAMES
ef0c317eb320        springboot-docker-demo   "/bin/sh -c 'java ..."   46 minutes ago      Up 46 minutes       0.0.0.0:8081->8081/tcp                             springboot-docker-demo
9f5891f311b9        docker.io/mongo          "docker-entrypoint..."   8 weeks ago         Up 15 hours         0.0.0.0:27017->27017/tcp                           mongo
0e1e223051d1        jenkins                  "/bin/tini -- /usr..."   2 months ago        Up 15 hours         0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   myjenkins
c24e1ac84a60        mysql:5.7                "docker-entrypoint..."   2 months ago        Up 15 hours         0.0.0.0:3306->3306/tcp, 33060/tcp                  mymysql
[[email protected] app]# docker logs ef0c317eb320
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=256M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.3.RELEASE)
2018-10-29 08:27:52.388  INFO 1 --- [           main] com.techstar.person.PersonApplication    : Starting PersonApplication v0.0.1-SNAPSHOT on ef0c317eb320 with PID 1 (/usr/local/app/app.jar started by root in /usr/local/app)
2018-10-29 08:27:52.413  INFO 1 --- [           main] com.techstar.person.PersonApplication    : The following profiles are active: a
2018-10-29 08:27:52.633  INFO 1 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]5f150435: startup date [Mon Oct 29 08:27:52 GMT 2018]; root of context hierarchy
[Full GC (Metadata GC Threshold) [Tenured: 0K->16498K(699072K), 0.1457872 secs] 184618K->16498K(1013632K), [Metaspace: 20819K->20819K(1069056K)], 0.1458659 secs] [Times: user=0.13 sys=0.01, real=0.14 secs] 
2018-10-29 08:27:57.331  INFO 1 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8081 (http)
2018-10-29 08:27:57.365  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2018-10-29 08:27:57.382  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.14
2018-10-29 08:27:57.599  INFO 1 --- [ost-startStop-1] o.a.c.c.C.[.[localhost].[/springboot]    : Initializing Spring embedded WebApplicationContext
2018-10-29 08:27:57.600  INFO 1 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 4984 ms
2018-10-29 08:27:57.993  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2018-10-29 08:27:58.012  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-10-29 08:27:58.012  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-10-29 08:27:58.012  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-10-29 08:27:58.012  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
[GC (Allocation Failure) [DefNew: 279616K->13447K(314560K), 0.0690457 secs] 296114K->29946K(1013632K), 0.0690980 secs] [Times: user=0.06 sys=0.01, real=0.07 secs] 
2018-10-29 08:28:00.486  INFO 1 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2018-10-29 08:28:00.526  INFO 1 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
	name: default
	...]
2018-10-29 08:28:00.672  INFO 1 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.0.12.Final}
2018-10-29 08:28:00.676  INFO 1 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2018-10-29 08:28:00.684  INFO 1 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
[Full GC (Metadata GC Threshold) [Tenured: 16498K->29548K(699072K), 0.1120392 secs] 152567K->29548K(1013632K), [Metaspace: 34944K->34944K(1081344K)], 0.1121033 secs] [Times: user=0.10 sys=0.01, real=0.11 secs] 
2018-10-29 08:28:00.915  INFO 1 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2018-10-29 08:28:01.318  INFO 1 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2018-10-29 08:28:02.157  INFO 1 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
[GC (Allocation Failure) [DefNew: 279616K->10432K(314560K), 0.0668048 secs] 309164K->39980K(1013632K), 0.0668578 secs] [Times: user=0.06 sys=0.00, real=0.07 secs] 
2018-10-29 08:28:03.692  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot[email protected]5f150435: startup date [Mon Oct 29 08:27:52 GMT 2018]; root of context hierarchy
2018-10-29 08:28:03.932  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/person/age/{age}],methods=[GET]}" onto public java.util.List<com.techstar.person.entity.Person> com.techstar.person.controller.PersonController.personListByAge(java.lang.Integer)
2018-10-29 08:28:03.943  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/person/two],methods=[POST]}" onto public void com.techstar.person.controller.PersonController.personTwo()
2018-10-29 08:28:03.944  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/person/{id}],methods=[DELETE]}" onto public void com.techstar.person.controller.PersonController.personDelete(java.lang.Integer)
2018-10-29 08:28:03.944  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/person/find/{id}],methods=[GET]}" onto public com.techstar.person.entity.Person com.techstar.person.controller.PersonController.personFindOne(java.lang.Integer)
2018-10-29 08:28:03.947  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/persion/{id}],methods=[PUT]}" onto public com.techstar.person.entity.Person com.techstar.person.controller.PersonController.personUpdate(java.lang.Integer,java.lang.String,java.lang.Integer)
2018-10-29 08:28:03.947  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/person],methods=[POST]}" onto public com.techstar.person.entity.Result com.techstar.person.controller.PersonController.personAdd(com.techstar.person.entity.Person,org.springframework.validation.BindingResult)
2018-10-29 08:28:03.947  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/person],methods=[GET]}" onto private java.util.List<com.techstar.person.entity.Person> com.techstar.person.controller.PersonController.personlist()
2018-10-29 08:28:03.958  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2018-10-29 08:28:03.959  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2018-10-29 08:28:04.068  INFO 1 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-10-29 08:28:04.068  INFO 1 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-10-29 08:28:04.120  INFO 1 --- [           main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandle
2018-10-29 08:28:04.176  INFO 1 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-10-29 08:28:04.738  INFO 1 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-10-29 08:28:04.995  INFO 1 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8081 (http)
2018-10-29 08:28:05.008  INFO 1 --- [           main] com.techstar.person.PersonApplication    : Started PersonApplication in 13.941 seconds (JVM running for 15.278)
PersonApplication.main

我們可以看到springboot-docker-demo映象已經成功執行起來

測試驗證

此處,我們還是使用Postman驗證應用查詢人員介面
在這裡插入圖片描述
我們可以看到應用成功返回了JSON資料,測試成功。