0


linux部署jenkins详细教程

引言

本教程采用jenkins.war的方式离线安装部署,在线下载的方式会遇到诸多问题,不宜采用

基本环境:

  1.jdk环境,Jenkins是java语言开发的,因此需要jdk环境。

  2.git/svn客户端,因一般代码是放在git/svn服务器上的,我们需要拉取代码。

  3.maven客户端,因一般java程序是由maven工程,需要maven打包,当然也有其他打包方式,如:gradle

教程篇幅很长,要想搭建一套完整的CI/CD工具,需要安装部署很多东西,笔者也是自己一点点摸索完成的,linux环境为笔者自己windows系统安装的虚拟机,windows安装虚拟机移步笔者这篇博客:windows11安装VMware----创建多虚拟机教程_vmware如何快速创建多个虚拟机-CSDN博客

记得给我点赞,我需要夸奖!

一、下载地址

地址:Jenkins download and deployment

下载最新的长期支持版

由于jenkins使用java开发的,所以需要安装的linux服务器装有jdk环境,并且jdk版本支持你所安装的jenkins版本

点击** Hardware and Software requirements**,查看下载前的软硬件要求

点击 Java Requirements

根据所下载的长期支持的jenkin版本区间 ,判定支持的jdk版本

因为笔者下载的的是 2.440.2 版本,结合上图判定2.440.2在2.426.1之后,需要的linux服务器安装jdk版本为jdk 11、jdk 17或者jdk 21,三者任意一个都可以,所以最终我选择了jdk 21安装到linux服务器中

当然可能你所在的linux服务器已经安装了jdk 8 或者jdk 11,并且由于其他应用的原因不能再升级jdk,那只需要找到对应jdk支持的jenkins版本进行下载即可

从上图看出,如果linux服务器安装的 jdk 8 ,下载 2.346.1、2.164.1任意一个都可以

如果安装的是 jdk 17,下载2.346.1、2.361.1、2.426.1任意一个

安装的是jdk 11 则以上四个长期版本都支持。

对于历史版本的下载,点击 Past Releases 链接

找到对应的版本下载即可

二、上传jenkins.war包

笔者是安装在 /opt下,创建 jenkins文件夹,使用最高权限root用户登录linux服务器

cd /opt

sudo mkdir jenkins
ll

依次输入以上三条命令

进入新创建的jenkins文件夹

cd jenkins

笔者使用的是FinalShell工具上传jenkin.war,一款国产免费的linux服务器 连接工具,功能强大,不过有安全性问题不推荐生产环境使用,推荐使用Xshell和Xftp组合工具

进入jenkins文件夹后可以看到上传的jenkins.war包

三、启动jenkins

先约定jenkins的启动端口为9007,实际自行更改,保证端口不冲突即可

查看防火墙状态

systemctl status firewalld

防火墙开启状态,则开通 9007 端口 访问权限,并重载防火墙

-- 开通 9007 端口 访问权限

sudo firewall-cmd --permanent --add-port=9007/tcp

-- 重载防火墙

sudo firewall-cmd --reload

cd /opt/jenkins 键入以下命令启动

nohup java -jar jenkins.war --httpPort=9007 | tee jenkins.log 2>&1 &

命令解释如下:

  1. nohup: 这是一个Unix/Linux命令,用于让程序在后台运行,即使用户注销也不会停止运行(No Hang Up)。使用 nohup 可以确保即使SSH会话关闭,Jenkins服务仍然持续运行

  2. java -jar jenkins.war --httpPort=9007: 这是启动Jenkins服务的命令,其中 -jar 参数表示要执行包含在WAR文件中的主类(在这种情况下是Jenkins应用),--httpPort=9007 是指明Jenkins服务器监听的HTTP端口号为9007

  3. | tee jenkins.log: | 是管道操作符,它将前一个命令的标准输出(stdout)传递给后续命令。tee 命令则接收这些输出,并同时完成两个任务:
    将输出内容“复制”一份写入到 jenkins.log 文件中,相当于实时记录了Jenkins启动过程和运行时的日志信息。
    继续将接收到的数据传递到下一个管道或者默认的标准输出(此处由于后面没有其他命令,就是当前终端),所以在终端上也能看到相同的日志输出

  4. 2>&1: 这个符号组合将标准错误流(stderr)重定向到标准输出流(stdout)。这意味着不论是正常的程序输出还是错误信息,都将统一作为标准输出处理,所以不论是正常日志还是错误日志,都会经过管道并被tee命令捕捉

  5. &: 最后的&符号用于将整个命令放入后台运行,使得命令执行后,控制台立刻返回到可输入状态,而无需等待该命令执行完毕

