写点什么

基于 SpringBoot 开源项目 JeeSite 的持续交互介绍

用户头像
Java王路飞
关注
发布于: 2021 年 02 月 04 日
基于SpringBoot开源项目JeeSite的持续交互介绍

一、实战项目介绍- JeeSite

  • 基于 Spring Boot 2.0

  • 数据存储 MySQL

  • 语言:Java

  • 规模大小:适中,适合初学者

源码地址:https://gitee.com/thinkgem/jeesite4

本次项目演练地址:https://gitee.com/sfboy/iJeeSite4 ,在原作者的项目上,增加了 Pipline 持续集成的脚本,便于实战使用

二、环境准备

Spring Boot 项目运行配置:MySQL+Java+Maven

MySQL 安装参考:https://www.cnblogs.com/feng0815/p/14041558.html

Maven 安装参考: https://www.cnblogs.com/feng0815/p/14354226.html

Java 安装参考:自行百度。。

三、项目配置、调试、运行

3.1 初始化

  • 打开 JeeSite4/web/src/main/resources/config/application.yml,填写数据库配置(地址、IP 端口、用户名、密码)

  • 进入项目路径 JeeSite4/web/bin,运行初始化脚本程序 init-data.sh(Windows 下运行 init-data.bat)

初始化脚本用来创建初始数据,初始化前要保证数据库中有 jeesite 数据库,否则会造成无法连接 jeesite 数据库,初始化失败

开始执行


执行结束

3.2 配置项目

3.2.1 使用 IDE 编译

添加 JeeSite4/root/pom.xml Maven 根节点到 IDE 的 maven view 中,其余依赖 module 会根据配置一起导入

Maven 编译、打包

在 Maven view 中选中 JeeSite Root 下 Lifecycle 中的 clean + install,然后单击运行按钮

3.2.2 在命令行编译

进入到 JeeSite4/root 目录下,运行 mvn clean install


3.3 运行项目 demo

3.3.1 在 IDE 运行

展开 JeeSite Web → Plugins → spring-boot → spring-boot:run ,单击运行


运行成功


访问项目:http://localhost:8980/a/login


输入用户名 system,密码 admin,点击登录

3.3.2 在命令行运行

进入到 JeeSite4/web 目录下,运行:mvn clean spring-boot:run -Dmaven.test.skip=true(Dmaven.test.skip=true,不运行单元测试)


运行成功


四、Tomcat 部署持续交互实战

4.1 Tomcat 运行和配置入门

下载,官网:https://tomcat.apache.org/


直接解压到安装目录即可

Tomcat 基本配置

  • 启动:bin/startup.sh

  • 停止:bin/shutdown.sh

  • 配置文件:conf/server.xml(配置端口号)

  • 日志:logs/catalina.out

4.2 使用 Jenkins Pipline 任务部署 Spring 应用到 Tomcat

4.2.1 Jenkins 参数配置,设置 Pipline 脚本中所需的参数


创建 Jenkins Pipline 任务


设置代码分支,默认分支为 master

4.2.2 配置 Pipline 脚本


运行,构建任务


构建成功,打开项目页面:http://localhost:8080/a/login

Pipline 代码如下(Scripted Pipeline):

node('master') {    stage('同步源码') {            git([url: 'https://gitee.com/sfboy/iJeeSite4.git', branch: '${branch}'])    }
stage('maven编译打包') { sh ''' . ~/.bash_profile export pwd=`pwd` export os_type=`uname` cd web/src/main/resources/config if [[ "${os_type}" == "Darwin" ]]; then sed -i "" "s/mysql_ip/${mysql_ip}/g" application.yml sed -i "" "s/mysql_port/${mysql_port}/g" application.yml sed -i "" "s/mysql_user/${mysql_user}/g" application.yml sed -i "" "s/mysql_pwd/${mysql_pwd}/g" application.yml else sed -i "s/mysql_ip/${mysql_ip}/g" application.yml sed -i "s/mysql_port/${mysql_port}/g" application.yml sed -i "s/mysql_user/${mysql_user}/g" application.yml sed -i "s/mysql_pwd/${mysql_pwd}/g" application.yml fi cd $pwd/root mvn clean install -Dmaven.test.skip=true cd $pwd/web mvn clean package spring-boot:repackage -Dmaven.test.skip=true -U ''' }
stage('停止 tomcat') { sh ''' ## 停止tomcat的函数, 参数$1带入tomcat的路径$TOMCAT_PATH killTomcat() { pid=`ps -ef|grep $1|grep java|awk '{print $2}'` echo "tomcat Id list :$pid" if [ "$pid" = "" ] then echo "no tomcat pid alive" else kill -9 $pid fi } ## 停止Tomcat killTomcat $tomcat_home ''' }
stage('清理环境') { sh ''' ## 删除原有war包 rm -f $tomcat_home/webapps/ROOT.war rm -rf $tomcat_home/webapps/ROOT ''' }
stage('部署新的war包') { sh ''' cp web/target/web.war $tomcat_home/webapps/ cd $tomcat_home/webapps mv web.war ROOT.war ''' }
stage('启动tomcat') { sh ''' JENKINS_NODE_COOKIE=dontkillme cd $tomcat_home/bin sh startup.sh ''' }}
复制代码

