- 作者:老汪软件技巧
- 发表时间:2024-12-01 21:02
- 浏览量:154
//1. 安装 java 环境 并配置环境变量
<code class="hljs language-arduino" lang="arduino"> 百度即可
// 测试 java -version
//2. 安装 maven 并配置环境变量
百度即可
//测试 mvn -v 仓库地址 可以改成阿里的
//3. 安装 git
百度即可
// yum -y install git
//4. 安装docker
百度即可
// 测试 docker -v
//5.安装 jenkins
百度即可
// 注:安装插件 不要直接点 安装插件 启动的时候 有可能找不到java的路径 需要再修改一下
// 需要配置 国内镜像下载 这样下载不会失败
安装地址推荐 :/article/det…
安装 推荐插件 安装后 登录进去 如果插件不够用 可以在配置里 再下载
//6. 在 jenkins 全局配置
需要汉化 自行百度 汉化插件
//配置 java 安装位置
which java 查看java安装位置
//配置 maven 安装位置
mvn -version 查看安装位置
//配置 git 安装配置
which git 查看安装位置
//7. 自动化过程
我打包的是maven 包 所以 创建的是 maven 任务
配置git地址
clean package -Dmaven.test.skip=true
7.0 项目打包完成后 执行shell 脚本
//7.1 在每个需要打包运行的模块 创建一个 Dockerfile 文件
根据自己打包命令需求 修改
shell脚本内容 修改内容如下 该好后 把sh脚本内容 复制到 jenkins里 7.0 步骤里
每个模块 我创建一个任务
如果 有五个模块 需要写五个 sh脚本和 Dockerfile 文件 分别放在每个模块下
只需要改每个模块相对应的路径
注:
1.容易出错的地方 路径找不准
2.jenkins 没有 docker 运行 没有 权限 需要把jenkins 加到docker 组里
解决方案
sudo gpasswd -a jenkins docker
sudo service jenkins restart
重启后 再运行测试
如果执行sh脚本 没有root权限
jenkins用户加入到root组
gpasswd -a root jenkins
vim /etc/sysconfig/jenkins
JENKINS_USER="root"
JENKINS_GROUP="root"
重启后 再运行测试
//7.2 在项目pom文件 需要加 打包类型 和 maven插件
//打包类型 jar
// maven打包插件
//7.5 准备工作后 把docker 启动 然后开始启动任务
启动测试 即可
shell脚本内容如下
#!/bin/bash
#maven打包
#mvn clean package -DskipTests
echo 'package ok!'
echo 'build start!'
#修改项目路径 这个就是在找 每个模块下的 Dockerfile 存放的位置
cd /var/lib/jenkins/workspace/base-service/server/erp-base/
# 修改打包后的名称
service_name="base-service"
# 修改端口号
service_port=8001
#查看镜像id
IID=$(docker images | grep "$service_name" | awk '{print $3}')
echo "IID $IID"
if [ -n "$IID" ]
then
echo "exist $SERVER_NAME image,IID=$IID"
#删除镜像
docker rmi -f $service_name
echo "delete $SERVER_NAME image"
#构建
docker build -t $service_name .
echo "build $SERVER_NAME image"
else
echo "no exist $SERVER_NAME image,build docker"
#构建
docker build -t $service_name .
echo "build $SERVER_NAME image"
fi
#查看容器id
CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
echo "CID $CID"
if [ -n "$CID" ]
then
echo "exist $SERVER_NAME container,CID=$CID"
#停止
docker stop $service_name
#删除容器
docker rm $service_name
else
echo "no exist $SERVER_NAME container"
fi
#启动
docker run -d --name $service_name --net=host -p $service_port:$service_port $service_name
#查看启动日志
#docker logs -f $service_name
Dockerfile 文件内容如下
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY ./target/erp-base-0.0.1-SNAPSHOT.jar erp-base-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","./erp-base-0.0.1-SNAPSHOT.jar", "> out/erp-base.out 2>&1 &"]
脚本内容 根据自己需求修改即可
以上是在一台centos7 服务器上部署
第二次部署又在另一台服务器上 部署了另一个 项目的自动化 但是 docker 启动镜像后 发现模块一直读取不到 nacos的配置文件 (目前没找到原因)
于是 就舍弃了docker 直接使用 shell脚本直接杀进程 重新启动 服务 测试脚本的过程中 也有各种坑
比如
1.jenkins没有执行权限
2.shell脚本 直接 在服务器上运行 是ok的 但是 把脚本交给 jenkins 运行 一直启动失败 也不报错 也不启动 这个问题 我猜测 是 jenkins 没有执行权限 或者 在使用nohup command 后台挂载运行的时候 java 还没启动完 脚本已经执行完毕 导致 java服务不启动了 也是困扰了我好多天
查询资料后 有几个答案我感觉是这些原因造成的
下面两个截图是我百度搜索的问题分析
centos7 系统问题 权限问题 shell脚本 编写不规范问题 都有可能jinkins启动 shell脚本 失败(猜测 具体问题 还要根据 项目具体分析 )
**
以下是 没有使用docker 实现 自动化部署
**1.大部分配置都一样
只说明不用的地方
2.1 不需要编写Dockerfile 文件
2.2 shell 脚本内容编写不同 经过调整 最后编辑的 以下的 shell脚本 可以执行成功
#!/bin/bash
export JAVA_HOME=/home/jdk1.8.0_261
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=${JAVA_PATH}:${PATH}
export BUILD_ID=dontKillMe
export JENKINS_WORK=/var/lib/jenkins/workspace/zchl-emp/server/zchl-emp # jenkins打包后的路径
pkg_name="zchl-emp-0.0.1-SNAPSHOT.jar" # 打包后的名字
share_dir="${JENKINS_WORK}/target/" # jenkins打包后的完整路径
home_dir="/home/zchl/" # 打包后的文件 拷贝到的路径
log_file="/out/zchl-emp.out" # 日志文件名
backups_dir="/home/zchl/bak/" #备份路径
# 备份
function _backups(){
#@ 判断 老文件是否存在 ------->改
if [ ! -f "${home_dir}/${pkg_name}" ]
then
echo "文件不存在"
else
#@ 备份 ------->改
mv ${home_dir}/${pkg_name} ${backups_dir}/${pkg_name}
echo "老文件文件备份成功"
sleep 1s
fi
}
# 获取进程
function _get_pid(){
app_pid=`ps -ef | grep "$pkg_name" | grep -v "grep" | awk '{print $2}'`
echo $app_pid
}
#输入日志
function _logs_status(){
for((i=1;i<=30;i++));
do
sleep ${i}s
run_status="`egrep 'Started ComApplication in' "${home_dir}/${log_file}" | wc -l`"
if [ ${run_status} == 1 ];then
tail -50 ${home_dir}${log_file}
app_pid="`_get_pid`"
echo "====== server start success ======"
echo "app_pid: ${app_pid}"
break
fi
done
if [ ${run_status} == 0 ];then
echo "====== server start failed ======"
exit 128
fi
}
# 停止进程
function _stop(){
app_pid="`_get_pid`"
echo "app_pid: ${app_pid}"
if [ -z "${app_pid}" ];then
echo "====== server is stoped ======"
else
kill -9 ${app_pid}
sleep 10s
app_pid="`_get_pid`"
if [[ -z "${app_pid}" ]];then
echo "====== server stoped success ======"
else
echo "====== server stoped failed ======"
exit 127
fi
fi
}
#启动
function _start(){
#@ 判断jenkins打包后文件 是否存在
if [ ! -f "${share_dir}/${pkg_name}" ]
then
echo "jenkins打包失败 执行结束"
else
# mv /var/lib/jenkins/workspace/zchl-emp/server/zchl-emp/target/zchl-emp-0.0.1-SNAPSHOT.jar /home/zchl/zchl-emp-0.0.1-SNAPSHOT.jar
mv ${share_dir}/${pkg_name} ${home_dir}/${pkg_name}
export JENKINS_NODE_COOKIE=dontKillMe
export BUILD_ID=dontKillMe
# nohup /home/jdk1.8.0_261/bin/java -jar /home/zchl/zchl-emp-0.0.1-SNAPSHOT.jar --spring.profiles.active=test >> /home/zchl/out/zchl-emp.out 2>&1 &
nohup java -jar ${home_dir}/${pkg_name} --spring.profiles.active=test &>${home_dir}/${log_file} &
sleep 5s
#_logs_status
fi
}
function _restart(){
_stop
_start
}
function _main(){
_backups
_restart
}
_main
2.3 编写的shell脚本文件 我是放在了服务器的某个文件下 然后 通过jenkins配置在打包完成后调用这个脚本 即可
自动化部署 感觉 有很多种搭建方式
这只是其中一种 基本全部依赖 shell脚本 实现的
所有的编写 可以根据自己的项目需求 更改
只要能实现即可
总结
第一次部署 感觉坑挺多的 主要是注意权限问题
不建议使用 docker 安装 jenkins 我尝试过 会有很多文件路径找不到 需要改很多地方
建议:
把jenkins的日志 备份 设置一下 要不 过一段时间 他就会把你磁盘占满
这个位置配置
重启生效