出现以上信息说明 jenkins启动成功 ,即使终端关闭也可以

初始用户名和密码 为 admin 103ed60c535f4c8daec0d81d66b9ea9d

初始admin用户密码如果忘记,则去 /root/.jenkins/secrets/initialAdminPassword 中寻找

使用 tail -f /root/.jenkins/secrets/initialAdminPassword 打开可以看到存储的初始jenkins密码

四、设置开机自启动

通过命令 nohup java -jar jenkins.war --httpPort=9007 | tee jenkins.log 2>&1 & 可以后台永久启动jenkins服务,但服务器一旦关闭重启,还是需要进入jenkins.war所在文件夹目录重新执行启动命令

4.1 创建并编辑jenkins.sh 脚本

首先 cd /opt/jenkins,创建jenkins.sh 脚本文件,随便放哪里都可以,但一般和jenkins.war处在同一个文件目录下

vim jenkins.sh

按 i 键 输入以下内容 ,红色部分为需要根据自己对应环境路径自行修改

jenkins的主目录默认为 /root/.jenkins,你也可以在如下命令中加入红色部分改变jenkins的默认主目录,一般情况下不需要改,用默认的就可以

nohup $JAVA_HOME/bin/java -DJENKINS_HOME=/usr/local/jenkins -jar /opt/jenkins/jenkins.war>/opt/jenkins/jenkins.log --httpPort=9007 2>&1 &

#!/bin/bash
#主要目的用于开机启动服务,不然 启动jenkins.war包没有java -jar的>权限
JAVA_HOME=/usr/local/jdk/jdk-21.0.2

pid=`ps -ef | grep jenkins.war | grep -v 'grep'| awk '{print $2}'| wc -l`
  if [ "$1" = "start" ];then
  if [ $pid -gt 0 ];then
  echo 'jenkins is running...'
else
  #java启动服务 配置java安装根路径,和启动war包存的根路径
  nohup $JAVA_HOME/bin/java -jar /opt/jenkins/jenkins.war>/opt/jenkins/jenkins.log --httpPort=9007  2>&1 &
  fi
  elif [ "$1" = "stop" ];then
  exec ps -ef | grep jenkins | grep -v grep | awk '{print $2}'| xargs kill -9
  echo 'jenkins is stop..'
else
  echo "Please input like this:"./jenkins.sh start" or "./jenkins stop""
  fi

按下 esc键,输入 :wq 保存退出,键入以下命令赋予脚本可执行权限

chmod +x /opt/jenkins/jenkins.sh

4.2 检测jenkins.sh 脚本

在当前jenkins目录下输入

./jenkins.sh stop

浏览器刷新访问jenkins地址,无法访问

再输入启动命令启动

./jenkins.sh start

浏览器再次刷新发现启动成功

以上说明编写的 jenkins.sh 脚本文件没有问题

4.3 创建并编辑 jenkins.service 系统服务文件

键入命令

vim /lib/systemd/system/jenkins.service

按 i 键 输入以下命令

[Unit]
Description=Jenkins
After=network.target
 
[Service]
Type=forking
ExecStart=/opt/jenkins/jenkins.sh start
ExecReload=
ExecStop=/opt/jenkins/jenkins.sh stop
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

创建好服务后,执行命令刷新配置

systemctl daemon-reload

启动脚本

systemctl start jenkins.service

查看状态

systemctl status jenkins.service

设置开机自启动

systemctl enable jenkins.service

查看开机自启动的服务列表

systemctl list-units --type=service

看到已存在jenkins.service服务

