效能環境之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資料,測試成功。