离线部署 Jenkins 填坑指南

开发 架构
本篇讲解了在离线环境下如何部署 Jenkins、Jenkins 插件、Maven、Java、Git 工具。在部署的过程中遇到了很多坑,遇到一个解决一个,希望大家在以后遇到类似问题时,能根据本文档缩短排查问题的时间。

本文目录如下:

图片

一、背景

在实际项目中,通过这些实践,目前已经稳定运行了两个月,现在又有了一个新项目也是需要用 Jenkins 来实现自动化部署,但新项目的部署环境是 Linux 离线环境,所以我需要在离线环境上再部署一遍。

因为部署 Jenkins 的机器上没有网络,所以部署的过程中遇到了很多坑,本篇文章也是为了记录期间遇到的坑,以及解决方案。

二、依赖项

部署后端项目时需要依赖 Java、Maven、Git,对应的离线包版本如下表所示。

序号

依赖项

版本

1

Linux 服务器

建议 ubuntu 20 以上

2

Jenkins 离线 war 包

2.426.1(当前最新版本)

3

Java 离线包,后端部署需要

Java 11, Java 17 or Java 21

4

Maven 离线安装,后端部署需要

Maven 3.8.8

5

Git 离线包,拉取代码

2.9.5(当前最新版本)

关于离线部署前端项目会放到下一讲。

三、下载 Jenkins 安装包

安装包路径:

https://get.jenkins.io/war-stable/

选择版本:2.426.1

图片图片

下载完是一个 war 包,后续用 Java 启动这个 war 包即可。

图片图片

四、安装 Java

下载 Java 17 安装包

图片图片

创建目标目录:

sudo mkdir -p /usr/local/java

复制安装包到目标目录:

sudo cp /path/to/jdk-17_linux-x64_bin.tar.gz /usr/local/java

解压安装包:

cd /usr/local/java
sudo tar -xvzf jdk-17_linux-x64_bin.tar.gz

移除压缩包:

sudo rm jdk-17_linux-x64_bin.tar.gz

配置环境变量:

sudo vim /etc/profile

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin

加载环境变量:

source /etc/profile

检查 Java 版本:

java -version

java 版本java 版本

五、启动 Jenkins

启动方式分为两种:

  • 直接启动
  • 后台静默启动

直接启动 jenkins

执行启动的命令:

java -jar jenkins.war --httpPort=8082

后台静默启动

执行启动的命令:

nohup java -jar jenkins.war --httpPort=8082 >nohup.out 2>&1 &

打开 Jenkins 站点

打开 Jenkins 站点 http://<你的服务器ip>:8082。

遇到异常,提示如下:

图片图片

java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration

解决方案:

将安装了 java8 的 fontconfig.bfc 文件拷贝到 jenkins 那台服务器上的 java lib 目录下

fontconfig.bfc 示例路径:C:\Program Files\Java\jre1.8.0_191\lib\fontconfig.bfc

拷贝到 /usr/local/java/lib/ 目录

再次启动,运行成功。另外有一个提示无法访问 jenkins 更新网站的错误,可以忽略,因为该服务器没联网所以访问不到。

图片图片

jenkins 运行目录

另外还需要从打印的日志找到 jenkins 的运行目录,后续会用到。

如下图所示,在 /home/xxx/.jenkins 目录。

jenkins 运行目录jenkins 运行目录

该目录下有一个非常重要的目录:plugins,我们可以拷贝一些插件到这个目录里面,这样 jenkins 就可以启动这些插件了。

图片图片

六、配置 maven

下载地址:

https://maven.apache.org/download.cgi

解压文件夹:

