一、实战项目介绍- 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-slim
MAINTAINER ThinkGem@163.com
ENV TZ "Asia/Shanghai"
ENV LANG C.UTF-8
VOLUME /tmp WORKDIR /app
ADD web.war .
RUN jar -xvf web.war WORKDIR /app/WEB-INF
ENV 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,完结,撒花~~

基于Java+Spring Boot开源项目JeeSite的Jenkins持续交互介绍的更多相关文章

  1. 有哪些值得学习的spring boot开源项目?

    1. awesome-spring-boot 首先给大家介绍的就是Spring Boot 中文索引,这是一个专门收集 Spring Boot 相关资料的开源项目,也有对应的导航页面. 产品主页 htt ...

  2. 第三章 Maven构建 Java Spring Boot Web项目

    3.1   认识Srping Boot Spring Boot是一个框架,是一种全新的编程规范,它的产生简化了对框架的使用,简化了Spring众多的框架中大量的繁琐的配置文件,所以说Spring Bo ...

  3. 15 个优秀开源的 Spring Boot 学习项目,一网打尽!

    Spring Boot 算是目前 Java 领域最火的技术栈了,松哥年初出版的 <Spring Boot + Vue 全栈开发实战>迄今为止已经加印了 8 次,Spring Boot 的受 ...

  4. 15 个优秀开源的 Spring Boot 学习项目

    Spring Boot 算是目前 Java 领域最火的技术栈了,松哥年初出版的 <Spring Boot + Vue 全栈开发实战>迄今为止已经加印了 8 次,Spring Boot 的受 ...

  5. Spring Boot 2.0(三):Spring Boot 开源软件都有哪些?

    2016年 Spring Boot 还没有被广泛使用,在网上查找相关开源软件的时候没有发现几个,到了现在经过2年的发展,很多互联网公司已经将 Spring Boot 搬上了生产,而使用 Spring ...

  6. (转)Spring Boot 2 (三):Spring Boot 开源软件都有哪些?

    http://www.ityouknow.com/springboot/2018/03/05/spring-boot-open-source.html 2016年 Spring Boot 还没有被广泛 ...

  7. Spring Boot 2.0(二):Spring Boot 开源软件都有哪些?(转)

    2016年 Spring Boot 还没有被广泛使用,在网上查找相关开源软件的时候没有发现几个,到了现在经过2年的发展,很多互联网公司已经将 Spring Boot 搬上了生产,而使用 Spring ...

  8. Spring Boot 2 (三):Spring Boot 开源软件都有哪些?

    016年 Spring Boot 还没有被广泛使用,在网上查找相关开源软件的时候没有发现几个,到了现在经过2年的发展,很多互联网公司已经将 Spring Boot 搬上了生产,而使用 Spring B ...

  9. 优秀的Spring Cloud开源项目整理推荐

    无论是对于初学者,还是有一定工作经验的程序员来讲,Spring Cloud开源项目都是一笔宝贵的财富.下面给大家整理了十个优秀的开源项目,分别是spring-cloud-examples.spaasc ...

随机推荐

  1. 短信平台软件开发,短信发送平台销售,短信软件源码,G客短信发送平台

    一:web短信平台组成  需要短信软件平台源码的联系QQ:290615413 vx:290615413  整套短信系统平台还是由B/S(客户端+后台,取消了以前C/S的管理后台) ,C/S发送服务端和 ...

  2. 腾讯IOT之树莓派物联网设备

    目录 腾讯IOT之树莓派物联网设备 硬件配置 软件配置 Tecent IOT 开发平台的使用 新建项目 新建产品 添加自定义功能 设备开发 微信小程序配置 面板配置 新建设备 使用设备 在线调试 设备 ...

  3. .NET Core 处理 WebAPI JSON 返回烦人的null为空

    前言 项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段 ...

  4. Java 中的 equals() 和 hashCode()

    equals() 和 hashCode() 在 Object 类中以本地方法的形式存在,Java 中所有的类都继承了 Object 类,因此所有的类中都包含了这两个方法.这两个方法在 Java 开发中 ...

  5. shelll中test命令的使用【转】

    Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于 ...

  6. 【剑指 Offer】08.二叉树的下一个节点

    题目描述 给定一颗二叉树和其中的一个节点,找出中序遍历序列的下一个节点.树中的节点除了有两个分别指向左右节点的指针,还有一个指向父节点的指针. Java public class Solution08 ...

  7. Java 在pom.xml中配置build resources, 来防止我们资源导出失败问题(Maven项目)

    在pom.xml中配置build, 来防止我们资源导出失败问题 <!--在build中配置resources, 来防止我们资源导出失败问题--> <build> <res ...

  8. CVE-2019-15107_webmin漏洞复现

    一.漏洞描述 Webmin的是一个用于管理类Unix的系统的管理配置工具,具有网络页面.在其找回密码页面中,存在一处无需权限的命令注入漏洞,通过这个漏洞攻击者即可以执行任意系统命令.它已知在端口100 ...

  9. java 日期与时间操作

    我们先来了解一下基本的概念 日期 2020-11-21 2020-11-22 时间 15:36:43 2020-11-21 15:36:43 时区 北京时间 2020-11-21 15:36:43 东 ...

  10. Hive常用性能优化方法实践全面总结

    Apache Hive作为处理大数据量的大数据领域数据建设核心工具,数据量往往不是影响Hive执行效率的核心因素,数据倾斜.job数分配的不合理.磁盘或网络I/O过高.MapReduce配置的不合理等 ...