输入 reboot重启验证,访问jenkins地址,开机自启动成功

五、jdk环境准备

请移步这篇文章:

linux离线安装jdk-CSDN博客

六、git环境准备

关于linux系统安装git,请参考笔者这篇博客:

linux安装git-CSDN博客

七、maven安装

maven安装linux参考博客:

linux离线安装maven-CSDN博客

八、nodejs安装

nodejs安装参考笔者这篇文章

linux离线安装NodeJs-CSDN博客

九、nginx安装

nginx安装参考笔者这篇博客

linux系统离线安装nginx-CSDN博客

十、jenkins使用

10.1 登录jenkins

浏览器打开jenkins访问地址,

http://ip:port

笔者的地址为:http://192.168.19.16:9007

输入之前记录的密码 :103ed60c535f4c8daec0d81d66b9ea9d

或者执行命令查看初始密码

tail -f /root/.jenkins/secrets/initialAdminPassword

安装插件,这里要求服务器处于联网状态,自动下载相关插件

创建新用户,这里如果选择额使用admin账户继续,那么就不需要填写创建第一个管理员用户的信息了,因为不会创建,唯一的初始用户只有admin

但如果选择保存并完成,那么admin账户会消失,唯一的初始管理员用户会是你创建的这个用户

这里的地址不用修改,就是jenkins的访问地址

10.2 新建管理员权限用户

继续往下点

点击用户列表,可以看到就一个admin用户,之前创建的管理员用户没成功,应该是笔者点了使用admin账户继续导致

点击系统管理 ,点击管理用户

create user

可以看到新建了一个用户,如果想要修改密码等信息,点击编辑按钮进入修改即可

10.3 插件下载

jenkins要用来构建前后端项目

nodejs # 构建前端项目
maven integration # 构建后端项目
webhook # 自动化构建(网络钩子)

gitLab Plugin #gitLab插件
git plugin # 基础git
publish over ssh # 连接远程服务器

Git Parameter # git参数化构建插件

Localization: Chinese(Simplified) #汉化插件

Generic Webhook Trigger #webhook钩子自动构建

点击系统管理->插件管理

点击Avaliable plugins,需要什么插件,搜索下载安装即可 ,有的插件需要重启jenkins才能生效,比如maven

插件装好后,需要进行全局配置

10.4 全局配置

10.4.1 maven配置

这里配置的路径是你jenkins所在linux服务器中,安装的maven里settings.xml的路径,笔者是安装在这个路径下

10.4.2 JDK安装

笔者安装的是jdk-21.0.2,JAVA_HOME路径如下,按照jenkins服务器安装的jdk路径填写,这里如果填写的不对,会有错误提示

自动安装不需要打勾

10.4.3 git 安装

笔者在安装git时,把git的安装在 /usr/local/git路径下了。

linux安装git-CSDN博客

下图为笔者在安装git时设置的安装路径

但是实际的git执行路径需要到服务器上执行which git寻找

10.4.4 maven安装

按照maven的安装路径来

10.4.5 nodejs安装

一样的,按照linux服务器安装的nodejs路径填写

以上设置完后,点击应用

10.5 系统配置

点击进入系统配置

新增三个环境变量分别填写如下信息,应用即可

10.6 后端任务构建

输入项目名称,选择构建maven项目,点击确定

点击DashBoard 回到主界面,可以看到新建的后端构建任务

10.6.1 编辑后端任务构建配置

点击配置

这里按需填写,主要是构建的天数和构建记录的保存个数

这个参数化设置可以不勾选设置(一般是不设置的,这里只是为了说明),默认分支选择main分支(旧版的gitLab默认分支是master),git

参数名称也可以设置成其他的比如branch

这里填写上项目的gitLab拉取地址后,报错无法连接

是因为下面的凭据没有填写

点击Credentials的添加按钮,填写上拥有项目拉取权限的用户名和密码,点击添加

发现不报错了

下面的这里,如果之前的参数化设置勾选并设置了参数名称version,这里就写${version},参数名称是branch,这里就是${branch},否则填写上拉取的指定分支 */main

clean package -Dmaven.test.skip=true

