Jenkins 学习使用实践

前言

Jenkins 就不用做多余的介绍了,作为 CI/CD 首选的开源解决方案,持续集成 (Continous Intergration)/ 持续交付 (Continous Delievery),本文只是用于记录使用 Jenkins 的一些基本操作,Jenkins 官方文档也率先支持中文,相信对大家的学习热情会有积极地促进作用。

Jenkins 学习使用实践


扩展阅读

Jenkins - https://jenkins.io/zh/


Jenkins 简介

构建伟大,无所不能

Jenkins 是开源 CI&CD 软件领导者, 提供超过 1000 个插件来支持构建、部署、自动化,满足任何项目的需要。

Jenkins 用户手册 - https://jenkins.io/zh/doc/

Jenkins 训练营之基础篇 - https://ke.qq.com/course/265167
Jenkins 训练营之带你玩转 Pipeline - https://ke.qq.com/course/252785

https://ke.qq.com/webcourse/index.html#cid=265167&term_id=100312699&taid=1794918372871119&vid=p1423f5tn3g

https://ke.qq.com/webcourse/index.html?cw_id=91852&ac_type=3#cid=252785&term_id=100298102&taid=1707945285114737&type=1024&vid=w1422iqh9q1

Jenkins 安装

Jenkins 项目产生两个发行线,长期支持版本 (LTS) 和每周更新版本。 根据你的组织需求,一个可能比另一个更受欢迎。
两个版本都以 .war 文件,原生包,安装程序,和 Docker 容器的形式分发。
https://jenkins.io/zh/download/

这里推荐下载使用 LTS 长期支持版本,以 CentOS 7 作为演示环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Java 8
yum install java

# Jenkins stable version
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.key
yum install jenkins

# start jenkins
service jenkins start

# 初始化配置向导
http://192.168.56.103:8080/

cat /var/lib/jenkins/secrets/initialAdminPassword
5224fc83b6d84cc2be69a18c53309ea4

Install suggested plugins

是否创建管理员账户或者跳过

Jenkins 入门

主要的 Job 类型

Freestyle project
自由风格项目,Jenkins 最主要的项目类型

Maven Project
Maven 项目专用,类似 Freestyle,更简单

Multi-configuration project
多配置项目,适合需要大量不同配置 (环境,平台等) 构建

Pipeline
流水线项目,适合使用 pipeline(workflow)插件功能构建流水线任务,或者使用 Freestyle project 不容易实现的复杂任务

Multibranch Pipeline
多分支流水线项目,根据 SCM 仓库中的分支创建多个 Pipeline 项目

Freestyle 项目

General
项目基本配置
项目名字,描述,参数,禁用项目,并发构建,限制构建默认 node 等等

Source code Management
代码库信息,支持 Git,Subversion 等

Build Triggers
构建触发方式
周期性构建,Poll SCM,远程脚本触发构建,其他项目构建结束后触发等

Build Environment
构建环境相关设置
构建前删除 workspace,向 Console 输出添加时间戳,设置构建名称,插入环境变量等

Build
项目构建任务
添加 1 个或者多个构建步骤

Post-build Actions
构建后行为
Artifact 归档,邮件通知,发布单元测试报告,触发下游项目等等

规范项目必要配置

本规范尤其适用于较多项目共用同一 Jenkins 的场景

  • 项目命名规范
  • 设置项目描述
  • 设置历史构建清理规则
  • 设置构建节点 Label
  • 邮件通知

常用插件

注意 Jenkins 备份策略,建议结合 rsync 备份远端

Jenkins 显示时间戳: Timestamper
Jenkins 配置构建历史: Job Configuration History Plugin
Jenkins 定时的备份: ThinBackup
邮件发送插件: Email Extension Plugin
空间清理扩展插件: Distributed Workspace Clean plugin

Jenkins 常用插件 – https://vwin.github.io/2019/01/07/Jenkins%E9%AB%98%E6%95%88%E6%8F%92%E4%BB%B6%E6%95%B4%E7%90%86/

创建第一个 Job

安装 Timestamper 插件
系统管理 - 插件管理 - 可用插件,搜索到 timestamper 点击 Install without restart

新建一个 Freestyle 类型的 Job

  • General 项目名称: My-first-freestyle-demo
  • Build Environment 构建环境: 勾选 Add timestamps to the Console Output
  • Build 构建: 屏幕打印出 “这是我的第一个 Jenkins Job, oops”
  • Post-build Actions 构建后操作: 无
  • 点击立刻构建
  • 找到控制台输出
1
2
3
4
5
6
7
Console Output
14:40:59 Started by user admin
14:40:59 Building in workspace /var/lib/jenkins/workspace/My-first-freestyle-demo
14:41:00 [My-first-freestyle-demo] $ /bin/sh -xe /tmp/jenkins3737737887278720679.sh
14:41:00 + echo '这是我的第一个 Jenkins Job, oops'
14:41:00 这是我的第一个 Jenkins Job, oops
14:41:00 Finished: SUCCESS

Jenkins Pipeline 介绍

Pipeline,简而言之,就是一套运行于 Jenkins 上的工作流框架,将原本独立 运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。

Pipeline 是 Jenkins2.X 最核心的特性,帮助 Jenkins 实现从 CI 到 CD 与 DevOps 的转变

什么是 Jenkins Pipeline?

Jenkins Pipeline 是一组插件,让 Jenkins 可以实现持续交付管道的落地和实施。持续交付管道 (CD Pipeline) 是将软件从版本控制阶段到交付给用户或客户的完 整过程的自动化表现。软件的每一次更改 (提交到源代码管理系统) 都要经过一个复杂的过程才能被发布。