cd /usr/local
tar -zvxf /usr/local/maven/apache-maven-3.8.8-bin.tar.gz
mv  apache-maven-3.8.8/* maven
sudo rm -rf apache-maven-3.8.8
sudo rm -rf /usr/local/maven/apache-maven-3.8.8-bin.tar.gz

添加环境变量:

sudo vim /etc/profile

配置信息:

export M2_HOME=/usr/local/maven
export MAVEN_HOME=/usr/local/maven
export PATH=${M2_HOME}/bin:${PATH}

加载配置

source /etc/profile

查看 maven 配置是否生效:

mvn -version

图片图片

七、配置 Git

下载安装包

网站路径:https://mirrors.edge.kernel.org/pub/software/scm/git/

拷贝到这个目录下 /usr/local/git/,如果没有 git 目录则新建一个。

sudo mkdir -p /usr/local/git

图片图片

解压 git 安装包

sudo tar -xvzf /usr/local/git/git-2.9.5.tar.gz -C /usr/local/git

编译 git

cd /usr/local/git
./configure --prefix=/usr/local/git
make && make install

提示没有 gcc 编译器:

图片图片

解决方案:离线安装依赖包。

  • 下载依赖的安装包

下载地址:https://pkgs.org/search/?q=libnl-genl

  • 安装依赖的安装包
dpkg -i xxx.deb

再次编译,提示编译成功

图片图片

图片图片

添加 git 环境变量:

export PATH=$PATH:/usr/local/git/bin
source /etc/profile

查看 git 版本:

git --version

图片

八、安装 Jenkins 插件

离线环境下,不能通过直接选择插件安装的方式,所以需要将插件的离线包导入到 plugins 目录下。

  • 方式一:在线下载插件离线包并导入到 Jenkins 后台。
  • 方式二:批量拷贝同版本 Jenkins 在线安装的插件。

方式一:下载插件并导入

以下两个站点都可以在线下载插件。

https://plugins.jenkins.io/

http://updates.jenkins-ci.org/download/plugins/

安装 Git 插件

图片图片

可能会提示依赖的插件不存在,如下所示:

- Plugin is missing: structs (308.v852b473a2b8c)
 - Plugin is missing: workflow-scm-step (2.13)
 - Plugin is missing: scm-api (595.vd5a_df5eb_0e39)
 - Plugin is missing: mailer (408.vd726a_1130320)
 - Plugin is missing: credentials (2.6.1)
 - Plugin is missing: git-client (3.11.0)
 - Plugin is missing: script-security (1131.v8b_b_5eda_c328e)
 - Plugin is missing: workflow-step-api (622.vb_8e7c15b_c95a_)
 - Plugin is missing: credentials-binding (1.27.1)
 - Plugin is missing: ssh-credentials (1.19)

因为有些插件依赖其他插件,所以需要先将其他插件安装,如果再安装的过程中又遇到缺失其他的插件,都按这种方式处理。

方式二:批量拷贝已安装的插件

先在有网的机器上部署相同的版本的 Jenkins,然后在线安装所需插件,最后批量拷贝插件到离线的 Jenkins 插件目录下。

插件所在的目录一般在这里:

/home/<user>/.jenkins/plugins/

拷贝之后,重启 Jenkins 就会自动安装这些插件了。

九、配置全局工具

配置 Maven settings

在 Jenkins 后台系统管理->全局工具配置中添加 Maven settings 配置,如下图所示。

路径为 Maven setting 的文件路径:/usr/local/maven/conf/settings.xml。

图片图片

配置 Maven 安装

在 Jenkins 后台系统管理->全局工具配置中添加 Maven 安装配置,如下图所示。

路径为 Maven 的安装路径:/usr/local/maven/。

图片图片

配置 Java JDK

在 Jenkins 后台系统管理->全局工具配置中添加 Java 配置,如下图所示:

路径为 Java 的安装路径:/usr/local/java/。

JDK 路径配置JDK 路径配置

配置 Git

在 Jenkins 后台系统管理->全局工具配置中添加 Git 配置,如下图所示:

路径为 Java 的安装路径:/usr/bin/git。

图片图片

十、问题

问题 1、pipeline 输入框没有显示出来

F12 调试工具可以报错信息如下:

jenkins workflow-editor.js Ajax is not defined ReferenceError: Ajax is not defined

原因

插件有问题。

解决方案

替换所有插件文件。安装一个同样版本的 jenkins,并在线下载插件,并删除原 jenkins 的插件目录,然后替换全部插件文件。

问题 2、bat 命令不识别

java.io.IOException: Batch scripts can only be run on Windows nodes

原因

当前 Jenkins 部署在 Linux 系统中,所以不能识别 bat 命令。因为 bat 命令是 windows 系统使用的命令,而 sh 命令才是 linux 系统使用的命令。

解决方案

将 bat 改为 sh。

问题 3、执行 sudo 命令需要密码

SSH: EXEC: STDOUT/STDERR from command [sudo docker service update --force job-executor] ...
SSH: EXEC: connected
sudo: no tty present and no askpass program specified

原因

由于 jenkins 帐号并没有开启免密码导致的。

解决方法

给jenkins添加不用密码使用sudo的权限。

sudo vi /etc/sudoers

在sudoers文件中加一行:

jenkins ALL=(ALL) NOPASSWD:ALL

问题 4、RoleBasedAuthorizationStrategy 插件问题

报错信息

SEVERE  jenkins.InitReactorRunner$1#onTaskFailed: Failed Loading global config
com.thoughtworks.xstream.mapper.CannotResolveClassException: com.michelin.cio.hudson.plugins.rolestrategy.RoleBasedAuthorizationStrategy

原因

jenkins 插件安装有问题导致无法启动 jenkins

解决方案

修改 /home/xxx/.jenkins/config 文件

<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
  <denyAnonymousReadAccess>true</denyAnonymousReadAccess>
</authorizationStrategy>

问题 5、需要更新插件版本

部分插件由于缺少依赖无法加载。要恢复这些插件提供的功能,需要修复这些问题并重启 Jenkins。

图片图片

原因

缺少插件或版本不正确。

解决方案

将对应的版本的插件 xxx.jpi 下载后,在后台上传,部署插件完成后,勾选重启 jenkins 服务。

问题 6、Git 拉取代码提示证书问题

报错信息:

server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile:

原因

缺少证书。

解决方案

跳过 Git 的证书验证。

git config --global http.sslVerify false

问题 7、配置环境变量后,找不到 sudo 命令

报错信息:

Command 'sudo' is available in '/usr/bin/sudo'

原因

环境变量配置有问题,找不到

解决方案

使用以下命令重新打开 /etc/profile 文件

/usr/bin/sudo /usr/bin/vim /etc/profile

把以下环境变量配置到 profile 中的其他环境变量之前

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

图片图片

问题 8、Jenkins 时区问题相差 8 小时

解决方案

  1. 进入 Jenkins 的系统管理页面。
  2. 点击“脚本命令行”。
  3. 执行以下命令以设置时区为北京时间:
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
  1. 确保时区设置正确以便任务构建和定时构建按照北京时间触发。

十一、总结

本篇讲解了在离线环境下如何部署 Jenkins、Jenkins 插件、Maven、Java、Git 工具。

在部署的过程中遇到了很多坑,遇到一个解决一个,希望大家在以后遇到类似问题时,能根据本文档缩短排查问题的时间。

责任编辑:武晓燕 来源: 悟空聊架构
相关推荐

2022-06-01 21:23:12

ELKLogstash底层

2021-11-18 08:55:49

共享CPU内存

2020-11-03 08:36:08

Hadoop

2021-03-31 08:33:17

SysTick定时器SysTick定时器

2023-06-12 07:00:40

Rust进度任务

2020-10-29 10:22:44

中台

2016-10-19 19:03:18

javascriptes6React Nativ

2017-03-02 13:32:36

Android开发开发者

2021-10-29 15:50:52

鸿蒙HarmonyOS应用

2012-04-10 10:11:40

软件项目

2023-01-18 23:20:25

编程开发

2021-11-02 06:58:53

项目Ceph 内网

2021-04-16 08:11:24

js前端JavaScript

2024-04-24 13:45:00

2024-04-03 12:30:00

C++开发

2021-02-26 00:46:11

CIO数据决策数字化转型

2020-06-12 11:03:22

Python开发工具

2021-07-05 22:32:33

数据仓库团队

2012-11-20 10:20:57

Go

2018-01-20 20:46:33

点赞
收藏

51CTO技术栈公众号