# Jenkins 基础

# 背景

Jenkins 是一款业界流行的开源持续集成工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。本文实现的目标就是完成 Jenkins 的基本安装,配置和流水线的搭建,实现代码提交后自动触发 CI 运行和构建

# 安装

# CentOS 系统下安装

参考:官网的安装文档 (opens new window)

可选择 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 系统下安装

参考:官网的安装文档 (opens new window)

可选择 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

参考:官网的配置 (opens new window)

# 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-003

# 配置 jenkins

为了让 jenkins 具备更多的功能,先需要一些全局的配置

jenkins-004

首先,除了在一开始安装的推荐插件外,还需要安装几个插件:

  • NodeJS Plugin (配置全局 Node 运行环境)
  • Publish Over SSH (SSH 远程登录访问)

点击 Manage Jenkins => System Configuration => Manage Plugins

jenkins-027

安装好插件后,需要重启 Jenkins 服务,之后开始全局的配置

# 配置 Credentials

点击 Manage Jenkins => Security => Manage Credentials => Add Credentials

jenkins-005

这里需要注意,Kind 的类型有 6 种

jenkins-006

  • username with password
  • Github App
  • SSH Username with private key
  • Secret file
  • Secret text
  • Certificate

这里我会创建两个 Credentials,会分别选择使用 SSH Username with private keySecret text

  • SSH Username with private key - 用于拉取 github 仓库
  • Secret text - 用于设置 github web hook

第一个 Credentials 设置

jenkins-007

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 设置

jenkins-008

kind: 选择 Secret text
Scope: 默认值既可
Secret: 输入github上生成的密钥串
Id: 可选
Description: 可选

输入完毕后,点击 OK 保存

# 配置全局工具环境

Manage Jenkins -> System Configuration -> Global Tool configuration

配置 git

jenkins-009

配置 nodejs (如果不需要 node 环境,可忽略)

版本可自己选择 jenkins-010

点击保存

# 配置系统环境

Manage Jenkins -> System Configuration -> Configure System

配置 GitHub - Github Servers

用途:支持 github 仓库的 webhook 回调

jenkins-011

Name: 自己写
API URL: https://api.github.com
Credentials: 见下文

Credentials 这里需要注意,有两种方式

  • 一种是在此处添加
  • 在此处选择已经配置好的

jenkins-012

因为我们在上文的全局配置 -> 配置 Credentials 处已经配置好了,所以此处可以从下拉框直接选择一个 Credentials 来用

配置好后,可以点击Test connection进行测试,如果正常可以看到消息(user 为自己的用户名)

jenkins-013

P.S 这里可能会好奇为什么明明配置了两个 Credentials,但是下拉选择框只有一个呢,这里只有 kind 为 Secret text 才会展示

另一个 Credentials 在下文配置流水线时会用到

配置 Publish over SSH

用途:通过 SSH 远程连接另一台服务器

jenkins-028

Jenkins SSH Key
  - Passphrase: 可选
  - Path to key: 可选
  - Key: 填入你需要连接服务器的私钥
SSH Servers
  - Name: 自己随意写
  - Hostname: 远程主机的ip地址
  - Username: 一般为root
  - Remote Directory: 远程主机的目录(该目录必须存在,该插件不会帮助建立此目录)

配置好后,可以点击Test connection进行测试,如果正常可以看到Success的消息

最后,点击保存

# 配置流水线

点击 New item

jenkins-014

输入流水线的名字,选择 Free style project(这个配置更灵活),点击 ok

jenkins-015

# General

- Description: 描述
- GitHub project
  - Project url 填入 github repo 地址

jenkins-016

# Source Code Management

选择git,填入仓库的 ssh 地址

jenkins-017

Credentials 的选择同上文,因为之前在上文的全局配置 -> 配置 Credentials 处已经配置好了,所以此处可以直接从下拉框中选择一个 Credentials 来用

jenkins-018

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

jenkins-019

# 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 命令找不到的问题

jenkins-020

# 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

jenkins-021

# 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

jenkins-022

# 其他功能设置

# Github repo 设置 webhook

进入 github 自己的项目,选择 settings -> Webhooks -> Add webhook

jenkins-023

  • 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

jenkins-024

然后,点击 Add webhook 即可

# Github webhook 工作原理

本地代码提交 push 到 master 后,github 会向上面配置的 Payload URL地址发送一条请求,记录如下图所示

jenkins-025

如果状态码显示为 200,就说明配置正确,如果有问题,可以点击Redeliver按钮进行重发。Jenkins 服务在收到该请求后会自动的触发一次构建操作,可在 build history 看到

jenkins-026

# 测试

预期:本地代码更改,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
陕ICP备20004732号-3