Jenkins首次安装推荐插件出错 No such plugin: cloudbees-folder 超详细解决方案
Jenkins安装与踩坑
Jenkins部署Maven多环境项目(dev、beta、prod)的参数设置
Jenkins配置maven项目,打包、部署、发布
一台Linux服务器部署Jenkins服务,简述流程:
1.安装Jdk环境
2.安装Maven插件
3.安装Git环境
4.安装Jenkins
5.配置SSH免密登录
6.配置Jenkins打包的后置Shell脚本执行远程部署 (可选)
Jenkins安装
中文官网
截止当前时间LTS版本:2.346.3 LTS

英文官网
Jenkins版本高于上述中文官网网站,截止当前时间LTS版本:2.479.2 LTS

安装Jenkins

下载Jenkins仓库
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
|
导入key
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
|
安装openjdk-17
可自行安装jdk-17版本
yum install fontconfig java-17-openjdk
|
安装Jenkins
设置开机自启
启动/状态/重启
systemctl start jenkins systemctl stop jenkins systemctl status jenkins systemctl restart jenkins
|
可编辑文件对jenkins做一些基础配置(可选)
/usr/lib/systemd/system/jenkins.service
|
指定启动Jenkins的JDK17路径

启动后截图
注意:在第一次启动时的密钥到此页面前要输入安装密钥,在Jenkins的日志文件中可查或systemctl status jenkins会打印

Jenkins配置Git凭据
配置Linux服务器访问Git的SSH密钥
ssh-keygen -t ed25519 -C "xxxx_Jenkins" -f "/root/.ssh/xxx_id_rsa"
|
配置config文件
Host xxxx.xxx.com HostName xxxx.xxx.com PreferredAuthentications publickey IdentityFile /root/.ssh/jenkins_id_rsa
|
在gitlab仓库,将当前id_rsa公钥配置到设置

验证配置
ssh -T git@xxxx.xxx.com -p 22
|

配置Jenkins的Git凭据认证
配置类型SSH Username with private key
Passphrase如果对公钥私钥加密,则需要配置当前口令。

jenkins 设置Git sshkey 凭证后,报错:No ECDSA host key is known for

解决办法:
Manage jenkins –> Configure Global Security ,找到 Git Host Key Verification Configuration,按下图修改后保存。警告信息可以忽略

Jenkins配置Maven项目打包
选择对应项目的JDK版本

输入项目的git仓库地址

配置自动删除旧的构建文件

输入项目的分支

输入Maven构建命令
-Pdev : 选择pom中环境为dev
-Dmaven.test.skip=true 跳过单元测试
clean package -Pdev -Dmaven.test.skip=true
|

复杂多模块项目配置Maven打包
例如某git仓库下的项目,实际构建的java项目属于多模块,且项目的pom父类文件在仓库根目录 /server 下

Jenkins的Build配置变更
- 指向父类pom.xml文件位置,例如
server/pom.xml - 配置
-pl gzxydl-app指定打包的模块名称,配置-am自动构建当前打包依赖的其他模块

