- 基于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安装参考:自行百度。。
- 打开 JeeSite4/web/src/main/resources/config/application.yml,填写数据库配置(地址、IP端口、用户名、密码)
- 进入项目路径 JeeSite4/web/bin,运行初始化脚本程序init-data.sh(Windows下运行init-data.bat)
初始化脚本用来创建初始数据,初始化前要保证数据库中有jeesite数据库,否则会造成无法连接jeesite数据库,初始化失败
开始执行
执行结束
- 添加JeeSite4/root/pom.xml Maven根节点到IDE的maven view中,其余依赖module会根据配置一起导入
Maven编译、打包
在Maven view 中选中JeeSite Root下Lifecycle中的clean + install,然后单击运行按钮
进入到JeeSite4/root目录下,运行mvn clean install
3.3 运行项目demo 3.3.1 在IDE运行展开JeeSite Web → Plugins → spring-boot → spring-boot:run ,单击运行
运行成功
3.3.2 在命令行运行
访问项目:http://localhost:8980/a/login
进入到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
创建Jenkins 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,完结,撒花~~
原文链接:https://www.cnblogs.com/feng0815/p/14354545.html
可以关注一下我公众号,回复关键字【面试】即可得到一份Java核心知识点整理与一份面试大礼包!另有更多技术干货文章以及相关资料共享,大家一起学习进步!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。