ToB企服应用市场:ToB评测及商务社交产业平台

标题: Jenkins详细安装设置部署 [打印本页]

作者: 吴旭华    时间: 2024-8-13 01:59
标题: Jenkins详细安装设置部署
简介

Jenkins是一个开源软件项目,是基于Java开发的一种连续集成工具。主要做的事情就是从git中拉代替码,根据设置信息打包;把打好的包传输到目标服务器,并可以执行一些shell脚本,使项目打包发布一键完成。

一、安装jdk

jenkins的安装需要依赖于jdk。
参考: https://editor.csdn.net/md/?articleId=135966281
二、安装jenkins

留意:

这里假如不熟悉Jenkins,可以选择【安装保举的插件】。即可,省事。
  1. ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/648bd9c3fbec43a5a2fd1f33875f924c.png)
复制代码
三、插件安装

假如上面插件安装,选择的不是【安装保举的插件】,而是【选择插件来安装】–【无】

1. 缓存插件列表。

点击Manage Jenkins --》 Manage Plugins --》Available 等待浏览器加载完成。(这样做是为了把Jenkins官方的插件列表下载到本地

新版本

旧版本

2. 修改Jenkins镜像源。

进入设置目录,修改镜像源为清华源。
  1. cd /var/lib/jenkins
  2. /updates
  3. sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
复制代码

然后回到jenkins的Plugins页面,点击Advanced,把Update Site改为国内插件下载地址 。
  1. https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
复制代码

Sumbit后,在浏览器输入: http://ip:port/restart ,重启Jenkins。
http://192.168.21.3:8086/restart
中文版


英文版:


3. 下载汉化插件。

点击Manage Jenkins --》Manage Plugins ,点击 Available ,搜索 “Chinese”。

安装完成后重启jenkins。

四、卸载Jenkins

依次执行下令。
  1. 1、rpm卸载
  2. rpm -e jenkins
  3. 2、检查是否卸载成功
  4. rpm -ql jenkins
  5. 3、彻底删除残留文件:
  6. find / -iname jenkins | xargs -n 1000 rm -rf
复制代码
五、常见问题

1. 实例离线

由于网速较慢,纵然该Jenkins所在机器可以联网,但是还是会出现该jenkins实例已经离线,这个时间不要慌。我们先将Jenkins服务关闭,修改Jenkins镜像源重新启动即可。

具体操作如下:

六、安装git

七、安装maven: /usr/local/soft/cicd

https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.tar.gz
如图:

  1. export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
  2. export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/git/bin
  3. export JAVA_HOME=/usr/local/soft/java/openjdk17
  4. export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
  5. export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
  6. export PATH=$PATH:/usr/local/soft/node-v16/bin
  7. # minio
  8. export MINIO_ROOT_USER=ltkj
  9. export MINIO_ROOT_PASSWORD=ltkj.com
  10. export LD_LIBRARY_PATH=/usr/local/lib
  11. export LIBLEPT_HEADERSDIR=/usr/local/include
  12. export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
  13. # mvn
  14. export M2_HOME=/usr/local/soft/cicd/maven
  15. export PATH=$M2_HOME/bin:$PATH
复制代码
————————————————
八、Jenkins全局工具设置

在jenkins首页依次:进入【系统管理】>>【全局工具设置】:

1. jdk设置:输入jdk安装的目录


2. git设置:输入git的目录


3. maven设置:输入maven的目录


九、SSH插件安装

jenkins打完包需要上传到新的服务器上,此处利用ssh的方式上传,添加ssh插件。
【系统管理】-> 【插件管理】-> 【可选插件】

所需插件如下: 假如已经安装,无需再次安装
SSH 、Maven Integration 、Git plugin、Publish Over SSH,Role-based 。

安装完成后新建工程时,构建环境选项才会出现SSH相关的选项

附加:停止到发稿前,新版本的jenkins不提供Publish Over SSH插件

从可选库里面检索不到,jenkins官网停息了插件,原因是存在XSS和CSRF攻击,目前没有修复,但是我们利用内网部署,不存在这种情况,外网部署的情况需要慎重考虑。

可以手动添加Publish Over SSH插件到jenkins,需要的文件下载git地址:
https://github.com/zhangliqingyun/publishssh.git
参考:https://blog.51cto.com/u_13272819/6540815
目录切到:
  1. /var/lib/jenkins/plugins
复制代码
把这两个文件添加进行,解压赋值上对应的权限

添加完成后即可在已安装插件中体现,创建项目的时间可以直接利用,在设置ssh服务器的位置也体现


十、SSH传输服务器设置

点击【系统管理】-》【系统设置】
系统设置主要定义,Jenkins本身的一些设置,邮件、远程服务器管理、构建参数等,这里先设置远程主机,后面自动发布时会用到,找到Publish over SSH相关部门。

1.Jenkins SSH Key设置jenkins部署所在服务器的信息

Passphrase:SSH的密码,利用用户名/密码登录时为用户名的密码,利用私钥登录时为私钥的密码,没有就留空
Path to key:SSH私钥的文件路径
Key:私钥
①在安装jenkins的服务器上执行下令天生私钥信息
  1. ssh-keygen -t rsa
复制代码
全部按回车执行不需要输入密码,执行完或会在目录/root/.ssh下天生私钥信息

②Passphrase内输入登录服务器的密码
③Path to key内输入私钥的文件地址:
  1. /root/.ssh/id_rsa
复制代码
④Key为id_rsa的文本内容,可以利用下令:sz id_rsa把文件下载下来,把文本内容粘贴进行
2.SSH Servers设置需要把打好的jar包上传到的服务器信息(发布业务系统的服务器)


点击新增添加ssh服务器,可以根据需要添加多台。
Name:SSH节点设置的名称,在Job中利用Publish over SSH插件时,此名称将出如今"SSH Server"中"Name"的下拉列表中。

Hostname: 主机IP
Username:主机用户名
Remote Derictory: 运程机器上真实存在的目录,并且"Username"指定的用户要有访问此目录的权限,插件将把文件传送到此目录下;
登录服务器创建目录:
  1. mkdir u01
复制代码
给u01目录赋权限:
  1. chmod 775 u01
复制代码
登录远程服务器利用机密的方式,点击高级睁开进行设置:

勾选利用机密登录: Use password authentication, or use a different key,点击Change Password设置添加的用户登录服务器的密码

也可以不利用密码,免密登录的方式:把部署jenkins的rsa.pub文件拷贝到目标机器的authorized_keys下,到目标服务器下执行
  1. vi authorized_keys
复制代码
,把公钥内容粘贴进行,然后重启目标服务器的shh
  1. systemctl restart sshd.service
复制代码


点击Test Configuration按钮测试设置的服务器是否能正常链接:当出现Success表示链接正常
十一、页面设置发布工程

1.创建视图,把工程放在视图中进行管理

2.在创建的视图中添加任务

3.输入任务名称,选择构建一个maven项目,勾选添加到当前视图进行创建

4.General选择抛弃旧的构建,输入保持构建的最大个数

5.源码管理选择Git的方式,添加项目的git地址

点击添加访问git地址的用户名和密码信息,此用户需要有权限访问git链接:

填写对应的用户名密码即可:

指定需要打包的分支:

6.构建环境
选择:Send files or execute commands over SSH after the build runs 把打包好的jar文件发送后执行下令的方式

Name:目标主机名称,前面设置主机时有提到,在第七部门的第2点设置的,若是设置了多台,则此处为下拉选择。
Source files:需要传输的文件路径,jenkins默认打出来的jar包放在/var/lib/jenkins/workspace目录下,后面的目录umapp-cloud-service-todolist为创建任务的名称,此处只用填写项目打包后的结尾文件名即可,前缀默认会拼接

Remove prefix:移除文件前缀,当从jenkins服务器把jar文件通过ssh发送到目标服务器后,目标服务器存放jar的目录,需要去掉的前缀(源jenkins存放jar的目录为基础)
Remote directory:远程目录,此目录是基于前面第七部门的第2点设置ssh server时定义的目录(/u01)为根目录。按此设置,则目标服务器上需要存在/u01/builds的目录
7.build打出jar包
Root Pom:设置pom.xml的文件目录
Goals and options:设置maven执行的下令

-Pdev为激活dev设置,此处的设置对应项目properties或yml设置文件的active(激活设置)

–pl xxx-service/xxx-service-xx:只打包xxx-service/xxx-service-xx这个项目,因为xxx-service目录下可能存在多个项目
-am:表示同时处理选定模块所依赖的模块,此处xxx-service-xxx可能会依赖于其他模块,利用am(also-make)把依赖的一并打包进来
十二、目标发布服务器设置

1.起首确保jar文件操作的目录/u01存在(若不存在可以执行创建下令mkdir u01
),并且有权限(若没有权限可以执行下令:chmod 775 u01
),在上面第七部门第1点已经介绍创建过此目录

2.在u01目录下创建存放jar包的目录builds:
  1. mkdir builds
复制代码
并且赋权限:
  1. chmod 775 builds
复制代码
builds的定名对应第八部门的第6点Remote directory内容

3.在u01下创建存放执行文件的目录scripts:
  1. mkdir scripts
复制代码
并且赋权限:
  1. chmod 775 scripts
复制代码
scripts的定名对应第八部门的第6点Exec command的部门内容


4.在本身的电脑创建一个名为:umapp-cloud-devops.sh的linux执行文件,编辑好后上传到/u01/scripts目录下,文件定名对应第八部门的第6点Exec command的部门内容。

可执行文件吸收4个参数,提供start启动的方法,重启restart的方法,停止stop的方法,删除备份del_bak的方法,备份bak的方法
————————————————
  1. #!/bin/bash
  2. # 操作名称
  3. optionName=$1
  4. # Jar项目名称
  5. appName=$2
  6. # 项目路径
  7. appDir=$3
  8. # 内存配置级别 0:256m 1:512m 2:1G 3:2G 4:4G
  9. MemConfLevel=$4
  10. # 创建项目目录
  11. appPath="/u01/project/umapp/$appDir"
  12. if [ ! -d "$appPath" ];
  13. then
  14.     mkdir $appPath
  15. fi
  16. # 帮助说明
  17. function usage()
  18. {
  19.   echo "Usage:   sh /u01/scripts/umapp-cloud-devops.sh [-optionName] [appName] [appDir] [MemConfLevel]"
  20.   echo "Example: sh /u01/scripts/umapp-cloud-devops.sh restart umapp-cloud-auth-1.0.0 auth 0"
  21.   echo "where options include:"
  22.   echo "     start        启动app"
  23.   echo "     stop         停止app"
  24.   echo "     restart      重启app"
  25.   echo "     status       查看状态"
  26. }
  27. if [ "$optionName" == "--help" ];
  28. then
  29.   usage;
  30.   exit 1
  31. fi
  32. if [ "$optionName" == "" ];
  33. then
  34.     echo -e "\033[0;31m 未输入操作名 \033[0m"
  35.     exit 1
  36. fi
  37. if [ "$appName" == "" ];
  38. then
  39.     echo -e "\033[0;31m 未输入应用名 \033[0m"
  40.     exit 1
  41. fi
  42. if [ "$appDir" == "" ];
  43. then
  44.     echo -e "\033[0;31m 未输入项目路径 \033[0m"
  45.     exit 1
  46. fi
  47. if [ "$MemConfLevel" == "" ];
  48. then
  49.     echo -e "\033[0;31m 未输入内存配置级别 \033[0m"
  50.     exit 1
  51. fi
  52. # 统计运行应用数
  53. function getCount()
  54. {
  55.     count=`ps -ef |grep java|grep "$appName.jar"|grep -v grep|wc -l`
  56.     echo $count
  57. }
  58. # 获取pid
  59. function getPid()
  60. {
  61.     pid=`ps -ef | grep "$appName.jar" | grep -v grep | awk '{print $2}'`
  62.     echo $pid
  63. }
  64. # 启动应用
  65. function start()
  66. {
  67.     source /etc/profile
  68.     # 统计运行应用数
  69.     count=`getCount`
  70.     if [ $count != 0 ];then
  71.         echo "$appName is running..."
  72.     else
  73.         echo "$appName is start..."
  74.         # 拷贝并覆盖Jenkins生成在builds文件下的jar 到所属的项目路径下
  75.         cp -rf /u01/builds/"$appName.jar" /u01/project/umapp/$appDir/
  76.         chmod 775 -R /u01/project/umapp/$appDir
  77.         cd /u01/project/umapp/$appDir
  78.         echo "begin config..."
  79.         if [ "$MemConfLevel" = 0 ];then
  80.             XmsSize=256m
  81.             MetaSize=125m
  82.         elif [ "$MemConfLevel" = 1 ];then
  83.             XmsSize=512m
  84.             MetaSize=256m
  85.         elif [ "$MemConfLevel" = 2 ];then
  86.             XmsSize=1G
  87.             MetaSize=512m
  88.         elif [ "$MemConfLevel" = 3 ];then
  89.             XmsSize=2G
  90.             MetaSize=1G
  91.         elif [ "$MemConfLevel" = 4 ];then
  92.             XmsSize=4G
  93.             MetaSize=2G
  94.         fi
  95.         JAVA_OPTS="-Xms${XmsSize} -Xmx${XmsSize} -XX:CompressedClassSpaceSize=${MetaSize} -XX:MetaspaceSize=${MetaSize} -XX:MaxMetaspaceSize=${MetaSize} -Xloggc:logs/gc.log"
  96.         echo "before start..."
  97.         nohup java -jar "$appName.jar" >$appName 2>&1 &
  98.         echo "after start..."
  99.     fi
  100. }
  101. # 停止应用
  102. function stop()
  103. {
  104.     echo "stop $appName..."
  105.     count=`getCount`
  106.     if [ $count != 0 ];then
  107.         pid=`getPid`
  108.         echo "stop $appName kill pid $pid"
  109.         kill $pid
  110.         sleep 2
  111.         count=`getCount`
  112.         if [ $count != 0 ];then
  113.             echo "stop $appName kill -9 pid $pid"
  114.             kill -9 $pid
  115.         fi
  116.     fi
  117. }
  118. # 备份应用
  119. function bak()
  120. {
  121.     echo "bak start..."
  122.     bakPath="/u01/bak/umapp/$appDir"
  123.     if [ ! -d "$bakPath" ];
  124.     then
  125.         mkdir $bakPath
  126.     fi
  127.     bakName="/u01/project/umapp/$appDir/${appName}.jar"
  128.     if [ -f "$bakName" ];
  129.     then
  130.         mv -f $bakName $bakPath/${appName}_`date +%Y%m%d%H%M%S`.jar
  131.     fi
  132.      
  133. }
  134. # 删除过期的备份程序只保留最新3次的
  135. function del_bak
  136. {
  137.     echo "del_bak start..."
  138.     bak_DIR=/u01/bak/umapp/$appDir
  139.     if [ -d $bak_DIR ]; then
  140.         cd $bak_DIR
  141.         bak_count=`ls -lthr | grep -v 'total' | grep  "$appName" |  wc -l`
  142.         if (($bak_count > 3));then
  143.             del_count=`expr $bak_count - 3`
  144.             ls -thr | grep -v 'total' | grep  "$appName"| head -$del_count | xargs rm -rf
  145.         fi
  146.     fi
  147.     echo "del_bak success..."
  148. }
  149. # 重启应用
  150. function restart()
  151. {
  152.     stop
  153.     del_bak
  154.     bak
  155.     start
  156.     status
  157. }
  158. # 打印启动状态
  159. function status()
  160. {
  161.     count=`getCount`
  162.     if [ $count != 0 ];then
  163.         echo "$appName is success..."
  164.     else
  165.         echo "$appName is not success..."
  166.     fi
  167. }
  168. case $1 in
  169.     start)
  170.     start;;
  171.     stop)
  172.     stop;;
  173.     restart)
  174.     restart;;
  175.     status)
  176.     status;;
  177.     --help)
  178.     usage;;
  179.     *)
  180.     echo -e "请使用--help察看可用选项" ;;
  181. esac