项目pom打包插件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>utf-8</encoding> </configuration> </plugin>
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin>
|
Jenkins打包脚本命令
Jenkins打包执行脚本命令:
构建java项目的war发布
#!/bin/bash
##注意:需要先配置与远程ssh服务器的免密登录##
##项目打包目录 DIR="/root/.jenkins/workspace/EventTrack/target/" ##项目文件 PROJECT_NAME="EventTrack.war" ##远程部署目录 REMOTE_DIR="/usr/local/service/tomcat8_8081/webapps/"
##部署远程服务器 ##多台:("192.168.6.155" "192.168.6.156" "192.168.6.157") ##单台:("192.168.6.155") server_ips=("192.168.0.69")
for server_ip in ${server_ips[@]} ##循环开始 do echo "开始执行远程服务器${server_ip}部署操作-->START" ##-q 不显示传输进度条 ##-oStrictHostKeyChecking=no 参数可以在不确定或拒绝远程主机公钥的情况下,强制执行连接操作,并跳过密钥检查 scp -q -oStrictHostKeyChecking=no ${DIR}${PROJECT_NAME} root@${server_ip}:${REMOTE_DIR}/${PROJECT_NAME} echo "执行远程服务器${server_ip}部署完成-->SUCCESS" ##循环结束 done
|
构建java项目的jar发布
#!/bin/bash
##注意:需要先配置与远程ssh服务器的免密登录##
##项目打包目录 DIR="/var/lib/jenkins/workspace/DEV_XXXX_DM/target/" ##项目文件 PROJECT_NAME="ROOT.jar" ##远程部署目录 REMOTE_DIR="/app/deploy/"
##部署远程服务器 ##多台:("192.168.6.155" "192.168.6.156" "192.168.6.157") ##单台:("192.168.6.155") server_ips=("192.168.0.63")
for server_ip in ${server_ips[@]} do echo "开始执行远程服务器${server_ip}部署操作-->START" scp -q -oStrictHostKeyChecking=no ${DIR}${PROJECT_NAME} root@${server_ip}:${REMOTE_DIR}/${PROJECT_NAME} # 使用 heredoc,注意 EOF 必须顶格 ssh root@${server_ip} << EOF cd ${REMOTE_DIR} # 停止旧服务 PID=\$(ps aux | grep 'java.*${PROJECT_NAME}' | grep -v grep | awk '{print \$2}') if [ -n "\$PID" ]; then kill -15 \$PID sleep 5 kill -9 \$PID 2>/dev/null fi # 启动新服务 nohup java -jar ${PROJECT_NAME} --server.port=8283 > ../logs/${PROJECT_NAME}.log 2>&1 & echo "Started with PID: \$!" EOF # 注意:上面的 EOF 必须顶格,前面不能有任何字符 echo "执行远程服务器${server_ip}部署完成-->SUCCESS" done
|
构建前端项目的web发布,这里仅做传输并解压
#!/bin/bash
##注意:需要先配置与远程ssh服务器的免密登录##
##项目打包目录 DIR="/root/.jenkins/workspace/DEV_ferryWeb/" ##项目文件 PROJECT_NAME="web.zip" ##远程部署目录 REMOTE_DIR="/opt/ferry_web/" ##时间戳 TIMESTAMP=$(date "+%Y%m%d%H%M%S")
##部署远程服务器 ##多台:("192.168.6.155" "192.168.6.156" "192.168.6.157") ##单台:("192.168.6.155") server_ips=("192.168.0.139")
for server_ip in ${server_ips[@]} ##循环开始 do echo "开始执行远程服务器${server_ip}部署操作-->START" ##-q 不显示传输进度条 ##-oStrictHostKeyChecking=no 参数可以在不确定或拒绝远程主机公钥的情况下,强制执行连接操作,并跳过密钥检查 scp -q -oStrictHostKeyChecking=no ${DIR}${PROJECT_NAME} root@${server_ip}:${REMOTE_DIR}/${PROJECT_NAME}
##执行ssh命令(多条) ssh -q -oStrictHostKeyChecking=no root@${server_ip} > /dev/null 2>&1 " cd ${REMOTE_DIR} ; mv web web_bak_${TIMESTAMP}; unzip ${PROJECT_NAME} > /dev/null ; rm -rf ${PROJECT_NAME}; "
echo "执行远程服务器${server_ip}部署完成-->SUCCESS" ##循环结束 done
rm -rf ${DIR}web rm -rf ${DIR}${PROJECT_NAME}
|
通过nvm指定node版本构建前端web并发布测试服务器nginx的html目录下
注意:如果当前Jenkins应用是创建单独jenkins用户的,则需要su jenkins账户下,在进行安装nvm
#!/bin/bash export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm use 16.2.0
node -v
npm --registry https://registry.npmmirror.com install npm run build mv dist gzxydlweb tar zcf gzxydlweb.tar.gz gzxydlweb rm -rf dist
|
#!/bin/bash
##注意:需要先配置与远程ssh服务器的免密登录##
##项目打包目录 DIR="/var/lib/jenkins/workspace/DEV_Gzxydl_web/" ##项目文件 PROJECT_NAME="gzxydlweb.tar.gz" ##远程部署目录 REMOTE_DIR="/home/env/nginx/html/" ##时间戳 TIMESTAMP=$(date "+%Y%m%d%H%M%S")
##部署远程服务器 ##多台:("192.168.6.155" "192.168.6.156" "192.168.6.157") ##单台:("192.168.6.155") server_ips=("192.168.0.63")
for server_ip in ${server_ips[@]} ##循环开始 do echo "开始执行远程服务器${server_ip}部署操作-->START" ##-q 不显示传输进度条 ##-oStrictHostKeyChecking=no 参数可以在不确定或拒绝远程主机公钥的情况下,强制执行连接操作,并跳过密钥检查 scp -q -oStrictHostKeyChecking=no ${DIR}${PROJECT_NAME} root@${server_ip}:${REMOTE_DIR}/${PROJECT_NAME}
##执行ssh命令(多条) ssh -q -oStrictHostKeyChecking=no root@${server_ip} > /dev/null 2>&1 " cd ${REMOTE_DIR} ; mv gzxydlweb gzxydlweb_bak_${TIMESTAMP}; tar zxf ${PROJECT_NAME} -C ./ > /dev/null; rm -rf ${PROJECT_NAME}; " echo "执行远程服务器${server_ip}部署完成-->SUCCESS" ##循环结束 done
rm -rf ${DIR}${PROJECT_NAME}
|
Jenkins插件推荐
简体中文插件
搜索关键词Localization

