问题说明,最终是在jenkins.service
中配置JAVA_HOME
解决的,但是我的服务器环境中确定已经配置好了Java环境变量,并且java -version
也能正常打印信息,不清楚为什么jenkins.service
无法读取配置
1.环境配置说明
服务器:阿里云ECS
操作系统:CentOS 7.9
目前最新的Jenkins已经不支持CentOS7了,需要更换更新的版本
Jenkins版本:2.462.2
2.安装过程说明
参考官网的安装指南进行安装:
https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos
shell
sudo wget -O /etc/yum.repos.d/jenkins.repo \
https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
sudo yum upgrade
# Add required dependencies for the jenkins package
sudo yum install fontconfig
sudo yum install jenkins
sudo systemctl daemon-reload
sudo systemctl enable jenkins
sudo systemctl start jenkins
由于服务器上安装过JDK17了,这里就没有再次安装
3.切换到jenkins用户
通过yum安装好Jenkins之后,为了减少安全风险,我计划使用jenkins用户来启动Jenkins,而不是root用户
首先通过su - jenkins
切换到jenkins用户,但发现并没有任何变化
通过whoami
指令查看当前用户,发现仍旧停留在root用户
此时通过检查用户权限以及shell配置来解决该问题:
- 检查用户权限:
sudo passwd -S jenkins
,提示信息如下:
plain
jenkins LK 2024-09-13 -1 -1 -1 -1 (Password locked.)
说明此时jenkins
用户被锁定
- 检查
/etc/passwd
中jenkins
用户的shell
是否有效:grep jenkins /etc/passwd
,结果如下:
plain
jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/false
/bin/false
表示 jenkins
用户的登录 shell
是一个无效的 shell
,用户无法通过终端登录
于是我们通过以下指令来授予相关权限:
powershell
# 1.设置用户密码
sudo passwd jenkins
# 2.解锁用户
sudo passwd -u jenkins
# 更改登录 shell
sudo usermod -s /bin/bash jenkins
此时为了使得jenkins
用户能够使用sudo
指令,在/etc/sudoers
文件中赋予相关权限:
powershell
jenkins ALL=(ALL) NOPASSWD: ALL
如下图所示:
4.启动jenkins
执行systemctl start jenkins
来启动Jenkins时出错,但是执行java -jar /usr/share/java/jenkins.war
可以正常启动,报错内容如下:
plain
jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded (/usr/lib/systemd/system/jenkins.service; disabled; vendor preset: disabled)
Active: failed (Result: start-limit) since Mon 2024-09-23 15:21:50 CST; 1h 7min ago
Main PID: 11921 (code=exited, status=203/EXEC)
Sep 23 15:21:50 WHY6666 systemd[1]: Failed to start Jenkins Continuous Integration Server.
Sep 23 15:21:50 WHY6666 systemd[1]: Unit jenkins.service entered failed state.
Sep 23 15:21:50 WHY6666 systemd[1]: jenkins.service failed.
Sep 23 15:21:50 WHY6666 systemd[1]: jenkins.service holdoff time over, scheduling restart.
Sep 23 15:21:50 WHY6666 systemd[1]: Stopped Jenkins Continuous Integration Server.
Sep 23 15:21:50 WHY6666 systemd[1]: start request repeated too quickly for jenkins.service
Sep 23 15:21:50 WHY6666 systemd[1]: Failed to start Jenkins Continuous Integration Server.
Sep 23 15:21:50 WHY6666 systemd[1]: Unit jenkins.service entered failed state.
Sep 23 15:21:50 WHY6666 systemd[1]: jenkins.service failed.
这里我们可以看到错误状态是:status=203/EXEC
,这个错误通常表示服务的执行文件无法找到或无法执行
于是我们合理猜测,原因可能有这些:
ExecStart
配置问题:需要打开/usr/lib/systemd/system/jenkins.service
文件,确保ExecStart
指向正确的 Jenkins 可执行文件- 目标目录的执行权限不够(如
WorkingDirectory
以及jenkins.war
等) - 没有安装Java环境
- 定义的
WorkingDirectory
路径错误
于是首先检查ExecStart
配置和WorkingDirectory
路径
打开/usr/lib/systemd/system/jenkins.service
文件,配置如下:
bash
ExecStart=/usr/bin/jenkins
WorkingDirectory=/var/lib/jenkins
说明这两项没有问题
然后赋予相关目录的执行权限:
bash
sudo chown -R jenkins:jenkins /var/lib/jenkins
sudo chown jenkins:jenkins /usr/share/java/jenkins.war
不同版本的jenkins.war路径可能不同,可以通过
sudo find / -name jenkins.war
进行查找
进行以上配置发现问题还未解决,无奈之下在jenkins.service
文件中再次进行JAVA_HOME
的配置:
bash
Environment="JAVA_HOME=/www/server/java/jdk-17.0.8"
问题解决