这句话意思是清理旧文件,跳过测试,直接打包

点击保存

9.8 构建后端任务

点击DashBoard返回到主界面,点击构建

点进去查看构建进程

可以看到已经构建成功了

我们去jenkins所在服务器的 /root/.jenkins/workspace/redis-demo/target 文件夹下查看 到构建后的jar包

10.6.2 部署到远程服务器

以上的步骤只是jenkins完成了代码拉取,自动打包构建的过程,实际场景中我们还需要把打包好后的jar包发送到远程服务器,并执行启动命令 启动服务

10.6.2.1 添加远程服务器ssh

点击系统管理,点击系统配置

拖到最底部,点击新增SSH server

这里的192.168.19.16就是笔者要发送到的远程linux服务器地址,采用root用户登录,指向的文件夹路径为根路径 / 下面

勾选使用密码授权登录方式,输入root用户登录密码

连接远程linux服务器的默认端口号是22不用修改,超时时间设置为300秒 (自行决定)

笔者这里只配置了一个ssh服务器,如果有多个服务器,则都在这里添加上,方便后面部署各种项目用到不同服务器

10.6.2.2 添加构建后操作

配置构建任务的构建后操作,即把jar包发送到远程服务器的指定路径下,并启动

点击当前任务

点击配置

拖到底部,点击增加构建后操作步骤

配置一台远程服务器的信息

说明:

Name:这里是之前在系统管理->系统配置里添加的远程服务器,是下拉选择的,需要远程部署的服务器

source files:这是相对路径,构建的时候可以看到Jenkins把从git上拉取的代码打包放到

/root/.jenkins/workspace/redis-demo/target/ 路径下了

当前相对路径的根路径其实就是我们新建的 /root/.jenkins/workspace/redis-demo/下

在工作空间上看到

所以jar包的相对路径就是 target/redis-demo-0.0.1.jar

Remove prefix:这个没什么好说的,移除前缀,就是jenkins把主目录工作空间下的jar包发送到远程服务器指定路径下时只发送jar包,如果不把target/去除,那就会在指定路径下创建target文件夹,然后再发送jar包到target下,看下图

这显然不符合要求了,所以需要移除 target/

Remote directory:远程服务器的指定路径,笔者让jenkins把jar包发送到远程服务器的 /opt/softs 指定路径下,前提是要有这个路径,先去远程服务器创建好

cd /opt

sudo mkdir softs

笔者专门为微服务写了一个执行脚本放在远程服务器 /opt/softs 路径下,和jar包放在一起

cd /opt/softs

vim redisDemo.sh

填入如下命令

#!/bin/bash

#定义微服务相关参数
SERVICE_NAME="redis-demo"
JAR_FILE="/opt/softs/redis-demo-0.0.1.jar"
LOG_FILE="redisDemo.log"
JAVA_OPTS="-Xmx2048m -Xms64m" # 可根据实际需求调整JVM内存设置
RUNNING_USER="root" # 运行微服务的用户,确保该用户存在并有适当权限

# 检查是否已设置JAVA_HOME环境变量
if [ -z "$JAVA_HOME" ]; then
    echo "java 环境变量未设置"
    exit 1
fi

# 启动微服务
function start_service {
    echo "Starting $SERVICE_NAME..."
    if [ "$(id -u)" != "$RUNNING_USER" ]; then
        sudo -u $RUNNING_USER sh -c \
            "nohup $JAVA_HOME/bin/java $JAVA_OPTS -jar $JAR_FILE > $LOG_FILE 2>&1 & echo \$! > /var/run/$SERVICE_NAME.pid"
    else
        nohup $JAVA_HOME/bin/java $JAVA_OPTS -jar $JAR_FILE > $LOG_FILE 2>&1 &
        echo $! > /var/run/$SERVICE_NAME.pid
    fi
    echo "$SERVICE_NAME started with PID `cat /var/run/$SERVICE_NAME.pid`."
}