Maven项目
搜索关键词Maven

Publish Over SSH

Jenkins系列教程六:Jenkins安装Publish over SSH插件并配置
问题记录
No such plugin: cloudbees-folder
此问题记录不适当前博客文章,当前采取yum方式安装Jenkins,但仍具备一定参考作用。

缺少 cloudbees-folder 插件,访问 cloudbees-folder 下载

将下载cloudbees-folder.hpi文件,复制到Jenkins.war包部署的项目目录/WEB-INF/detached-plugins下。

Maven打包报错(权限问题报错)
记录在jenkins中自动部署maven项目时碰到的一些问题

启动的服务这里是用户jenkins
[root@localhost conf]# ps -ef | grep jenkins jenkins 21755 1 2 11:18 ? 00:02:33 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=%C/jenkins/war --httpPort=8080 root 23603 22884 0 13:14 pts/0 00:00:00 grep --color=auto jenkins
|
给Jenkins的用户授权权限
chown -R jenkins:jenkins /opt/maven_repository chmod -R 755 /opt/maven_repository
|
Jenkins打包报错(JDK版本问题)
解决linux jenkins要求JDK版本与项目版本JDK不一致问题
Jenkins打包报错(maven-war-plugin版本问题)
解决Maven打war包报错Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war)
maven-war-plugin:2.2:war (default-war), 是 Maven 默认打 war 包用的插件,如果不指定版本,就默认用 2.2 版本。
Jenkins打包后无法执行scp命令远程部署包
jenkins执行shell脚本,使用scp免密传输失败问题
Host key verification failed:解决jenkins执行shell脚本,使用scp免密传输文件失败的问题
需要配置jenkins用户对远程linux主机免密ssh访问权限;
无法切换Jenkins用户
切换jenkins用户
TIP:若切换后还是root账号,执行以下命令修改:
修改/false->/bash
# 修改前 # jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/false
# 修改后 jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/bash
|
TIP:若命令提示符的用户名不是jenkins而变成了 bash-4.1$,执行以下命令修改:
修改环境
文件最后添加
export PS1='[\u@\h \W]\$'
|
使环境生效
Jenkins用户无法执行sudo命令
jenkins ALL=(ALL) NOPASSWD: ALL
|
验证切换jenkins用户
# 先切换到Jenkins用户 su jenkins
|
# 执行sudo命令切换Jenkins用户 sudo su -s /bin/bash jenkins
|
配置Jenkins用户的ssh免密登录
生成Jenkins的密钥对
私钥:/var/lib/jenkins/.ssh/id_rsa
公钥:/var/lib/jenkins/.ssh/id_rsa.pub
配置对远程服务器免密登录
ssh-copy-id -i /var/lib/jenkins/.ssh/id_rsa.pub root@目标IP
|

Jenkins打包远程执行脚本后Jenkins前端无法正常退出
jenkins执行.sh脚本不生效,不退出问题
jenkins 执行 shell脚本成功但构建任务一直未结束或超时
start.sh脚本命令:
#!/bin/bash export BUILD_ID=dontKillme
WORKSPACE=/usr/local/services/ferry_sheet/ JDK_PATH=/opt/jdk/jdk1.8.0_151/bin/java JAR_NAME=zeus-sheet.jar
PID=`ps -ef | grep ${JAR_NAME} | grep -v grep | grep -v startup | awk '{print \$2}'` echo $PID; if [ ! "$PID" ] ;then echo "进程不存在" else echo "进程存在,杀死进程PID$PID" kill -9 $PID fi
echo "服务启动开始" nohup ${JDK_PATH} -jar ${WORKSPACE}/${JAR_NAME} --spring.profiles.active=dev 2>&1 &
|
启动命令
cd /usr/local/services/ferry_sheet/ nohup bash start.sh
|
注意:需开启虚拟终端 Exec in pty