五、docker 部署持续交互实战


Pipline 脚本(Declarative Pipeline)

pipeline {    agent {        label 'master'    }
environment { docker_image_name = 'jeesite4' docker_container_name = 'iJeesite4' PATH = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin" }
parameters { string(name: 'branch', defaultValue: 'master', description: 'Git branch') }
stages{ stage('同步源码') { steps { git url:'https://gitee.com/sfboy/iJeeSite4.git', branch:'$branch' } }
stage('设定配置文件'){ steps{ sh ''' . ~/.bash_profile export os_type=`uname` cd ${WORKSPACE}/web/bin/docker if [[ "${os_type}" == "Darwin" ]]; then sed -i "" "s/mysql_ip/${mysql_docker_ip}/g" application-prod.yml sed -i "" "s/mysql_port/${mysql_port}/g" application-prod.yml sed -i "" "s/mysql_user/${mysql_user}/g" application-prod.yml sed -i "" "s/mysql_pwd/${mysql_pwd}/g" application-prod.yml else sed -i "s/mysql_ip/${mysql_docker_ip}/g" application-prod.yml sed -i "s/mysql_port/${mysql_port}/g" application-prod.yml sed -i "s/mysql_user/${mysql_user}/g" application-prod.yml sed -i "s/mysql_pwd/${mysql_pwd}/g" application-prod.yml fi ''' } }
stage('Maven 编译'){ steps { sh ''' . ~/.bash_profile cd ${WORKSPACE}/root mvn clean install -Dmaven.test.skip=true cd ${WORKSPACE}/web mvn clean package spring-boot:repackage -Dmaven.test.skip=true -U ''' } }
stage('停止 / 删除 现有Docker Container/Image '){ steps { script{ try{ sh 'docker stop $docker_container_name' }catch(exc){ echo "The container $docker_container_name does not exist" }
try{ sh 'docker rm $docker_container_name' }catch(exc){ echo "The container $docker_container_name does not exist" }
try{ sh 'docker rmi $docker_image_name' }catch(exc){ echo "The docker image $docker_image_name does not exist" } } } }
stage('生成新的Docker Image'){ steps { sh ''' . ~/.bash_profile cd ${WORKSPACE}/web/bin/docker rm -f web.war cp ${WORKSPACE}/web/target/web.war . docker build -t $docker_image_name . ''' } }
stage('启动新Docker实例'){ steps { sh ''' docker run -d --name $docker_container_name -p 8981:8980 $docker_image_name ''' } } }}
复制代码




六、生产与测试环境分离持续交互实战

需要在 Pipline 脚本中区分环境,具体脚本如下

pipeline {    agent {        label 'master'    }
environment { docker_image = 'jeesite4' docker_container = 'iJeesite4' PATH = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin" }
parameters { string(name: 'branch', defaultValue: 'master', description: 'Git branch') choice(name: 'env', choices: ['prod', 'qa'], description: 'Environment Type') }
stages{ stage('同步源码') { steps { git url:'https://gitee.com/sfboy/iJeeSite4.git', branch:'${branch}' } }
stage('设定配置文件'){ steps{ sh ''' . ~/.bash_profile if [[ "${env}" == "prod" ]]; then export mysql_ip=${mysql_prod_ip} export mysql_port=${mysql_prod_port} else export mysql_ip=${mysql_qa_ip} export mysql_port=${mysql_qa_port} fi export os_type=`uname` cd ${WORKSPACE}/web/bin/docker if [[ "${os_type}" == "Darwin" ]]; then sed -i "" "s/mysql_ip/${mysql_ip}/g" application-${env}.yml sed -i "" "s/mysql_port/${mysql_port}/g" application-${env}.yml sed -i "" "s/mysql_user/${mysql_user}/g" application-${env}.yml sed -i "" "s/mysql_pwd/${mysql_pwd}/g" application-${env}.yml sed -i "" "s/<env>/${env}/g" Dockerfile-param else sed -i "s/mysql_ip/${mysql_ip}/g" application-${env}.yml sed -i "s/mysql_port/${mysql_port}/g" application-${env}.yml sed -i "s/mysql_user/${mysql_user}/g" application-${env}.yml sed -i "s/mysql_pwd/${mysql_pwd}/g" application-${env}.yml sed -i "s/<env>/${env}/g" Dockerfile-param fi ''' } }
stage('Maven 编译'){ steps { sh ''' . ~/.bash_profile
cd ${WORKSPACE}/root mvn clean install -Dmaven.test.skip=true cd ${WORKSPACE}/web mvn clean package spring-boot:repackage -Dmaven.test.skip=true -U ''' } }
stage('停止 / 删除 现有Docker Container/Image '){ steps { script{ try{ sh 'docker stop $docker_container-$env' }catch(exc){ echo "The container $docker_container-${params.env} does not exist" }
try{ sh 'docker rm $docker_container-$env' }catch(exc){ echo "The container $docker_container-${params.env} does not exist" }
try{ sh 'docker rmi $docker_image-$env' }catch(exc){ echo "The docker image $docker_image-${params.env} does not exist" } } } }
stage('生成新的Docker Image'){ steps { sh ''' cd ${WORKSPACE}/web/bin/docker rm -f web.war cp ${WORKSPACE}/web/target/web.war . docker build -t $docker_image-$env -f Dockerfile-param . ''' } }
stage('启动新Docker实例'){ steps { sh ''' if [[ "$env" == "prod" ]]; then export port="8888" else export port="8811" fi docker run -d --name $docker_container-$env -p $port:8980 $docker_image-$env ''' } } }}
复制代码

dockerfile

FROM frolvlad/alpine-java:jdk8-slimMAINTAINER ThinkGem@163.comENV TZ "Asia/Shanghai"ENV LANG C.UTF-8VOLUME /tmp
WORKDIR /appADD web.war .RUN jar -xvf web.war
WORKDIR /app/WEB-INFENV JAVA_OPTS "-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"ENV JAVA_OPTS "$JAVA_OPTS -Dspring.profiles.active=<env>"
ADD application-<env>.yml ./classes/config
ENTRYPOINT java -cp /app $JAVA_OPTS org.springframework.boot.loader.WarLauncher
EXPOSE 8980

复制代码

在 Jenkins 中配置好 Pipline 脚本中所需的 MySQL 变量信息


创建 Pipline 任务,设置 Pipline 脚本


由于我们第一次执行时,脚本里的 parameter 参数无法同步到 Jenkins 是里,所以第一次执行会报错,当我们刷新页面是就会发现参数已经同步了


然后我们选择测试环境,再次 build 即可


build 完成


打开测试环境:http://127.0.0.1:8811/a/login


然后我们再 build 成产环境


build 完成


打开成产环境:http://localhost:8888/a/login


查看生产环境和测试环境的 docker 容器


ok,完结,撒花~~

原文链接:https://www.cnblogs.com/feng0815/p/14354545.html

如果您觉得本篇文章还不错,欢迎点赞,转发支持,感谢~~

可以关注一下我公众号,回复关键字【面试】即可得到一份 Java 核心知识点整理与一份面试大礼包!另有更多技术干货文章以及相关资料共享,大家一起学习进步!


发布于: 2021 年 02 月 04 日阅读数: 17
用户头像

Java王路飞

关注

需要资料添加小助理vx:17375779923 即可 2021.01.29 加入

Java领域;架构知识;面试心得;互联网行业最新资讯

评论

发布
暂无评论
基于SpringBoot开源项目JeeSite的持续交互介绍