复制代码
5.创建可执行文件需要的目录
①umapp-cloud-devops.sh文件有一个存放jar包启动文件的目录project,把jar从/u01/builds下移动到/u01/project/umapp下,以是在/u01下创建对应的目录:
  1. mkdir project
复制代码
并且赋权限:
  1. chmod 775 project
  2. chmod 775 project
复制代码
进入到project:
  1. cd project/
  2. 再创建umapp目录:
复制代码
mkdir umapp

并且赋权限:
  1. chmod 775 umapp
复制代码
②umapp-cloud-devops.sh文件有一个从/u01/project/umapp备份jar包到/u01/bak/umapp的操作,以是在/u01下创建对应的目录:
  1. mkdir bak
复制代码
并且赋权限:
  1. chmod 775 bak
复制代码
进入到bak:
  1. cd bak/
复制代码
再创建umapp目录:
  1. mkdir umapp
复制代码
并且赋权限:
  1. chmod 775 umapp
复制代码
6.设置系统启动需要的日记文件目录
根据项目设置的日记目录在/u01目录下创建日记目录:
  1. mkdir logs
复制代码
并且赋权限:
  1. chmod 775 logs
复制代码


十三、构建项目

点击项目名称进入构建页面

点击立刻构建

点击构建的序号查看构建情况

