Skip to content

在 RHEL 系统上安装 Jenkins

Jenkins是一款由Java编写的开源的持续集成工具。

在此之前需要安装 Java, 详情查看 安装 JDK 和环境管理软件

安装 java

由于使用 java 写成, 所以运行 jenkins 需要有java 环境, 所以我们需要在机器上安装 java, 通过

shell
$ 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/

shell
# 一定要复制最新的包链接
$ 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)

shell
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

shell
$ 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 服务是否开启,或者端口是否已经打开.

我们在服务器上使用

shell
$ cat /var/lib/jenkins/secrets/initialAdminPassword
9d5174aacaec4795ae53356d1f18bcf1

来查看下密码, 然后把密码填写到 管理员密码 栏, 然后点击 继续 , 随后服务端进入 配置界面, 耐心等候

安装插件

接下来提示安装插件

安装推荐的插件

安装推荐的插件可以更傻瓜式的进行操作, 不过也可能安装了很多无用的插件, 如果你更熟悉插件的功能可以选择自定义的模式

这一步我们等待服务端自行安装, 然后进入创建管理员界面

安装自定义插件

这里根据需要安装, 我这里仅仅选择安装中文包

创建管理员

如果不想创建, 则使用 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文件中下面代码,并保存文件。

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 说明