# 停止微服务
function stop_service {
    echo "Stopping $SERVICE_NAME..."
    if [ ! -f "/var/run/$SERVICE_NAME.pid" ]; then
        echo "$SERVICE_NAME is not running."
        return 1
    fi

    local pid=$(cat /var/run/$SERVICE_NAME.pid)
    kill -15 $pid || kill -9 $pid
    rm -f /var/run/$SERVICE_NAME.pid
    echo "$SERVICE_NAME stopped."
}

# 检查服务是否正在运行
is_service_running() {
    if [ -f "/var/run/$SERVICE_NAME.pid" ] && kill -0 $(cat /var/run/$SERVICE_NAME.pid) &> /dev/null; then
        return 0
    else
        return 1
    fi
}

# 重启微服务
function restart_service {
    if is_service_running; then
        stop_service
    fi
    start_service
}

# 判断传入的操作类型
case "$1" in
    start)
        start_service
        ;;
    stop)
        stop_service
        ;;
    restart)
        restart_service
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit 0

Exec command:这个是最重要的执行启动服务的sh脚本了

source /etc/profile
cd /opt/softs
chmod 755 redisDemo.sh
sh /opt/softs/redisDemo.sh restart

依次是 刷新环境变量

执行脚本授权

执行脚本启动命令

10.6.2.3 构建后端任务并发布远程服务器启动

保存后去点击构建

笔者的jar包,端口设置的是 8888

去远程服务器的 /opt/softs 文件夹下查看

查看端口 8888 是否启动

至此后端项目构建成功了

浏览器访问下后端get类型接口成功了(注意服务的端口8888,linux要开放)

服务器日志

10.7 前端任务构建

10.7.1 新建前端任务

点击确定,点击Dashboard(笔者是已经构建成功后的截图),可以看到新建的前端项目任务

10.7.2 编辑前端任务构建配置

然后是配置从git拉取前端代码 ,分支选择的是main分支,自行决定代码用于什么环境,就配哪个环境的分支

构建环境,这里红框部分必须勾选,配上之前的node环境变量,如果不设置,下面的执行npm相关命令会不成功

点击增加构建步骤

cd /root/.jenkins/workspace/web-project
/opt/nodejs/node-v16.20.2/bin/node /opt/nodejs/node-v16.20.2/bin/npm install
/opt/nodejs/node-v16.20.2/bin/node /opt/nodejs/node-v16.20.2/bin/npm run build
tar -czvf dist.tar.gz -C ./dist .

这里解释下命令

第一行是进入当前jenkins工作目录的当前构建任务文件夹下

第二行是执行npm install,路径根据服务器上解压的node路径来,要写绝对路径

第三行是把从git拉过来的前端代码文件,执行打包构建命令,笔者的前端是一个最基础的vue3项目,如果不做配置,打包后的文件都放在了一个叫dist文件中,本地打包的截图

第四行是压缩命令,遍历dist文件夹下的子目录并压缩成名为dist.tar.gz的压缩包,

注意辨别以下命令

tar -czvf dist.tar.gz ./dist

//后面有一个英文黑点

tar -czvf dist.tar.gz -C ./dist .

如果是 tar -czvf dist.tar.gz ./dist 这个命令(后面没有黑点),则压缩的是一整个dist文件夹,而不是dist文件下的子内容

最后是构建后操作

这里服务器和后端是用的同一台,如果前端需要部署在其他远程服务器上,则参照10.6.2.1配置ssh服务器,在这里就可以下拉选择了

Source files:前端任务的工作空间目录在 /root/.jenkins/workspace/web-project 下,压缩后的压缩包就在这个目录下

这里和后端不一样的地方是,后端打jar包后还有个target文件夹,多一层,这里没有

Remove prefix:这里不需要填写需要移除的前缀了

Remote directory:这里是要把压缩包发送到服务器上的nginx安装路径下,根据自己的nginx安装路径来配置

Exec command:

cd /usr/local/nginx/html/
tar -zxvf dist.tar.gz -C /usr/local/nginx/html/
rm -rf dist.tar.gz

主要是解压命令

以上文件编辑好后,点击保存

10.7.3 构建前端任务,发布远程服务器

查看控制台输出,构建成功

去远程服务器 nginx路径看下,发布远程服务器成功了

10.7.4 nginx前端访问