点击控制调输出查看构建情况

末了输出Finished: SUCCESS表示构建成功,从服务的注册中心nacos可以查看系统构建成功

十四、构建前端web工程

前面第八、九、十是构建的java maven项目,此处构建的是纯前端项目。
1.添加前端打包需要的插件,系统管理-》插件管理,添加NodeJs Plugin。

2.设置node全局工具,系统管理-》全局工具设置,找到NodeJs相关设置,选择NodeJs版本。
留意NodeJs的版本选择,需要跟安装jenkins的服务器对应,太高的NodeJs版本,需要的Glibc版本比较高,否则打包的时间会报找不到高版本的Glibc。
/lib64/libm.so.6: version `GLIBC_2.27‘ not found
可以通过下令查看服务器Glibc的版本信息
strings /lib64/libc.so.6 |grep GLIBC
此处我们选择nodeJS-14.17.6。
3.创建一个任务,新建任务-》构建一个自由风格的软件项目

4.General选择抛弃旧的构建,输入保持构建的最大个数

5.源码管理选择Git的方式,添加项目的git地址

点击添加访问git地址的用户名和密码信息,此用户需要有权限访问git链接:

填写对应的用户名密码即可:

指定需要打包的分支:

6.构建环境选择Provide Node & npm bin/ folder to PATH,选择在全局设置中设置的nodejs

7.构建步骤选择执行shell(Execute shell)

设置bulid构建的脚本
  1. #查看环境path
  2. echo $PATH
  3. #打印node版本
  4. node -v
  5. #打印npm版本
  6. npm -v
  7. #安装镜像文件,镜像文件的地址具体根据前端使用的库进行配置
  8. npm install yarn --registry=http://registry.npm.xxx.org/
  9. #开始构建
  10. npm run build
  11. #进入构建完的dist目录
  12. cd dist
  13. #移除上次打的压缩包
  14. rm -rf dist.tar.gz
  15. #把dist目录下的文件全部打成压缩包
  16. tar -zcvf dist.tar.gz *
  17. cd ../
复制代码

Name:目标主机名称,前面设置主机时有提到,在第七部门的第2点设置的,若是设置了多台,则此处为下拉选择。
Source files:需要传输的文件路径,jenkins默认打出来的jar包放在/var/lib/jenkins/workspace目录下,后面的目录test-doravis为创建任务的名称,此处只用填写项目打包后的结尾文件名即可,前缀默认会拼接

Remove prefix:移除文件前缀,当从jenkins服务器把tar.gz文件通过ssh发送到目标服务器后,目标服务器存放tar.gz的目录,需要去掉的前缀(源jenkins存放tar.gz的目录为基础)
Remote directory:远程目录,此目录是基于前面第七部门的第2点设置ssh server时定义的目录(/u01)为根目录。按此设置,则目标服务器上需要存在/u01/project的目录
Exec command:设置传输到目标服务器后执行的下令
  1. #进入存放tar.gz文件的目录
  2. cd /u01/project
  3. #移除存放前端文件的目录
  4. rm -rf webProject
  5. #创建存放前端文件的目录
  6. mkdir webProject
  7. #解压tar.gz文件,并放到上面创建的目录下
  8. tar -zxvf dist.tar.gz -C webProject
  9. #移除tar.gz文件
  10. rm -rf dist.tar.gz
复制代码
9.生存设置,立刻构建,构建成功后,在目标服务器存在此dist文件

10.若是要访问前端项目,只需在nginx中设置下反向代理即可访问前端页面。

十五、权限分配

1.添加用户,系统管理-》jenkins专有用户数据库-》新建用户,填写用户信息

2.添加角色分配插件,系统管理-》插件管理,添加Role-based Authorization Strategy插件

3.修改权限方式 ,系统管理-》全局安全设置,授权策略改为Role-Based Strategy

修改完成后,在系统管理才会出现Manage and Assign Roles

4.设置权限,系统管理-》Manage and Assign Roles,可以设置角色,给用户分配角色。

5.设置角色,系统管理-》Manage and Assign Roles-》Manage Roles
Global roles:最外层比较宏观的权限,全局角色,针对此角色设置操作某个菜单的权限
Item roles:针对任务进行的权限分别,利用正则标识式进行设置

此处全局角色,设置了一个view,只分配了一个read的权限;任务添加了一个web角色,利用正则表达式匹配任务名为web开头的任务。

6.给用户分配角色,系统管理-》Manage and Assign Roles-》Assign Roles
此处给用户张三、李四分配的view角色,登录进来后看不到删除、编辑、添加相关的菜单。


在item roles给张三、李四勾上可以操作的任务

此时用户张三、李四登录可以看到分配的任务,利用正则标识式匹配的任务列表

而我们系统中是有两个任务的,下面的图是管理员看到的结果。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4