说明:本次流程功能是,我们只要上传代码到git平台后面就不用我们管了,jenkins就能自动将我们git原代码编译测试部署发布到生产环境,不用我们每次都自己打包jar包再拉到linux环境java -jar发布,因为经常改代码每次都这样非常麻烦的。整个部署过程分为三大步骤:安装中间件,配置环境,部署发布。以pipeline方式部署。
(有些东西知道的请随意,我是按照我的公司规范来的,请见谅 哈哈)
Linux系统先安装需要用到的中间件。我的是:Redis+MySQL+RabbitMQ+Nacos+fastDFS。
一 安装配置环境
1 Linux新建jenkins用户,设置密码,切换用户
useradd jenkins
passwd jenkins
su jenkins
2 浏览器下载 tomcat.zip 和 jenkins.war
https://tomcat.apache.org/ https://jenkins.io/download/ (拉到Linux的 /home/jenkins/ )
3 解压tomcat.zip,将tomcat里面webapps下文件全删除
unzip tomcat.zip
rm -rf ./tomcat/webapps/*
4 将jenkins.war复制到webapps下改名为ROOT
cp jenkins.war ./tomcat/webapps/ROOT
5 到root用户给jenkins用户添加执行权限
su root
cd /home/jenkins/tomcat/bin/
chmod o+x ./*.sh #给sh后缀文件其他组用户设置执行权限,要不然jenkins用户没权限开启tomcat
6 安装Maven:
将下载好的apache-maven-3.6.0拉到 /usr/local/
mv apache-maven-3.6.0 maven
cd /usr/local/maven/bin/ #到maven下载目录
chmod o+x ./* #设置执行权限,后面用到
编辑 /usr/local/maven/conf/settings.xml
如果
nexus-aliyun
Nexus aliyun
central
https://maven.aliyun.com/repository/public
保存即可。
设置环境变量:
vim /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:$PATH
source /etc/profile
7 安装Git
whereis git #查找Git路径,没安装过再安装
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install git
8 以jenkins用户打开jenkins
su jenkins
sh /home/jenkins/tomcat/bin/starup.sh
浏览器打开192.168.12.131:8080(端口你自己linux的 )如果jenkins页面出来就代表成功了。
复制浏览器显示的那串路径在linux查看 比如:less /home/appuser/.jenkins/secrets/
出来一串hash值密码复制到浏览器登录即可。设置管理者用户和插件即可,我是下载推荐安装的插件。
进去后点击管理(设置)-全局工具管理-配置jdk,git,maven。到此安装配置步骤完成
FAQ:
1、问题:第一次进入jenkins时显示离线;进去后插件下报红;下载插件全都安装失败。
解决方法:经我百度解决以上问题,有三个思路
1 如果进去jenkins插件下报红报错,将站点地址https改为http 即设置-插件管理-高级(第四个按钮)-最下面url改为http-下面提交-右下角立刻获取 即可
这样就不报红了正常了,但是我下载插件依然全部失败,开始下面的办法
2 如果刚进去显示离线,自己网络没问题前提下,那就是环境问题,经发现我的问题是版本问题,我用了tomcat10,jdk1.8.0_51,jenkins.war2.289.1,后来改tomcat8和jdk1.8.0_211重新部署正常了可以下载插件(我觉得大部门是版本不兼容问题)。
二 开始部署发布流程
其实到这里已经完成大半,剩下以自己方式简单部署就行,我是生产环境pipeline部署。
1 Jenkins新建流水线工程设置名字(你自己的项目服务名字) 如 base-service
2 顶部四大项设置:第一项General (打勾)
不允许并发构建
丢弃旧的构建 (分别输入:9 9)
当 master 重启后,不允许恢复流水线
3 第二项构建触发器:
轮询SCM (输入:* * * * *)
4 第三项高级项目选项:
(这个git地址是pipeline配置文件路径,下面有说这个文件,这里先说怎样搭。说明:这个gitlab用户要有上传的pipeline配置仓库权限以及java源代码仓库的权限,要不然部署测试会报没权限错误,当然给权限也行。我的意思是这个pipeline配置仓库账户要能有权限访问到java源代码仓库。一般情况下源代码是我们写的pipeline配置文件也是我们写的所以没问题,除非写代码和部署不同一个人不同一个gitlab)
先看看我的gitlab仓库pipeline配置文件路径():
说明 指定分支 我的是dev 所以写: */dev
源码库浏览器 自动(不用改)
脚本路径 自己dev下的路径 我的是: poc/base-service/Jenkinsfile-poc (dev节点到文件的路径)
5 点击保存,后点击立即构建,第一次会下载源代码和依赖比较久。测试发布部署完成。
我是向nacos注册的,所以服务列表有就代表也成功启动了
其实jenkins搭建还是比较简单的,重点是pipeline配置文件完成的编译打包部署工作的。
关于上传配置;关于配置文件内容
我简单说一下流程就是在电脑windous创建 poc/base-service/Jenkinsfile-poc 这样一个路径的这样一个文件上传到git 平台dev分支(文件可以在idea编辑)
配置文件内容-改几个地方:
node("master"){
step([$class: 'WsCleanup'])
// 1工程名(服务名)
def project_name='base-service'
// 2工程部署目标服务器ip(自己linux机器地址)
def deploy_ip='192.168.12.131'
// 3工程启动端口(这个无所谓)
def port='8905'
// 4环境(匹配nacos配置的那个dev)
def env='dev'
def config_uri='192.168.12.131:8848'
//5这里要改标识码和java源代码路径(f0c86d7-7d54-4f77-aedf-3fe43b51fbe和https://gitlab.citicgz.com/rmp-backend-poc/base-service.git)
stage('Checkout') {
checkout([$class: 'GitSCM', branches: [[name: '*/poc']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'f0c86da7-7d54-4f77-aedf-31fe43b51fbe',url: 'https://gitlab.citicgz.com/rmp-backend-poc/base-service.git']]])
}
// stage('Code Check') {
// sh "sh scripts/checkstyle/checkstyle.sh"
// }
//stage('Unit Test') {
// sh "sh scripts/build.sh"
//}
//stage('Unittest Coverage with SonarQube') {
// Sonar单元测试覆盖率
//def sonarqubeScannerHome = tool name: 'SonarQube Scanner'
//withSonarQubeEnv('Sonarqube53') {
//sh "${sonarqubeScannerHome}/bin/sonar-scanner"
//}
//}
stage('Archive Artefact') {
sh "mvn package -Dmaven.test.skip=true"
//6 这里要改自己的标识码(7d49d98-8e4a-4e5b-acb4-6e0b50910e7)
withCredentials([usernamePassword(credentialsId:'7d49d98-8e4a-4e5b-acb4-6e0bb5010e7', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]){
stage("Deploy to $env") {
sh "sshpass -p $PASSWORD ssh $USERNAME@$deploy_ip \" rm -rf /home/$USERNAME/$project_name \" "
sh "mkdir $project_name"
sh "cp ./target/*.jar $project_name"
sh "cp ./scripts/startup.sh $project_name"
sh "tar -cvf $project_name'.tar' $project_name "
sh "sshpass -p $PASSWORD scp $project_name*.tar $USERNAME@$deploy_ip:/home/$USERNAME/ "
sh "sshpass -p $PASSWORD ssh $USERNAME@$deploy_ip \"cd /home/$USERNAME;tar -xvf $project_name*.tar \" "
sh "sshpass -p $PASSWORD ssh $USERNAME@$deploy_ip \"cd /home/$USERNAME;rm -f $project_name*.tar \" "
withEnv(['JENKINS_NODE_COOKIE=dontKillMe']) {
sh "sshpass -p $PASSWORD ssh $USERNAME@$deploy_ip \"cd /home/$USERNAME/$project_name; chmod +x startup.sh;/bin/bash -l startup.sh $env $port $config_uri \" "
}
}
}
}
修改:改自己注册中心 IP端口,nacos新建dev后缀的配置文件base-service-dev.properties
问题5 的标识码是gitlab这个用户的,在jenkins-设置-密码凭证-这一长串乱码就是标识码 复制粘贴进配置文件问题5那个标识码,改一下后面路径 是我们上传的java源代码的gitlab地址(这个git用户能访问到这个源代码以及配置文件)
问题6 的标识码密码是 要发布的目标服务器用户的标识码,例如发布到linux 的appuser用户,jenkins页面添加一个用户,名字为appuser,密码是这个用户的密码,密码和linux一致。他会作为变量传过去远程连接远程拷贝。然后看它的标识码复制过去。
FAQ:遇到的几个坑
1 问题:部署控制台报错 ERROR: Error cloning remote repo 'origin'
解决:
Jenkins全局工具指定Git安装路径不正确,改为自己下载的路径地址。也可能是我git账号只有配置文件权限没有源代码git仓库的权限(因为源代码不是我写的所以不同一个gitlab),解决是jenkins添加一个用户,该用户有我gitlab配置中心的权限和也有上传的java源代码git的权限。
2 部署控制台报错,报 Permission denied 没有权限 说明执行脚本的时候jenkins使用的用户没有对应文件的权限.
解决:
1)不建议的方式 chmod 777
2)让jenkins以root或对应用户执行 例如修改Jenkins配置文件 JENKINS_USER="root"
3)以root用户进入tomcat的bin目录 给jenkins用户添加相应文件的权限
cd /home/jenkins/tomcat/bin/
chown a+x *.sh
cd /usr/local/maven/bin/
chown a+x ./*
3 Jenkins启动项目报错
用ss -lntp|grep 8905查看服务是否起来,起来了但是nacos没发现,查看cd /home/appuser/base-service/logs/ logs日志没有java启动日志说明启动报错了,杀死进程再手动启动查看是什么错;发现rabbitmq没有权限,是配置rabbitmq admin用户时没有给足够权限,解决是改rabbitmq
# 创建超级管理员用户
rabbitmqctl add_user admin yourPassword
# 赋予administrator角色给超级管理员用户
rabbitmqctl set_user_tags admin administrator
# 赋予超级管理员用户权限
rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'
4 关于其他问题
关于配置环境时的错误百分之70都是版本问题,我试过jdk问题,改了1.8其他版本,tomcat问题,降低使用版本,maven问题 降低使用版本。第一次写的不好有问题各位大佬多多保函,哈哈