之前实现了原生部署,进一步肯定就是实现自动化部署,这篇主要实现的是自动构建,不涉及docker,集群,多分支,如果后面有需要再更新。
首先服务器上自己安装好Jenkins,nginx,java环境,网上很多,大多数都可以跟着实现。
后端部署
0.配置jenkins工具环境
- 配置部署服务器的信息,Dashboard》Manage Jenkins》System,用户名,密码,ip地址
这里测试连接成功的话就算完成。
-
Dashboard 》 Manage Jenkins》Tools,在这个页面下配置jdk和maven,选择你工程使用的版本
1.在工程文件的根目录上创建Jenkinsfile,添加如下内容
#!groovy
pipeline {
agent any
environment {
GITURL = 'https://gitee.com/rookie_a/self-blog.git'//你的git地址
SERVER = 'huaweiyun1'//你的部署服务器在Jenkins上设置的名称。
REMOTEDIR = '/home/data'//指定的目录
SOURCE_FILE = '/target/helloworldBackend-1.0-SNAPSHOT.jar'//执行文件,你打包的jar文件名
PREFIX = 'target'//去除的前缀
COMPLETE_EXEC_SHELL = '/home/kailiwenwen0220@/springboot-demo.sh restart'//指定的执行脚本
}
tools {
maven "mvn"//配置的maven名称
jdk 'jdk8'//配置的jdk名称
}
stages {
stage('获取代码') {
steps {
// 拉取代码
git branch: 'master',
credentialsId: 'root',
url: env.GITURL
}
}
stage('打印环境变量') {
steps {
sh 'printenv'
}
}
stage('编译代码') {
steps {
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
stage('应用分发') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: env.SERVER,
transfers: [
sshTransfer(
execCommand: env.COMPLETE_EXEC_SHELL,
execTimeout: 120000,
flatten: false,
remoteDirectory: env.REMOTEDIR,
removePrefix: env.PREFIX,
sourceFiles: env.SOURCE_FILE
)
]
)
]
)
}
}
}
}
2.编写shell脚本,上面配置文件里调用了一个shell文件,这里实现,springboot-demo.sh
#!/bin/sh
#替换这里jar包的路径,根据实际修改
APP_NAME=/var/lib/jenkins/workspace/hellobackend-test/helloworldBackend-1.0-SNAPSHOT.jar
#使用说明,用来提示输入参数
usage() {
echo "Usage: $0 [start|stop|restart|status]"
exit 1
}
linge(){
RETVAL=$?
if [ $RETVAL -eq 0 ];then
echo "${APP_NAME} is $1"
else
echo "${APP_NAME} is $1"
fi
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq 0 ]; then
echo "${APP_NAME} is already running. pid=${pid}"
else
nohup java -jar ${APP_NAME} > /dev/null 2>&1 &
linge start
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
linge stop
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
sleep 5
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
编写完成上传到服务器,位置在Jenkins的配置文件里已经指定过了。/home/kailiwenwen0220@/springboot-demo.sh
3.创建流水线
这里和推送代码自动更新有关,如果你不希望更新代码后自动更新,这里和下一步就不要设置。将此图里的url记录下来
生成密码,我的这里代码仓库使用的是gitee,用别的也是同样的流程,打开你的代码仓库。
密码,和url就是前两个截图里说明的。
注意,私有仓库要添加凭证的 ,不然会报错。
保存后执行立即构建就可以了。
遇到过的问题
执行构建报127的警告:我遇到的是因为脚本上传的位置和文件中指定的不一样,或者是脚本中指定的jar包位置不对,jar包的生成位置可以在构建的控制台里看到,指定生成位置这个不知道为什么没有成功,有大神可以指点我一下。
执行构建报126的警告:权限不能调用shell脚本,修改脚本的使用权限,chmod -r 777 xxx.sh
jdk指向不明确:在流水线控制台里找到jdk位置,将bin所在层级的所有文件向上平移一级。
前端的构建
整体流程和后端基本没有区别,只有jenkins的配置文件和脚本有区别,不过要先配置好nodejs的部分,插件市场安装插件,配置版本和名称。
Jenkinsfile
#!groovy
pipeline {
agent any
environment {
GITURL = 'https://gitee.com/rookie_a/hello-fronted.git'
SERVER = 'huaweiyun1'
REMOTEDIR = '/home/data'
SOURCE_FILE = '/dist/*'
PREFIX = 'dist'
COMPLETE_EXEC_SHELL = '/home/kailiwenwen0220@/hellofronted.sh'
}
tools {
nodejs 'node20'
}
stages {
stage('获取代码') {
steps {
// 拉取代码
git branch: 'master',
credentialsId: 'root',
url: env.GITURL
}
}
stage('打印环境变量') {
steps {
sh 'printenv'
}
}
stage('编译代码') {
steps {
sh 'npm install'
sh 'npm run build'
}
}
stage('应用分发') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: env.SERVER,
transfers: [
sshTransfer(
execCommand: env.COMPLETE_EXEC_SHELL,
execTimeout: 120000,
flatten: false,
remoteDirectory: env.REMOTEDIR,
removePrefix: env.PREFIX,
sourceFiles: env.SOURCE_FILE
)
]
)
]
)
}
}
}
}
shell脚本
rm -rf /home/kailiwenwen0220@/dist/*
cp /var/lib/jenkins/workspace/blog-froted-test/dist /home/kailiwenwen0220@/dist/