最近公司需要用自动化部署,在部署中遇到很多问题,记录一下部署过程
环境准备
必需组件
组件 | 版本 | 验证命令 |
---|---|---|
JDK | 1.8.0_191 | java -version |
Maven | 3.8.7 | mvn -v |
Git | 2.43.0 | git --version |
环境准备
标题
前置环境
jdk:1.8.0_191,maven:3.8.7,git:2.43.0
下载
去jenkins官网https://www.jenkins.io/download/ 下载
选择需要安装的Jenkins版本,我是用war包来进行安装,版本为 2.346.3
下载完成后直接上传到服务器,编写start.sh脚本,默认端口为8080
#!/bin/bash
## war包名称
JAR_NAME="jenkins.war"
## 查找是否有运行的jenkins.war 返回pid
pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}')
## 输出的日志位置
LOG_PATH=/root/jenkins/nohup.out
## 确保日志文件存在
touch ${LOG_PATH}
## 如果pid不存在,说明没有正在运行的jenkins.war,直接启动
if [ -z "$pid" ]; then
## 启动jenkins.war,并将输出重定向到指定日志文件
nohup java -jar $JAR_NAME --httpPort=4444 > ${LOG_PATH} 2>&1 &
## 查看启动后的pid
pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}')
if [ -z "$pid" ]; then
echo "Failed to start ${JAR_NAME}!"
exit 1
else
echo "Service ${JAR_NAME} is started! pid=${pid}"
fi
## 动态查看启动日志
tail -f ${LOG_PATH}
## 如果pid存在,说明有正在运行的jenkins.war,需要先杀掉这个进程,再重新启动jenkins.war
else
## 杀掉已有进程
kill -9 $pid
## 重新运行jenkins.war,并将输出重定向到指定日志文件
nohup java -jar $JAR_NAME --httpPort=4444 > ${LOG_PATH} 2>&1 &
pid=$(ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}')
if [ -z "$pid" ]; then
echo "Failed to restart ${JAR_NAME}!"
exit 1
else
echo "Service ${JAR_NAME} is restarted! pid=${pid}"
fi
## 动态查看启动日志
tail -f ${LOG_PATH}
fi
启动前提是服务器以及安装好了jdk并配置好JAVA_HOME
配置Jenkins
在日志里面找到显示的密码或者在指定目录中使用cat查看密码,选择插件来安装
点击后可能会报错
尝试刷新页面再次尝试如果不成功的话关闭jenkins
我的解压目录是在/root/.jenkins里面,如果不知道在哪里的话
find / -name ".jenkins"
找到目录后先将原先配置文件拷贝一份做备份,然后通过vim修改配置文件
cp config.xml config.xml.back
vim config.xml
修改配置文件中以下部分
然后重启jenkins就不会出现该情况了
不选择安装推荐的插件,因为默认会安装最新的插件这是不兼容的,接着配置用户和配置实例
配置镜像源
1.打开清华大学镜像源选择自己jenkins版本文件,赋值网页地址并且下载update-center.json文件
下载好的json文件如果是updateCenter.post()开头,需要把它前后都去掉,只留{}包裹的json串,要不然Jenkins启动后会自动删除这个文件
2.配置地址
选择Manage Jenkins->Manage Plugins->Advanced
然后在下面填写刚刚的json地址
3.在服务器中找到default.json 一般在jenkins工作目录的updates下面
find / -name default.json
如果之前报错那一步已经备份了那么不需要再次备份,没有备份的话需要备份一下,然后将下载好的.json文件上传到目录里面并改名为default.json
4.重启jenkins
在浏览器删除http://ip(你的ip):port(启动时设置的端口)/restart ,重启Jenkins。镜像源更新完成之后,可以在Plugins 市场下载安装适合当前Jenkins版本的插件了
插件下载以及创建Maven任务:
必须要下载的插件:
搜索出来的第一个就行maven,git,还有一个是Publish Over SSH (将构建好的jar包传到指定的服务器),勾选后选择左边的哪个不重启并下载
添加GitHub SSH 凭据
因为github2021年(好像)之后就不支持账号密码认证了,我配置token凭证不显示因此配置ssh
1.在服务器端生成公钥和私钥
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t rsa 指定秘钥类型为RSA类型,-b 4096指秘钥长度为4096,-c添加注释来区分秘钥
2.设置保存路径和文件名
运行命令后,系统会提示你输入保存路径和文件名。默认路径是 ~/.ssh/id_rsa
如果直接按回车,会使用默认路径和文件名。
如果需要为不同的服务生成不同的密钥,可以指定自定义路径和文件名。例如:
/home/yourusername/.ssh/id_rsa_github
3.设置密码(可选)
系统会提示你为密钥设置一个密码(passphrase):
如果不想设置密码,直接按回车(我没有设置密码,直接回车)
如果设置了密码,每次使用该密钥时都需要输入密码
4.生成成功
生成成功后会显示如下信息
使用cat id_rsa.pub(自己重新起名字的话需要输入)显示秘钥信息复制下来
5.github设置秘钥
点击头像选择Settings
添加成功后打开Jenkins的凭证配置生成的私钥
创建maven项目
- 新建项目
2.配置创建好的项目的配置项
选择构造器
配置前置前置脚本(用于kill之前的jar程序或者拷贝编译后jar包)
在服务器上搭建的所以选择第二个,编写lunix命令
设置构建maven的参数
设置后置步骤
如果在该阶段执行脚本里面启动java程序或启动新的线程等,例如java -jvar 等操作,必须要带上,如果不带上BUILD_ID=DONTKILLME的话当任务执行完毕的时候jenkins会自动杀死所有创建的子进程,还有别的方式可以解决我是使用该方式
OLD_BUILD_ID=$BUILD_ID
BUILD_ID=DONTKILLME
cd 执行脚本路径 && sh 你的执行脚本
BUILD_ID=$OLD_BUILD_ID
接着保存运行就行
当开始运行任务后如何查看Jenkins运行情况,里面会清晰的显示控制台信息
报错
-
HTTP ERROR 403 No valid crum was included in the request
如果在提交数据的时候遇到了
解决办法:点击Manage Jenkins ->Configure Global Security,找到
点击保存即可解决报错 -
Error 403 No valid crumb was included in the request
解决办法:点击Manage Jenkins ->Configure Global Security->Prevent Cross Site Request Forgery exploits,取消勾选保存即可
Jenkins执行时报错
编写shell脚本可能不是unix编码格式造成的,使用编辑器创建的可能会在后面添加换行符
解决方式 :
vim 你的脚本路径如(vim /opt/aaa/jenkins/jenkins-pre-exe.sh)
按住shift和: 输入set ff=unix 按回车
按住shift和: 输入wq保存退出