在 RHEL 系统上安装 Jenkins
Jenkins是一款由Java编写的开源的持续集成工具。
在此之前需要安装 Java, 详情查看 安装 JDK 和环境管理软件
安装 java
由于使用 java 写成, 所以运行 jenkins 需要有java 环境, 所以我们需要在机器上安装 java, 通过
$ java -version
可以查看 java 的版本, 例如
openjdk version "17.0.9" 2023-10-17 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.9.0.9-1) (build 17.0.9+9-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.9.0.9-1) (build 17.0.9+9-LTS, mixed mode, sharing)
如果 没有检测正确的输出, 需要安装 java, 可以参考 安装 JDK 和环境管理软件
安装 Jenkins
详细 jenkins 的版本对比可以查看官方说明 : Redhat Jenkins Packages, 根据自己的需要来选择稳定版本或者周更版本
手动安装 Jenkins(推荐)
在安装之前首先到这个地址复制最新的包链接来进行安装, 因为在国内访问 jenkins 的源会有网络不稳定的情况出现
🔗 https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/
# 一定要复制最新的包链接
$ wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.450-1.1.noarch.rpm
# rhel 8+
$ dnf install jenkins-2.450-1.1.noarch.rpm
# centos 7
$ yum install jenkins-2.450-1.1.noarch.rpm
使用官方源安装
可能会出现网络波动无法访问的情况
# 获取 repo
$ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
# 获取key, 如果你之前导入 jenkins 的key, 这一步可以忽略
$ sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
$ yum update && yum install jenkins
如果遇到官方源不能访问, 可以更换为其他频道的镜像(这个方法可能不需要了)
# 更新为 清华大学的源
# 这里
$ sed -i 's/http:\/\/pkg.jenkins.io/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /etc/yum.repos.d/jenkins.repo
# 更新为 官方源
$ sed -i 's/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/http:\/\/pkg.jenkins.io/g' /etc/yum.repos.d/jenkins.repo
这里我们先保障以下目录是有权限的, 默认的用户是 jenkins, 如果运行时候没有日志生成, 首先检查下日志是否有权限生成
Jenkins 目录说明
# Jenkins 安装目录 Jenkins Home 目录
/var/lib/jenkins/
# Jenkins 日志文件位置
/var/log/jenkins/
# Jenkins 缓存位置
/var/cache/jenkins
Jenkins Home 目录说明
JENKINS_HOME
+- builds (build records)
+- [BUILD_ID] (subdirectory for each build)
+- build.xml (build result summary)
+- changelog.xml (change log)
+- config.xml (Jenkins root configuration file)
+- *.xml (other site-wide configuration files)
+- fingerprints (stores fingerprint records, if any)
+- identity.key.enc (RSA key pair that identifies an instance)
+- jobs (root directory for all Jenkins jobs)
+- [JOBNAME] (sub directory for each job)
+- config.xml (job configuration file)
+- [FOLDERNAME] (sub directory for each folder)
+- config.xml (folder configuration file)
+- jobs (subdirectory for all nested jobs)
+- plugins (root directory for all Jenkins plugins)
+- [PLUGIN] (sub directory for each plugin)
+- [PLUGIN].jpi (.jpi or .hpi file for the plugin)
+- secret.key (deprecated key used for some plugins' secure operations)
+- secret.key.not-so-secret (used for validating _$JENKINS_HOME_ creation date)
+- secrets (root directory for the secret+key for credential decryption)
+- hudson.util.Secret (used for encrypting some Jenkins data)
+- master.key (used for encrypting the hudson.util.Secret key)
+- InstanceIdentity.KEY (used to identity this instance)
+- userContent (files served under your https://server/userContent/)
+- workspace (working directory for the version control system)
更换 jenkins 的运行目录端口和用户
After Jenkins 2.335 和 Jenkins 2.332.1
在 Jenkins 2.335 和 Jenkins 2.332.1 之后开始推荐使用 Managing systemd services (jenkins.io) 这个方法来管理环境变量和运行用户, Linux installation packages migrated from System V init to systemd (jenkins.io - 2022/03/25)
systemctl edit jenkins
这会更改 override.conf
文件, override.conf
文件保存在 /etc/systemd/system/jenkins.service.d/override.conf
中,可以用来自定义服务。注意,这样的自定义必须在文件的 [Service]
部分中完成才能生效。 override.conf
文件的示例内容可能包括:
[Unit]
Description=My Company Jenkins Controller
[Service]
# Add JVM configuration options
Environment="JAVA_OPTS=-Djava.awt.headless=true -XX:+UseStringDeduplication"
# Arbitrary additional arguments to pass to Jenkins.
# Full option list: java -jar jenkins.war --help
Environment="JENKINS_OPTS=--prefix=/jenkins --javaHome=/opt/jdk-17"
# Configuration as code directory
Environment="CASC_JENKINS_CONFIG=/var/lib/jenkins/configuration-as-code/"
如果需要可以更改配置文件的几个参数
**Before Jenkins 2.335 和 Jenkins 2.332.1运行配置 以及 Docker (Docker 保持 System V ** init(8)
的配置)
# Jenkins配置文件地址, 这就是Jenkins的配置文件,可以在这里查看Jenkins默认的配置
/etc/sysconfig/jenkins
这里有三个比较重要的配置
# 安装目录
## Description: Jenkins Continuous Integration Server
## Type: string
## Default: "/var/lib/jenkins"
## ServiceRestart: jenkins
#
# Directory where Jenkins store its configuration and working
# files (checkouts, build reports, artifacts, ...).
#
JENKINS_HOME="/var/lib/jenkins"
# 运行用户
## Default: "jenkins"
## ServiceRestart: jenkins
#
# Unix user account that runs the Jenkins daemon
# Be careful when you change this, as you need to update
# permissions of $JENKINS_HOME and /var/log/jenkins.
#
JENKINS_USER="jenkins"
# 端口号
## Default: 8080
## ServiceRestart: jenkins
#
# Port Jenkins is listening on.
# Set to -1 to disable
#
JENKINS_PORT="8080"
启动 jenkins
$ systemctl start jenkins
到这一步我们已经安装并启动了jenkins, 下面看下 jenkins 的启动参数 ps -ef |grep jenkins
/etc/alternatives/java
-Dcom.sun.akuma.Daemon=daemonized
-Djava.awt.headless=true
-DJENKINS_HOME=/var/lib/jenkins
-jar /usr/lib/jenkins/jenkins.war
--logfile=/var/log/jenkins/jenkins.log
--webroot=/var/cache/jenkins/war
--daemon
--httpPort=8080
--debug=5
--handlerCountMax=100
--handlerCountMaxIdle=20
这里监听的默认端口是 8080
, 如果没有开启服务端端口防火墙的, 去进行开启, 如果开启, 可以通过 ip:8080
开进行访问.这里我们通过地址来进行访问
配置 Nginx 反向代理
如果是线上服务器, 我们可能不方便直接开启 8080 端口这里就需要nginx 反向代理, 详细的配置参考 Reverse proxy - Nginx (jenkins.io)
server{
listen 80;
server_name domain-of-jenkins.io;
location / {
proxy_pass http://127.0.0.1:8080/;
}ssh
access_log off;
error_log off;
}
这里我们便可以使用域名通过 80 端口访问 nginx
初始化 Jenkins
更改下载插件的源
因为默认的插件地址是 jenkins 官方, 检测的地址是 google.com, 有很大程度上在第一步就卡死了.所以在首次启动之后我们需要更改各种相关的配置, 以免我们在后续的安装过程中被卡死在这个页面
这里我们替换下插件的地址和检测地址, 这里替换为 清华镜像, 也有可选的腾讯镜像(默认)
替换 default.json
default.json
的位置是 /var/lib/jenkins/updates/default.json
$ cd /var/lib/jenkins/updates/
$ sed -i 's/http:\/\/updates.jenkins-ci.org\/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的工作目录 /var/lib/jenkins/
,打开 hudson.model.UpdateCenter.xml
把
http://updates.jenkins-ci.org/update-center.json
改成
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
这里替换成功后需要 重启 jenkins , 否则不生效
配置密码并进入 jenkins
这里我们打开地址 ip:8080
这个地址, 会出现这个页面, 如果没有访问或者出错, 请检查下 jenkins 服务是否开启,或者端口是否已经打开.
我们在服务器上使用
$ cat /var/lib/jenkins/secrets/initialAdminPassword
9d5174aacaec4795ae53356d1f18bcf1
来查看下密码, 然后把密码填写到 管理员密码
栏, 然后点击 继续 , 随后服务端进入 配置界面, 耐心等候
安装插件
接下来提示安装插件
安装推荐的插件
安装推荐的插件可以更傻瓜式的进行操作, 不过也可能安装了很多无用的插件, 如果你更熟悉插件的功能可以选择自定义的模式
这一步我们等待服务端自行安装, 然后进入创建管理员界面
安装自定义插件
这里根据需要安装, 我这里仅仅选择安装中文包
- SSH Build Agents plugin : 连接其他服务器
- Matrix Project Plugin : 并行执行任务
- Localization: Chinese (Simplified) : 简体中文语言包
- JavaMail API : 邮件发送通知
- Generic Webhook Trigger Plugin : Webhook 触发器
- DingTalk : 钉钉通知
创建管理员
如果不想创建, 则使用 admin 账号继续, 否则自己创建一个, 然后点击 保存并完成
建议创建一个, 默认的管理员容易被猜到, 不安全
配置实例地址
如果没有什么需要确认的. 这个默认的地址就是你以后的访问地址了. 保存就可以, 如果有配置需要域名啥的. 根据自己需要来进行配置
然后就真的完成了. 这个真是最后一步了
FAQ
Jenkins 常见问题
安装提示 [Errno 12] Timeout on https://pkg.jenkins.io/redhat-stable/repodata/repomd.xml
错误信息 [Errno 12] Timeout on https://pkg.jenkins.io/redhat-stable/repodata/repomd.xml
这个原因是因为国内的某些服务器对国外的部分 jenkins.io 的节点访问异常导致解决方案 : 打开测速工具寻找国内可以访问的 jenkins ip : https://tool.chinaz.com/speedtest/pkg.jenkins.io
修改 host, 对可以访问的ip 进行host 映射
# vim /etc/hosts
151.101.110.133 pkg.jenkins.io
重置Jenkins 密码
admin密码未更改
1、进入 Jenkins\secrets
目录,打开 initialAdminPassword
文件,复制密码;
$ find / -name initialAdminPassword
$ cat /var/lib/jenkins/secrets/initialAdminPassword
796008f906d2453ca0d22e2f8fa46d33
2.、访问Jenkins页面,输入管理员admin,及刚才的密码;
3、进入后可更改其他管理员密码;
admin密码更改忘记
1、删除Jenkins目录下config.xml文件中下面代码,并保存文件。
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
<denyAnonymousReadAccess>true</denyAnonymousReadAccess>
</authorizationStrategy>
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
<disableSignup>true</disableSignup>
<enableCaptcha>false</enableCaptcha>
</securityRealm>
2、重启Jenkins服务;
3、进入首页>“系统管理”>“Configure Global Security”;
4、勾选“启用安全”;
5、点选“Jenkins专有用户数据库”,并点击“保存”;
6、重新点击首页>“系统管理”,发现此时出现“管理用户”;
7、点击进入展示“用户列表”;
8、点击右侧进入修改密码页面,修改后即可重新登录。
在 Jetbrains 系IDE中使用 Jenkins 插件
Jenkins Docs的官方建议是使用特定于用户的API令牌,而不是 CSRF 令牌.
CSRF enabled -> Missing or bad crumb data (0.97 / IntelliJ 2016.1.3) · Issue #123 · MCMicS/jenkins-control-plugin (github.com)
获取令牌
获取API令牌:
- 登录到您的Jenkins实例。
- 点击右上角的用户名。
- 单击左侧的Configure(配置)。(一旦进入登录的用户页面)
- 在配置页面的API令牌部分(
APIToken
),单击添加新令牌。 - 输入令牌的名称,然后单击生成, 将令牌复制到剪贴板并有选择地保存它。(请小心,因为此令牌可用作密码。)
Jetbrain 系IDE/插件设置和配置
- 打开插件设置。
- 输入 Jenkins URL, 填写服务器地址
- 使用Jenkins 的用户名,你可以在Jenkins配置的用户详细信息页面上找到该用户详细信息,以获取API令牌
- 填写 API密钥 填写密码
- 根据喜好,单击 Apply(应用) 或 Test Connection(测试连接)
- 单击 OK
注意:这假设您使用 Jenkins
自己的数据库”作为安全存储,并且没有任何用于SAML等的SSO插件。如果正在使用其他身份验证后端插件,则可能需要额外的配置
Jenkins 执行命令时候 : command is not found
添加环境变量到可执行 PATH, 在 多服务器状态下, 找到 Nodes -> {Server} -> Configure
, 在 Node Properties 中启用 Environment variables, 加入 PATH 变量, 这样 jenkins 便可以识别到自定义的信息, 路径信息可以通过以下命令获取
$ echo $PATH
Jenkins 构建 node 项目的时候使用 nvm 导致的无法找到 node/pnpm
🔗 https://stackoverflow.com/questions/42627037/nvm-is-not-working-on-jenkins-execute-shell
添加
. ~/.nvm/nvm.sh
在执行脚本的第一行, 用来初始化nvm 环境, 因为 nvm 脚本并非一个 shell 命令, 所以无法将这个命令的路径放到 path 中, 只能加到第一行
更新记录
2024年01月13日
- 更新 jenkins plugin 使用方法和配图
- 增加 nvm 部署在Jenkis 中的 FAQ
2024年01月10日
- 增加 systemd 的配置说明
- 不推荐使用官方源进行安装(网络原因)
- 增加 FAQ 说明