Jenkins部署项目

2,264 阅读5分钟

简介

基于 springboot+Jenkins+github 实现自动化部署项目到阿里云服务器。

准备工作

1.github 上创建一个 springboot 测试项目。

2.服务器上安装如下软件并配置好环境。

  • Jdk

  • git

  • maven

3.安装Jenkins

下载地址:www.jenkins.io/zh/download…

image-20200915191811066

直接下载 war 包,然后放在 Tomcat 的 webapps 就行了,然后运行 Tomcat。

访问http://ip:8080/jenkins/,按照提示路径在服务器上找到该文件中的密码后输入,然后安装推荐的插件(会花费较长时间),如果安装失败,后续也可以手动安装。最后创建一个管理员。这些步骤网上的教程很多,可以自行参考。

全局工具配置

image-20200915110609118

image-20200915192423351

image-20200915192511209

image-20200915192530573

image-20200915192601305

ssh配置

系统管理->系统配置->Publish over SSH->点开高级,配置阿里云服务器的账号密码

image-20200915195803427

最后点击右下角的 test 测试,出现 success 即为成功。

image-20200915195540140

新建任务

点击首页“新建任务”

image-20200915193143917

General

image-20200915193453841

源码管理

image-20200915194523343

构建环境

server.sh是一个 shell 脚本,用来启动 springboot 打成的 jar,见文末附录。

image-20200915200056976

构建

image-20200915201018723

最后保存

构建

image-20200915201254857

查看控制台输出

image-20200915201406518

如果是第一次构建,会去 maven 仓库下载 jar 包,如果 maven 没有配置国内的镜像地址的话会比较慢。

image-20200915201849416

成功后可以先通过服务器的 ip 去访问项目测试一下。如果失败,可以通过控制台来排错。

Webhooks

使用 github 的 Webhooks 功能实现,当我们 push 修改后的代码后,Jenkins自动进行构建。

image-20200915203440580

登录GitHub,进入"Settings"页面,点击左下角的"Developer settings",如下图

image-20200915204101962

image-20200915204134281

跳转到"Developer settings"页面后,点击左下角的“Personal access tokens”,如下图

image-20200915204223805

跳转到创建token的页面,如下图所示,输入note,再勾选"repo"和"admin:repo_hook",再点击底部的"Generate token"按钮,就能产生一个新的access token,将此字符串复制下来,下一步中会用到

image-20200915204400667

系统管理->系统配置->Github->添加

image-20200915203637882

添加凭证

image-20200915203845320

增加之前的任务的配置

image-20200915204716235

image-20200915204825582

最后手动修改项目源码,push 后观察该任务有没有自动构建

梳理过程

git push 代码的时候会触发github 的 Webhooks 功能并向 Jenkins 发送请求。Jenkins 接收到请求后会去 github 上 clone 代码到该任务的工作空间,接着 maven 进行打包,将 springboot 项目打成 jar 包,等连接上阿里云服务器后,会将 target/*.jar 上传到目标路径下。然后会执行 cd 命令进入 jar 的目录,最后执行 server.sh 脚本。最终成功启动项目。

server.sh

将该脚本放在 jar 包所在路径下

使用示例:sh server.sh 项目.jar start

注意:启动命令 java -jar 一定要用绝对路径,不然会导致 Jenkins 构建成功,shell 脚本也执行成功,但是最终服务器上的项目并没有成功启动。网上有说法是因为 Jenkins 构建完成后会关闭所有相关的进程。我最终是通过加绝对路径的方式解决的。

image-20200915200900350

#!/bin/sh

# 应用名称:命令行输入的第一个参数
APP_NAME=$1
# 日志文件路径
LOG_NAME=./info.log
 
# 使用说明,用来提示输入参数
usage() {
    echo "Usage: sh 脚本.sh [APP_NAME] [start|stop|restart|status]"
    exit 1
}

# 检查程序是否在运行
is_exist(){
        # 获取PID
        PID=$(ps -ef |grep ${APP_NAME} | grep -v $0 |grep -v grep |awk '{print $2}')

        # -z "${pid}"判断pid是否存在,如果不存在返回1,存在返回0
        if [ -z "${PID}" ]; then
                # 如果进程不存在返回1
                return 1
        else
                # 进程存在返回0
                return 0
        fi
}
 
# 定义启动程序函数
start(){
        is_exist
        if [ $? -eq "0" ]; then
                echo "${APP_NAME} is already running, PID=${PID}"
        else
                # 真正的启动命令,如果有其他参数,可以在此添加
                nohup /project/jdk/jdk1.8.0_251/bin/java -jar ${APP_NAME} >${LOG_NAME} 2>&1 &
                PID=$(echo $!)
                echo "${APP_NAME} start success, PID=$!"
        fi
}
 
# 停止进程函数
stop(){
        is_exist
        if [ $? -eq "0" ]; then
                # 强制关机
                kill -9 ${PID}
                echo "${APP_NAME} process stop, PID=${PID}"
        else    
                echo "There is not the process of ${APP_NAME}"
        fi
}
 
# 重启进程函数 
restart(){
        stop
        start
}
 
# 查看进程状态
status(){
        is_exist
        if [ $? -eq "0" ]; then
                echo "${APP_NAME} is running, PID=${PID}"
        else    
                echo "There is not the process of ${APP_NAME}"
        fi
}
 
case $2 in
"start")
        start
        ;;
"stop")
        stop
        ;;
"restart")
        restart
        ;;
"status")
       status
        ;;
  *)
  usage
  ;;
esac
exit 0