本文主要展示如何在服务器上安装 Jenkins。
Jenkins 可以用来构建发布项目,它本质上是一个流程控制框架,没有插件的话,Jenkins 什么也干不了。
# 安装 Java
# 通过安装包进行安装
下载 .rpm 格式的 jdk 安装包 (opens new window)到本地电脑。
执行 scp (opens new window) 命令,将 jdk 安装包上传到服务器上,一般放在 opt 目录中,因为这个目录是用来存放应用程序的。注意,以下命令中的 scl 是我之前创建的免密登录服务器的别名。如果没有配置本地免密登录文件,则需要使用
服务器登录用户名@ IP 地址或域名
的形式。比如:scp jdk-11.0.9_linux-x64_bin.rpm root@120.78.199.123:/opt
scp jdk-11.0.9_linux-x64_bin.rpm scl:/opt
执行完毕后,登录服务器就可以看到 opt 目录中已经有上传的安装包了。
- 在服务器上,进入到 opt 目录中,执行 rpm (opens new window) 命令进行安装。
rpm -ivh jdk-11.0.9_linux-x64_bin.rpm
这样,Java 开发需要的 jdk 环境就安装成功了。
# 通过命令进行安装
- 可以先用以下命令查看已安装的 jdk 版本
rpm -qa|grep jdk
- 如果已安装的 jdk 版本不符合要求,需要先卸载掉再重新安装
yum -y remove jdk-14.0.1-14.0.1-ga.x86_64
- 查看所有可安装的版本
yum --showduplicate list java*
- 重新安装指定版本的 jdk
yum install java-11-openjdk.x86_64
注意
jenkins 对 java 的版本有严格的要求,如果没有安装正确版本的 java,将会导致 jenkins 无法访问。
在 2.164 以及更新的版本中,需要安装 Java 8 or Java 11。具体版本要求可以查看:jenkins 对 java 的版本要求 (opens new window)。
# 安装 Jenkins
我的服务器的系统是 ContOS 7,而官网 (opens new window)介绍的安装方式中,并没有这个系统的。注意,apt-get 命令是 Ubuntu 系统上的,在 ContOS 7 上安装软件包应该用 yum 命令。
ContOS 7 的 Jenkins 安装包可以从 redhat (opens new window) 获取,在服务器中依次执行以下命令即可完成安装。
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
yum install jenkins
2
3
4
5
- 配置用户名和端口号。首先执行
find / -name jenkins
命令,可以得到 jenkins 相关的所有目录。
/usr/lib/jenkins
/var/lib/yum/repos/x86_64/7/jenkins
/var/lib/jenkins
/var/cache/yum/x86_64/7/jenkins
/var/cache/jenkins
/var/log/jenkins
/run/lock/subsys/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/etc/rc.d/init.d/jenkins
2
3
4
5
6
7
8
9
10
/etc/sysconfig/jenkins
这个就是 jenkins 的配置文件所在的目录。
执行 vi /etc/sysconfig/jenkins
命令可以进入配置文件中修改用户名和端口号。
JENKINS_USER = "root" # 防止权限问题
JENKINS_PORT = "8082" # 防止端口冲突
2
# 启动 Jenkins
- 安装完成后,使用
service jenkins
命令可以查看 jenkins 的一些使用命令。可以使用service jenkins start
命令来启动 jenkins。
- 成功启动 jenkins 之后,我们就可以在浏览器中通过访问
<你的服务器外网地址>:端口号
来访问 jenkins 了。但此时很有可能会出现无法访问的问题。碰到这个问题时,有以下几点原因,需要逐步排查。
📌 首先,查看自己安装的 jdk 版本是否正确,需要安装 Java8 或 Java11。具体版本要求可见:jenkins 对 java 的版本要求 (opens new window)。
📌 其次,查看服务器防火墙是否有允许指定端口号通过。
可以通过以下命令查看当前防火墙允许通过的所有端口号。
firewall-cmd --zone=public --list-ports
可以通过以下命令让防火墙永久放通指定端口号。
firewall-cmd --permanent --zone=public --add-port=8082/tcp
注意,执行完以上命令后,需要重载防火墙配置。
systemctl reload firewalld
防火墙常用命令
# 查看防火墙状态
systemctl status firewalld
# 启动防火墙
systemctl start firewalld
# 关闭防火墙
systemctl stop firewalld
# 开机自启动
systemctl enable firewalld
# 关闭开机自启动
systemctl disable firewalld
# 重载防火墙配置
systemctl reload firewalld
# 使用 firewall-cmd 命令
# 查看防火墙状态,running 表示正在运行
firewall-cmd --state
# 重载防火墙配置
firewall-cmd --reload
# 查看所有开放的端口号
firewall-cmd --zone=public --list-ports
# 永久开放某个端口号
firewall-cmd --permanent --zone=public --add-port=8082/tcp
# 永久开放多个端口号
firewall-cmd --permanent --zone=public --add-port=8080-8083/tcp
# 永久关闭某个端口号
firewall-cmd --permanent --zone=public --remove-port=8080/tcp
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
📌 最后,确定自己的服务器是否做了安全组设置。
- 阿里云服务器
- 腾讯云服务器
如果以上步骤都配置好了,那么就可以在浏览器中正常访问 jenkins 了😄。接下来就是对 jenkins 进行一系列配置了。
# 配置 Jenkins
# 引导配置
下面就是根据引导一步一步进行 jenkins 的配置了。
- 在服务器上执行命令
cat /var/lib/jenkins/secrets/initialAdminPassword
获取密码,然后粘贴到这里登录。
- 点继续之后,就会看到安装插件的引导页,我们可以直接点击安装推荐的插件,便会帮我们安装一些常用的插件。
- 插件安装完成后,就可以创建管理员用户了。
- 实例配置,采用默认的就好了。
- Jenkins 已准备就绪。点击开始使用 Jenkins,就可以看到 jenkins 的主界面了。
# 插件源配置
- 替换插件更新源。在
系统管理 -> 插件管理 -> 高级 -> 升级站点
中把原来的https://updates.jenkins.io/update-center.json
替换成清华源 (opens new window)https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
。然后点击提交和立即获取。
离线安装插件
我们也可以通过离线安装的方式来安装 Jenkins 插件。离线安装方法如下:
- 首先需要去 Jenkins 的插件商店 (opens new window)搜索自己想要的插件,然后点击进入到相应的版本下载页面,再点击想要下载的版本号,就可以下载对应版本的插件了。
- 进入到 Jenkins 中的
系统管理 -> 插件管理 -> 高级 -> 上传插件
,将刚刚下载下来的插件上传上来进行安装就可以了。
到此,整个 Jenkins 的启动与基本配置就完成啦~接下来可以开心的使用啦。😄
# 配置注意点
注意
读取设置不要随便点确定,否则之前所有的配置就会没了。除非配置乱了,需要重新开始配置。
已安装插件列表中那些不能点击卸载的插件是因为它们是其他插件的依赖,有其他插件依赖了它们,所以不能卸载,除非依赖它们的插件被卸载了,它们才可以被卸载。
已安装的插件是不会出现在可选插件列表中的。
使用 jenkins 时,是需要什么插件再去安装的。常用的插件有以下这些:
Localization: Chinese (Simplified)
NodeJS Plugin
Git PreBuildMerge Trait Plugin
GitHub Integration Plugin
Publish Over SSH
SSH Agent Plugin
Workspace Cleanup Plugin
Build Timeout
Generic Webhook Trigger Plugin
之后缺少的插件再去 Jenkins 的插件商店 (opens new window)上找就行了。
如果需要扩容的话,需要在节点管理里配置,增加节点。
Jenkins 命令行是 Jenkins 的客户端,使用挺麻烦的,一般用不着。脚本命令行是可以用 Groovy 去编写脚本,忽略就行了,用不着。
Managed files 是用来给 Jenkins 写配置文件的,一般也用不着。
必须等任务执行完成后,才能点准备关机,不然的话任务执行流程会出问题,数据可能会受到破坏。而且一旦点了准备关机之后,就不会接收构建新任务了。
使用 Jenkins 过程中还可能出现以下问题:
解决方法是,在 系统设置 -> 全局安全设置 -> 跨站请求伪造保护
中勾选启用代理兼容。
# 权限配置
Jenkins 的权限管理方案主要有以下 3 种:
基于角色/项目的权限管理
基于安全矩阵的权限管理
gitlab 集成的权限管理方案
# 新建 Jenkins 任务
- 输入任务名称,并选择构建的项目类型,一般选择第一个就行了,下面的都是比较复杂的项目才需要的。
- 配置 Git 仓库地址,但是配置的时候却出现了以下问题。
出现这个问题的原因是,服务器上没有装 Git,执行 yum install git
命令,安装 Git。安装完成后,再执行 which git
或者 whereis git
命令,查看 Git 的安装路径。
- 配置好代码仓库地址,我这里用的是 Gitee,因为 Github 实在是太慢了,代码一直拉不下来。
- 编写构建脚本。
# 安装依赖
npm install
# 打包
npm run build
# 将打包后的文件复制到指定目录中
cp -r docs/.vuepress/dist /etc/nginx
2
3
4
5
6
- 因为我的项目是用 VuePress 搭建的,所以还需要在服务器上装好 Node 环境和安装 VuePress。
VuePress 的安装直接使用 cnpm 就可以了,使用 npm 太慢了。
cnpm install -g vuepress
- Jankins 配置环境变量
我们在服务器上装好 Node 环境后,还需要在 Jenkins 上配置环境变量,才能正常使用。在 系统管理 -> 系统配置 -> 全局属性 -> 环境变量
中配置。
先在服务器上通过以下命令查看环境变量值。
echo $PATH
然后配置如下。
此时,点击项目的立即构建按钮就可以看到构建成功啦~🤣
- 每次构建前自动清空项目的工作空间。需要安装
Workspace Cleanup Plugin
这个插件,然后在项目配置的构建环境那里进行配置。
- 设置超时时间。需要安装
Build Timeout
这个插件,然后在项目配置的构建环境那里进行配置。
- 提交代码后自动进行构建部署。需要安装
Generic Webhook Trigger Plugin
这个插件,安装完成后配置方法如下。
- 在项目配置的构建触发器中勾选 Generic Webhook Trigger,勾选就行了,下面的东西都不用填。
- 点击右上角的登录用户名,然后点左侧的设置,在 API Token 那里点击添加新 Token,再点击生成,然后把生成的 token 复制一份。
- 进入 Gitee 上的项目中,点击管理 -> WebHooks,填写里面的 URL,其他的不用改也不用填写,URL 按照以下格式进行填写。
http://[Jenkins 登录用户名]:[上一步生成的 token]@[Jenkins 地址]/generic-webhook-trigger/invoke
填写完成后可以点击测试按钮测试是否成功。
到此,当每次提交代码到 Gitee 上时,Jenkins 就会自动进行构建部署了。
# 问题记录
# 进程自动被杀死
出现这个问题的原因是服务器内存不够,此时需要清掉服务器中的一些资源,腾出空间,就能解决问题了。
可以使用 free
命令查看内存使用情况。
释放内存的方法可以查看这里 (opens new window)。
除此之外,还可以优化 jenkins 的内存占用,输入 top
命令后按 M 键可以按内存消耗排序查看。
从图中可以看到 jenkins 占用内存较多,此时可以输入命令 vi /etc/sysconfig/jenkins
进入 jenkins 的配置文件,并修改其中的配置项 JENKINS_JAVA_OPTIONS
。
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
修改为:
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m"
保存后退出,再重启 jenkins,就可以看到 jenkins 的内存占用变少了。
systemctl reload jenkins
# Gitee WebHooks 触发构建时,多个任务会同时进行构建
Gitee WebHooks 触发 Jenkins 任务构建的方法是通过配置如下的 WebHook 地址:
http://[Jenkins 登录用户名]:[token]@[Jenkins 地址]/generic-webhook-trigger/invoke
不过,即使链接中的 token 不同,当我们向一个项目 push 提交代码时,Jenkins 还是会连同其他任务也一起构建,这当然不是我们想要的结果。不同任务的构建应该是相互独立、互不影响的。
解决的方法就是,在 Jenkins 的每个任务的配置中,找到 Generic Webhook Trigger 配置,然后在 Token 配置那里填上该任务触发构建时对应的 token,这样,我们就可以拿这个 token 作为触发该任务进行构建的一个认证,只有带有这个 token 的 WebHook 链接,才能触发它的构建。
因此,需要把 Gitee 上,不同项目的 WebHook 地址改为如下形式:
http://[Jenkins 登录用户名]:[token]@[Jenkins 地址]/generic-webhook-trigger/invoke?token=[token]
配置好之后,不同任务间的构建触发就不会相互影响了。
# JavaScript 堆内存不足
解决方法是:
将 vuepress 的默认打包命令从:
"build": "vuepress build docs",
改为:
"build": "node --max_old_space_size=8192 ./node_modules/vuepress/cli.js build docs",
# Babel 报的奇怪错误
这个问题很奇怪,莫名其妙就出现了,排查了两天也没解决,网上说的那些方法试了都没用,暂时先不解决了。