笔者之前安装的nginx端口改成了8081,8081端口放开防火墙限制

这里能直接访问,和配置文件里的默认配置有关

cd /usr/local/nginx/conf

vim nginx.conf

看下nginx的配置

root html

,Nginx会在其安装路径下寻找一个名为

html

的目录 ,就找到了 /usr/local/nginx/html下,如果是放在其他地方,root后面可以修改成你的前端文件所在路径

index index.html index.htm,这个是前端界面入口文件,一般前端打包后默认的就是这个,当然这个是可以修改的,不一定非得叫index.html,这里贴一段解释

再看location /

在Nginx的配置文件中,

location /

指令表示对web服务器根路径的匹配。也就是说,任何对服务器的请求都会匹配到这个

location

块。这通常用于设置网站的根访问路径。

server {
listen 80;
server_name example.com;

location / {
     # 这里可以配置处理根路径请求的相关指令
 }

location /images {
     # 这里配置处理/images路径的相关指令
 }

location /api {
     # 这里配置处理/api路径的相关指令
 }

}

http://192.168.19.16:8081请求会匹配到 location /,

http://192.168.19.16:8081/api/... 会匹配到location /api

主要是做请求转发,这里也可以用来代理后端地址的,其后端同时代理,一般按如下配置

server {
listen 8081;
server_name example.com;

# 前端代理
 location / {
     root /path/to/frontend;  # 指定前端项目的根路径
     index index.html;  # 指定默认的首页文件
     try_files $uri $uri/ /index.html;  # 配置SPA应用的路由
 }

# 后端API代理
 location /api {
     proxy_pass http://backend-api-server;  # 指定后端API服务器地址
 }

}

十一、前后端任务构建远程部署整合

笔者做了个测试把这两个前后端构建任务结合起来部署运行

以下是nginx配置

可以看到调用的后端服务端口是8888

http://192.168.19.16:8081/api/redisTest请求会被替换成

http://192.168.19.16:8888/api/redisTest

微服务环境下这里会配置成gateway网关地址,请求到达后端时,会根据请求路径分发到具体不同的服务中去

笔者的后端服务用到了redis,需要linux服务器安装redis,具体参考笔者的这篇redis教程

linux离线安装redis-CSDN博客

如果不想装redis,自己把后端代码redis相关调用去掉即可

前后端代码已上传gitee

前端:buxingzhe/web-project

后端:buxingzhe/redis-project

十二、拓展--webhook网络钩子自动构建

之前的构建都是手动触发的,当我们提交完代码到gitLab后,需要自己去jenkins点击对应的构建任务重新构建发布

有没有当我们提交代码后就能自动触发构建任务,远程发布的方法?

当然是有的,虽然自动构建的功能实际使用的不多,主要是频繁构建影响使用,但是当团队有这个需求时还是很好用的,下面展示如何配置gitLab的webhook触发jenkins自动构建

首先在jenkins上配置任务的触发器,注意这个url,gitLab要用到

设置好后点击保存应用

然后使用项目的创建者账户登录gitLab,比如笔者的redis-demo后端项目,是由boss账户创建的,则登录boss账户

点击admin area->setting->network

勾选允许本地网络发送请求 ,因为笔者的jenkins和gitLab部署在同一台服务器

接着点击后端项目

点击manage access

点击setting webhooks,add new webhook

填写url,这里的url是jenkins构建触发器时显示的url

保存

提交代码,看下jenkins是否自动构建,可以看到已经触发自动构建了

前端项目也是一样的步骤,这里不再叙述

十三、总结收尾

通过这篇如此细致而又略显啰嗦的教程,基本掌握了前后端搭建自动化部署的原理和实操方法,掌握了开发环境搭建的完整步骤,笔者在工作之余花费了很大精力在这篇博客上,如果能给刷到这篇文章的朋友提供帮助,请点赞支持我吧!

标签: linux jenkins 运维

本文转载自: https://blog.csdn.net/weixin_40141628/article/details/137105584
版权归原作者 熊出没 所有, 如有侵权,请联系我们删除。

“linux部署jenkins详细教程”的评论:

还没有评论