前言

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

Jenkins学习使用实践

更新历史

2019年11月28日 - 更新Jenkins升级
2019年02月12日 - 初稿

阅读原文 - https://wsgzao.github.io/post/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
21
# 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升级

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 备份jenkins.war
cd /usr/lib/jenkins
cp jenkins.war jenkins.war.bak

# 停止jenkins服务
service jenkins stop
rm jenkins.war

# 下载最新稳定版jenkins.war,国内镜像地址可以选择清华tuna
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war-stable/latest/jenkins.war
service jenkins start

# 关于插件升级,注意版本是否兼容以及是否要求重启

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备份远端

|Name |Link |
|— |— |
|Google Login Plugin |https://plugins.jenkins.io/google-login |
|Role-based Authorization Strategy |https://plugins.jenkins.io/role-strategy |
|Periodic Backup |https://plugins.jenkins.io/periodicbackup |
|Notification |https://plugins.jenkins.io/notification |
|Git Parameter |https://plugins.jenkins.io/git-parameter |
|AnsiColor |https://plugins.jenkins.io/ansicolor |
|SSH Agent |https://plugins.jenkins.io/git-parameter |
|Build Name and Description Setter |https://plugins.jenkins.io/build-name-setter |
|Publish Over SSH |https://plugins.jenkins.io/publish-over-ssh |
|user build vars |https://plugins.jenkins.io/build-user-vars-plugin |
|Throttle Concurrent Builds |https://plugins.jenkins.io/throttle-concurrents |
|Active Choices |https://plugins.jenkins.io/uno-choice |
|Rebuilder |https://plugins.jenkins.io/rebuild |

Jenkins Plugins常用插件推荐

创建第一个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
8
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;
  • true元素中的true改为false;
  • 元素的内容删掉;
  • 命令行启动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:///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
50
51
52
53
54
# 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迁移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建迁移脚本
vim jenkins_jobs_migration.sh

#/bin/bash
while read -r line
do
echo $line
curl -s --user <name>:<token> https://<source-jenkins-url>/job/$line/config.xml | curl -XPOST --user <name>:<token> https://<target-jenkins-url>/createItem?name=$line --header "Content-Type: application/xml" -d @-
done < jobs.txt

# 创建需要迁移的jobs
vim jobs.txt
gop_k8s

# 执行迁移脚本
chmod +x jenkins_jobs_migration.sh
./jenkins_jobs_migration.sh
gop_k8s

# 检查迁移后的jobs兼容性

参考内容

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

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

Jenkins

Jenkins2系列

《Jenkins 2.x 实践指南》读书笔记

Jenkins中文文档

Jenkins入门系列笔记汇总整理

中控平台jenkins

Jenkins 日常运维笔记 - 主目录/主备模式/迁移/job覆盖/maven构建/日志处理

文章目录
  1. 1. 前言
  2. 2. 更新历史
  3. 3. Jenkins简介
  4. 4. Jenkins安装
  5. 5. Jenkins升级
  6. 6. Jenkins入门
    1. 6.1. 主要的Job类型
    2. 6.2. Freestyle 项目
    3. 6.3. 规范项目必要配置
    4. 6.4. 常用插件
    5. 6.5. 创建第一个Job
  7. 7. Jenkins Pipeline介绍
    1. 7.1. Jenkins Pipeline入门
    2. 7.2. 快速创建一个简单的 Pipeline
  8. 8. Jenkins忘记密码怎么办
  9. 9. Ansible Jenkins API Token 使用技巧
  10. 10. Jenkins迁移
  11. 11. 参考内容