1 缘起
这篇文章,没有想法。
大概我有些累了。但,不是很累。
想到,要发出来,还是写一些文字吧。
曾经的纯纯开发者,只管对着原型,开发CURD,修Bug。
可是我想更进一步,学习、了解、掌握服务上线的全流程(全生命周期),
完善技能拼图,补齐短板,减少盲区,开拓眼界,
于是,在不断探索完成开发之后的领域,
先从服务部署开始,
于开发员而言,完成开发后,只要没有Bug,
其他的任务,交由运维即可,包括部署、扩容、回退等等,
可是,对于组建团队而言,需要哪些人、具备哪些能力,
还是需要先有部分积累,才能更好地挑选人才。
所以,从Jenkins部署服务开始学习,逐步向后学习,如Docker、K8S等。
2 构建项目
2.1 新建任务
进入Jenkins,首页中选择新建任务,如下图。
输入任务名称,选择构建的任务类型:
构建一个自由风格的软件项目,确认之后,进入具体配置,如下图。
2.2 General
通用配置,有两个部分,一部分是项目描述,另一部分是构建前的准备,如参数构建。
2.2.1 项目描述
项目描述如下图。
2.2.2 构建参数
添加参数,
General->参数化构建过程->添加参数->选项参数。
这里,使用选项参数,作为外部参数传入Shell脚本,如下图。
参数添加样例:
添加参数:选项参数。
其中,名称为键(key),
选项为值(value),如下图。
2.3 源码管理
添加Git仓库,Jenkins连接具体的项目地址,用于拉取代码。
这部分是自动化构建的核心步骤,
添加Git项目后,需要配置认证,这里配置认证有两种方式,
一种是在系统配置中设置Gitee,
一种是在当前认证中直接配置,
本章在Gitee中配置,因此无需再次配置。
配置参考:
分支为*/master,通配master,如下图。
2.4 构建
构建自定义执行脚本,这里选择:执行shell,如下图,
在Shell脚本中定义代码打包、上传、运行等步骤。
2.4.1 执行命令
这里采用Shell执行具体的文件和传入外部参数的方式,执行shell,如下图。
sh /var/jenkins_home/workspace/tutorial-deploy.sh $project_name $branch $host $port
2.4.2 脚本
构建服务的脚本有两部分:
(1)构建打包脚本;
(2)启动服务脚本;
注意:
Jenkins使用Docker部署,所有的操作都是在容器内,
因此,想在容器内操作另一台服务器,需要先登录,再操作,
本脚本中使用公钥的方式,登录到其他服务器,
所以,为了是脚本正常执行,在Jenkins的容器内,需要生成公钥和秘钥。
2.4.2.1 构建脚本
由于配置了路径挂载,在本地目录添加脚本即可:
/home/xindaqi/software/install/jekins/data/workspace/tutorial-deploy.sh
会自动传输到Jenkins镜像内。
#!/bin/bash
project_name=$1 #项目名字
branch=$2 #分支
host=$3
port=$4
currentTime=`date "+%Y%m%d_%H%M%S"`
#代码路径
base_dir="/var/jenkins_home/workspace/"
prj_dir=$base_dir$project_name
mvn_dir=$base_dir"apache-maven-3.8.1/bin"
remote_dir="/home/xindaqi/project/deploy-project/$project_name"
#远端项目路径
echo "####################ProjectName######################"
echo $project_name
echo "####################开始pull code######################"
cd $prj_dir && git pull && git checkout origin/$branch && git pull
echo "################开始编译##########################"
sleep 2
cd $prj_dir && $mvn_dir/mvn clean -Dmaven.test.skip=true package
echo "####################开始执行备份######################"
#执行备份
ssh xindaqi@$host -p$port "[ ! -d $remote_dir/backup ] && mkdir -p $remote_dir/backup || echo '存在' "
ssh xindaqi@$host -p$port "mv $remote_dir/*.jar $remote_dir/backup/"
echo "#################开始拷贝jar包#######################"
#拷贝jar包到远程主机
scp -P$port -r $prj_dir/target/*.jar xindaqi@$host:$remote_dir #不带日志的jar包
#查看新的jar包名字
jarname=`ssh xindaqi@$host -p$port "ls -lt $remote_dir/*.jar" | awk '{print $9}' |awk -F '[/]' '{print $5}'`
echo "#################jarname=$jarname#######################"
#启动服务
echo "#################开始启动服务#######################"
ssh xindaqi@$host -p$port "cd $remote_dir && sh start.sh $project_name"
echo "#################Running#######################"
2.4.2.2 启动脚本
/home/xindaqi/project/deploy-project/tutorial/start.sh
#!/bin/sh
project_name=$1
nohup java -jar tutorial.jar >nohup.out 2>&1 &
2.5 生成公钥和秘钥
2.5.1 进入Jenkins容器
sudo docker exec -it fe682ca1d6aa /bin/sh
2.5.2 生成秘钥
ssh-keygen -t rsa
2.5.3 获取公钥
cat /var/jenkins_home/.ssh/id_rsa.pub
2.5.4 公钥传输
将容器内生成的公钥,添加到目的服务器的文件中:
进入文件夹:/home/xindaqi/.ssh
将公钥添加到文件:authorized_keys
这个文件可以配置多个公钥,每个公钥换行
存储。
2.6 任务列表
通过控制面板查看任务列表,如下图。
构建任务,通过指定任务,如tutorial任务,
Build with Parameters(参数构建)。
2.7 参数构建
通过参数构建服务,如工程:tutorial。
上面已经配置参数,效果如下图所示。
执行:开始构建。
2.8 构建过程
2.8.1 控制台
构建任务是,可查看构建过程,如下图。
2.8.2 日志
通过控制台查看运行日志,如下图所示。
日志内容如下图所示。
查看启动的服务:
jps -l
3 小结
(1)构建任务:自由软件任务;
(2)配置构建参数:外部传参到Shell脚本;
(3)免密登录服务器:容器内生成公钥和私钥;
(4)打包服务:通过登录服务器,使用Maven打包;
(5)启动服务:登录服务器,执行任务,添加守护进程文件:>nohup.out 2>&1。