Pipeline 提供了一组可扩展的工具,通过 Pipeline Domain Specific Language(DSL) syntax 可以达到 Pipeline as Code 的目的

Pipeline as Code:Jenkinsfile 存储在项目的源代码库

Jenkins Pipeline 核心概念

Stage
– 阶段,一个 Pipeline 可以划分为若干个 Stage,每个 Stage 代表一组操作,例如: “Build”, “Test”, “Deploy” 。
– 注意,Stage 是一个逻辑分组的概念,可以跨多个 Node。

Node
– 节点,一个 Node 就是一个 Jenkins 节点,或者是 Master,或者是 Agent,是执行 Step 的具体 运行环境。

Step
– 步骤,Step 是最基本的操作单元,小到创建一个目录,大到构建一个 Docker 镜像,由各类 Jenkins Plugin 提供,例如: sh ‘make’

为什么要用 Pipeline?

  • 代码: Pipeline 以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其 CD 流程。
  • 可持续性: Jenkins 重启或者中断后都不会影响 Pipeline Job。
  • 停顿: Pipeline 可以选择停止并等待人工输入或批准,然后再继续 Pipeline 运行。
  • 多功能: Pipeline 支持现实世界的复杂 CD 要求,包括 fork/join 子进程,循环和 并行执行工作的能力。
  • 可扩展: Pipeline 插件支持其 DSL 的自定义扩展以及与其他插件集成的多个选项。

Pipeline 和 Freestyle 的区别

Freestyle:
– 上游 / 下游 Job 调度,如 BuildJob ->TestJob -> DeployJob
– 在 DSL Job 里面调度多个子 Job(利用 Build Flow plugin)

Pipeline:
– 单个 Job 中完成所有的任务编排
– 全局视图

Pipeline 会取代 Freestyle 么?

  • Pipeline 一定会取代 Build Flow 插件
  • 会,当你希望做到 Pipeline as code 的时候
  • 会,当你独立运行一组 Job 没有特殊价值或者意义的时候
  • 会,当你可以从 Multibranch Pipeline 受益的时候
  • 会,当你希望获取类似于 TravisCI 风格的工作流的时候

Jenkins Pipeline 入门

Pipeline 脚本是由 Groovy 语言实现
– 无需专门学习 Groovy

Pipeline 支持两种语法
– Declarative 声明式(在 Pipeline plugin 2.5 中引入)
– Scripted Pipeline 脚本式

如何创建基本的 Pipeline
– 直接在 Jenkins Web UI 网页界面中输入脚本
– 通过创建一个 Jenkinsfile 可以检入项目的源代码管理库

最佳实践
– 通常推荐在 Jenkins 中直接从源代码控制 (SCM) 中载入 Jenkinsfile Pipeline

快速创建一个简单的 Pipeline

  1. 新建 Job: Jenkins -> 新建 -> 输入 Job 名称: “My-first-pipeline-demo” -> 选择 Pipeline -> 点击 “OK”
  2. 配置: 在 Pipeline -> Script 文本输入框中输入下列语句,点击 ”保存”
  3. 立即构建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Build'
}
}
stage('Test') {
steps {
echo 'Test'
}
}
stage('Deploy') {
steps {
echo 'Deploy'
}
}
}
}

Jenkins 忘记密码怎么办

如果权限设置错误,或者忘记密码,导致 admin 自己都无法登陆 Jenkins 怎么办?

  • 命令行停止 Jenkins;
  • 先备份 $JENKINS_HOME 中的 config.xml;
  • 用编辑器打开 $JENKINS_HOME 中的 config.xml;
  • 将 < useSecurity>true 元素中的 true 改为 false;
  • 将 < authorizationStrategy > 和 < securityRealm > 元素的内容删掉;
  • 命令行启动 Jenkins。

Ansible Jenkins API Token 使用技巧

Jenkins REST API 提供了 API token,使得可以在程序中使用 API token 进行认证(而不是使用你真实的密码)。

API token 可以在用户个人设置界面查看
到用户→用户 id→设置页面,在 API Token 区域点击 Show API token 按钮,便可查看 API token,同时还可以更改 API token
相应的 URL 是
http://<JENKINS_URL>/user//configure

Manage Jenkins jobs by using Jenkins REST API

jenkins_job_facts – Get facts about Jenkins jobs
https://docs.ansible.com/ansible/latest/modules/jenkins_job_facts_module.html

jenkins_job – Manage jenkins jobs
https://docs.ansible.com/ansible/latest/modules/jenkins_job_module.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# python-jenkins package
pip install python-jenkins lxml

# jenkins_job_facts.yml
---
- hosts: all
gather_facts: no

tasks:
- name: Get host info
local_action:
module: jenkins_job_facts
url: https://xxx
user: xxx
token: xxx
glob: '*mh_kg*'
register: my_jenkins_job_facts

- debug:
msg: "{{my_jenkins_job_facts}}"

# shell awk
cat reg | grep '"name"' | awk -F '"' '{print $4}'

# jenkins_job_delete.yml
---
- hosts: all
gather_facts: no

tasks:
- name: Delete jobs
local_action:
module: jenkins_job
url: xxx
user: xxx
token: xxx
name: "{{ item }}"
state: absent
loop:
- gop_live___mh_kg_garena_auth_nginx_static_files
- gop_live___mh_kg_nginx_reload
- gop_live___mh_kg_nginx_update_config
- gop_live___mh_kg_restart_service
- gop_live___mh_kg_setup_server
- gop_live___mh_kg_stop_service
- gop_live_mh_kg_app_point
- gop_live_mh_kg_game_service
- gop_live_mh_kg_payment_center_backend
- gop_live_mh_kg_sso_website

参考内容

官方手册永远是你的最佳参考内容

Jenkins 用户手册 - https://jenkins.io/zh/doc/