# Jenkins 基础
# 背景
Jenkins 是一款业界流行的开源持续集成工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。本文实现的目标就是完成 Jenkins 的基本安装,配置和流水线的搭建,实现代码提交后自动触发 CI 运行和构建
# 安装
# CentOS 系统下安装
可选择 Weekly release/LTS 版本
这里选择 Weekly release 的版本(因为 LTS 版本较老,可能导致安装插件时异常)
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
sudo yum upgrade
sudo yum install jenkins java-1.8.0-openjdk-devel
sudo systemctl daemon-reload
# Ubuntu 系统下安装
可选择 Weekly release/LTS 版本
这里选择 Long Term Support release
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
/etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
再安装 Java
sudo apt update
sudo apt search openjdk
sudo apt install openjdk-11-jdk
java -version
# 运行 jenkins
注册 jenkins 服务
sudo systemctl daemon-reload
启动 jenkins
sudo systemctl start jenkins
查看 jenkins 状态
sudo systemctl status jenkins
正常的状态应该是类似于
Loaded: loaded (/etc/rc.d/init.d/jenkins; generated)
Active: active (running) since Tue 2018-11-13 16:19:01 +03; 4min 57s ago
启动后可以打开 jenkins,根据自己的 jenkins 的服务器 ip + 默认的端口号 8080
eg: http://ip:8080/
在浏览器中打开
# 解锁 jenkins
# 1.解锁 jenkins
密码在 /var/lib/jenkins/secrets/initialAdminPassword
下
# 2.安装插件
这里有两个选择,选择第一个默认安装推荐插件即可
- Install suggested plugins 安装推荐的插件
- Select plugins to install 自选插件安装
# 3.设置 Admin 用户
自己填写即可
username:
password:
full name:
email:
填写完成后,进入 Jenkins 界面
Jenkins 界面上的几个主要功能:
- New item 新建流水线
- Manage Jenkins 管理 Jenkins
- My View 当前所有流水线
# 配置 jenkins
为了让 jenkins 具备更多的功能,先需要一些全局的配置
首先,除了在一开始安装的推荐插件外,还需要安装几个插件:
- NodeJS Plugin (配置全局 Node 运行环境)
- Publish Over SSH (SSH 远程登录访问)
点击 Manage Jenkins => System Configuration => Manage Plugins
安装好插件后,需要重启 Jenkins 服务,之后开始全局的配置
# 配置 Credentials
点击 Manage Jenkins => Security => Manage Credentials => Add Credentials
这里需要注意,Kind 的类型有 6 种
- username with password
- Github App
- SSH Username with private key
- Secret file
- Secret text
- Certificate
这里我会创建两个 Credentials,会分别选择使用 SSH Username with private key
和 Secret text
- SSH Username with private key - 用于拉取 github 仓库
- Secret text - 用于设置 github web hook
第一个 Credentials 设置
kind: 选择 SSH Username with private key
Scope: 默认值既可
ID: 可选
Description: 可选
Username: 一般为root
Treat username as secret: 不选(不清楚干嘛的)
Private Key: 点击Enter directly, 然后在Enter New Secret Below下面的文本框 粘贴给 Github 用的SSH的私钥
Passphrase: 可选,除非在生成SSH key的时候设置了
输入完毕后,点击 OK 保存
SSH 示例:
-----BEGIN OPENSSH PRIVATE KEY-----
m9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACCMaLEe4C6qZy4QfN2Sap4HsQr2I5i0QWvP8ldata4kgAAAAJiD5oslg+aLXXX
XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX
-----END OPENSSH PRIVATE KEY-----
如果不清楚这里的 SSH Key 值是什么,请参考 如何 配置 Github SSH key (opens new window)
第二个 Credentials 设置
kind: 选择 Secret text
Scope: 默认值既可
Secret: 输入github上生成的密钥串
Id: 可选
Description: 可选
输入完毕后,点击 OK 保存
# 配置全局工具环境
Manage Jenkins -> System Configuration -> Global Tool configuration
配置 git
配置 nodejs (如果不需要 node 环境,可忽略)
版本可自己选择
点击保存
# 配置系统环境
Manage Jenkins -> System Configuration -> Configure System
配置 GitHub - Github Servers
用途:支持 github 仓库的 webhook 回调
Name: 自己写
API URL: https://api.github.com
Credentials: 见下文
Credentials 这里需要注意,有两种方式
- 一种是在此处添加
- 在此处选择已经配置好的
因为我们在上文的全局配置 -> 配置 Credentials 处已经配置好了,所以此处可以从下拉框直接选择一个 Credentials 来用
配置好后,可以点击Test connection
进行测试,如果正常可以看到消息(user 为自己的用户名)
P.S 这里可能会好奇为什么明明配置了两个 Credentials,但是下拉选择框只有一个呢,这里只有 kind 为 Secret text 才会展示
另一个 Credentials 在下文配置流水线时会用到
配置 Publish over SSH
用途:通过 SSH 远程连接另一台服务器
Jenkins SSH Key
- Passphrase: 可选
- Path to key: 可选
- Key: 填入你需要连接服务器的私钥
SSH Servers
- Name: 自己随意写
- Hostname: 远程主机的ip地址
- Username: 一般为root
- Remote Directory: 远程主机的目录(该目录必须存在,该插件不会帮助建立此目录)
配置好后,可以点击Test connection
进行测试,如果正常可以看到Success
的消息
最后,点击保存
# 配置流水线
点击 New item
输入流水线的名字,选择 Free style project(这个配置更灵活),点击 ok
# General
- Description: 描述
- GitHub project
- Project url 填入 github repo 地址
# Source Code Management
选择git
,填入仓库的 ssh 地址
Credentials 的选择同上文,因为之前在上文的全局配置 -> 配置 Credentials 处已经配置好了,所以此处可以直接从下拉框中选择一个 Credentials 来用
P.S 这里和上面遇到的问题一样,明明配置了两个 Credentials,但是下拉选择框只有一个呢,这里只有配置了 Credentials kind 为 SSH Username with private key 才会展示(不清楚是不是 bug)
这也是为什么要全局配置两个 Credentials(两个配置地方用两个 Credentials)
# Build Triggers
选择 GitHub hook trigger for GITScm polling,这个可以通过上文全局配置的 GitHub Server 插件,接受来自 github 的通知从而自动
触发流水线运行,这个需要同时配合在 github 的 repo 内配置 webhook
# Build Build Environment
这里可配置
- Abort the build if it's stuck 设置流水线的异常阻塞超时时间
- Add timestamps to the Console Output 在 console 中添加时间戳
- Provide Node & npm bin/ folder to PATH 提供 node.js 的运行环境,避免 npm 命令找不到的问题
# Build
这里就需要根据实际的业务情况设置实际的运行脚本
参数
- Execute NodeJS script
- Execute Windows batch command
- Execute shell (常用)
- Invoke Ant
- Invoke Gradle script
- Invoke top-level Maven targets
- Provide Configuration files
- Run with timeout
- Send files or execute commands over SSH (在安装Publish Over SSH插件后出现,配置见上文)
- Set build status to "pending" on GitHub commit
# Post-build Actions
这里配置构建完成后的一些收尾工作
参数
- Aggregate downstream test results
- Archive the artifacts (保存打包的资源文件)
- Build other projects (触发另一个项目的构建)
- Publish JUnit test result report
- Record fingerprints of files to track usage
- Git Publisher
- E-mail Notification (邮件通知)
- Editable Email Notification
- Send build artifacts over SSH (通过SSH发送资源包)
- Set GitHub commit status (universal)
- Set build status on GitHub commit [deprecated] (废弃)
- Delete workspace when build is done
# 其他功能设置
# Github repo 设置 webhook
进入 github 自己的项目,选择 settings -> Webhooks -> Add webhook
Payload URL: Jenkins 服务提供的 webhook,规则
http://<jenkins ip>:8080/github-webhook/
Content type: application/x-www-form-urlencoded
Secret: 可选
Which events would you like to trigger this webhook?: Just the push event.
Active
然后,点击 Add webhook 即可
# Github webhook 工作原理
本地代码提交 push 到 master 后,github 会向上面配置的 Payload URL
地址发送一条请求,记录如下图所示
如果状态码显示为 200,就说明配置正确,如果有问题,可以点击Redeliver
按钮进行重发。Jenkins 服务在收到该请求后会自动的触发一次构建操作,可在 build history 看到
# 测试
预期:本地代码更改,push 到 master 后,流水线被自动触发运行且结果符合预期
如果发现有任何问题,可以根据下面的流程一步步分析定位问题
完整流程如下
- 本地代码更改
- 代码 commit,push 到 master
- github 发送 web-hook 请求到 jenkins 服务
- jenkins 收到 web-hook 请求自动运行一次构建
- 看流水线运行是否符合预期
# Q&A
1.在 jenkins 第一次启动后一直出现 Please wait while Jenkins is getting ready to work ...
解决方案
方案 A
耐心等着,出现这个的原因是 jenkins 会拉取配置文件(大概 10MB 以上),网速不好时就会 Pending
方案 B
更改配置文件的地址,在这个
/var/lib/jenkins/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://updates.jenkins.io/update-center.json</url>
</site>
</sites>
将其中的https://updates.jenkins.io/update-center.json
,改为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
(国内源)后保存,重启 jenkins 后再试试
2.缺少 git 命令
安装完 jenkin 后发现没有 git 命令,实际上是因为 CentOS 系统内部没有安装 git,所以
sudo yum install git
← Docker FAQ LowCode 基础 →