教程讲述的是在centos7系统环境下,把mvn项目自动化部署到docker容器中,实现提交代码之后自动部署功能,代码管理使用码云(gitee)。安装Tomcat、jenkins、mvn环境请移步https://www.jianshu.com/p/686e534a6fec,docker安装配置请移步https://www.jianshu.com/p/9bd3ed0b336b
简要流程:
一共分为六个步骤:
1. idea新建mvn项目,编写测试接口
2. 安装gitee插件
3. jenkins配置gitee
4. jenkins新建mvn项目并配置
5. 测试触发构建功能
6. 编写Dockerfile,shell脚本,构建镜像,创建运行容器
一、idea新建mvn项目,编写测试接口
在idea中新建mvn项目,提交到gitee上,此步骤省略。
二、安装gitee插件
选择插件安装插件
如果在线安装失败,可下载插件文件,选择在插件这个地方选择高级,从本地安装插件。
下载地址 https://gitee.com/oschina/Gitee-Jenkins-Plugin/releases
安装完成插件之后重启jenkins服务
三、jenkins配置gitee
配置gitee-
链接名:可按自己想法填写
-
Gitee 域名 URL: https://gitee.com,或者按gitee官方提示 (码云私有化客户输入部署的域名)
-
证书令牌:
3.1 点击新建 3.2 访问蓝色背景处的链接,在gitee上获取私人令牌
3.4 点击提交,系统会生成一串字符,复制过来填进去就OK了,ID和描述可按自己需求填写,没有什么限制条件
- 点击测试链接,完美的配置成功
-
保存返回
四、jenkins新建mvn项目并配置
新建mvn项目1.源码配置
image.png
参数说明
1. Repository URL:gitee项目地址
2. Credentials:上一步创建的凭据
3. Name:origin
4. Refspec:+refs/heads/*:refs/remotes/origin/* +refs/pull/*/MERGE:refs/pull/*/MERGE
5. Branch Specifier (blank for 'any'):
1. 对于单仓库工作流输入: origin/${giteeSourceBranch}
2. 对于 PR 工作流输入: pull/${giteePullRequestIid}/MERGE
2.构建触发器配置,需要在项目位置webhooks,前面提示的链接和点击生成webhooks密码的结果填入gitee项目的webhooks中,如下图所示
webhooks配置
3.构建环境 构建环境
4.准备构建 准备构建
5.构建设置和构建后操作 image.png
6.保存
五、测试触发构建功能
1.随意修改一个文件,提交代码到gitee,然后观察jenkins 立即构建控制台输出
2.自动构建已经完成,接下来编写shell,使其运行在docker中,在 PostSteps这一步中
六、编写shell脚本,把jar包打包成镜像
1.在服务器的jenkins工作目录下找到我们新建的项目的目录,进入项目目录,新建文件夹
mkdir work
工作目录
新建工作目录完成之后,新建Dockerfile文件,
vim Dockerfile
Dockerfile代码
FROM java:8
VOLUME /usr/local/jenkins_home/workspace/jenkinsdemo/work
ADD jenkinsdemo-1.0.0.jar jenkinsdemo.jar
RUN bash -c 'touch /jenkinsdemo.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/jenkinsdemo.jar"]
2.在Jenkins的项目配置界面的post steps步骤执行shell脚本,shell脚本代码根据https://blog.csdn.net/wangshouhan/article/details/80332951改动得到,如下
#!/bin/bash
#操作/项目路径(Dockerfile存放的路劲)
BASE_PATH=/usr/local/jenkins_home/workspace/jenkinsdemo/work
#jenkins工作空间
SOURCE_PATH=/usr/local/jenkins_home/workspace
#docker 镜像/容器名字或者jar名字 这里都命名为这个
SERVER_NAME=jenkinsdemo
JAR_NAME=jenkinsdemo-1.0.0
#获取容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
#获取镜像id
IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
DATE=`date +%Y%m%d%H%M`
# 备份
function backup(){
if [ -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
echo "$SERVER_NAME.jar 备份..."
cp $BASE_PATH/$JAR_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
echo "备份 $JAR_NAME.jar 完成"
else
echo "$BASE_PATH/$JAR_NAME.jar不存在,跳过备份"
fi
}
# 最新构建代码 移动到项目环境
function transfer(){
echo "最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/$JAR_NAME.jar 迁移至 $BASE_PATH"
cp $SOURCE_PATH/$SERVER_NAME/target/$JAR_NAME.jar $BASE_PATH/
echo "迁移完成"
}
# 修改访问权限
function changemod(){
echo "修改 $BASE_PATH/$JAR_NAME.jar 的访问权限"
cd $BASE_PATH
chmod 777 $JAR_NAME.jar
echo "修改访问权限完成"
}
# 构建docker镜像
function build(){
if [ -n "$IID" ]; then
echo "存在$SERVER_NAME镜像,IID=$IID"
echo "停止容器docker stop $CID"
docker stop $CID
echo "删除容器 docker rm $CID"
docker rm $CID
echo "删除镜像 docker rmi $SERVER_NAME"
docker rmi $SERVER_NAME
echo "构建镜像 docker build -t="$SERVER_NAME" ."
cd $BASE_PATH
docker build -t="$SERVER_NAME" .
else
echo "不存在$SERVER_NAME镜像,开始构建镜像 docker build -t $SERVER_NAME . "
cd $BASE_PATH
docker build -t="$SERVER_NAME" .
fi
}
# 运行docker容器
function run(){
backup
transfer
changemod
build
echo "docker run创建容器... docker run -d --name=$SERVER_NAME -p 8002:8082 -v $BASE_PATH:$BASE_PATH jenkinsdemo:latest"
docker run -d --name=$SERVER_NAME -p 8002:8002 -v $BASE_PATH:$BASE_PATH jenkinsdemo:latest
echo "$SERVER_NAME容器创建完成"
}
#入口
run
3.保存,返回
大吉大利,完工。
jvm参数配置:
-server -Xms180m -Xmx180m -Xmn64m -Xss256k -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
网友评论