• 作者:老汪软件技巧
  • 发表时间: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 全局配置

需要汉化 自行百度 汉化插件

1.png

//配置 java 安装位置

which java 查看java安装位置

2.png

//配置 maven 安装位置

mvn -version 查看安装位置

3.png

//配置 git 安装配置

which git 查看安装位置

4.png

//7. 自动化过程

我打包的是maven 包 所以 创建的是 maven 任务

5.png

配置git地址

6.png

clean package -Dmaven.test.skip=true

7.png

7.0 项目打包完成后 执行shell 脚本

8.png

//7.1 在每个需要打包运行的模块 创建一个 Dockerfile 文件

根据自己打包命令需求 修改

9.png

shell脚本内容 修改内容如下 该好后 把sh脚本内容 复制到 jenkins里 7.0 步骤里

10.png

每个模块 我创建一个任务

如果 有五个模块 需要写五个 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打包插件

11.png

//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服务不启动了 也是困扰了我好多天

查询资料后 有几个答案我感觉是这些原因造成的

基本脚本的自动化部署工具__java自动部署脚本

下面两个截图是我百度搜索的问题分析

12.png

13.png

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的日志 备份 设置一下 要不 过一段时间 他就会把你磁盘占满

这个位置配置

16.png

17.png

重启生效


Top