Jenkins的简单了解

91 阅读3分钟

Jenkins的简单了解

简述

  • Jenkins是一个开源的持续集成(CI)和持续交付(CD)工具,主要用于自动化构建、测试和部署软件项目
  • Jenkins基于Java开发,提供了一个开放易用的平台,支持各种编程语言和构建工具,如Java、C#、PHP等
  • 并且可以与版本控制系统如SVN和Git无缝集成,它也提供了与代码托管平台如GitHub和Bitbucket的直接集成能力
  • Jenkins旨在通过自动化重复性任务来提高软件开发和生产效率,它监控和自动化持续重复的工作,如代码编译、测试和部署,以促进持续集成和持续交付的过程

小团队自动化运维实施的顺序

  1. 做基础监控
  2. 搭建GitLab
  3. 搭建Jenkins,并集成GitLab
  4. 使用Jenkins实现自动编译打包
  5. 将制品交给制品库管理
  6. 使用Jenkins执行Ansible

如何开始自动化部署

  • 选择从可以独立部署的、影响范围小的服务开始
  • 要想办法使用标准化的新机器,而不是旧机器
  • 自动化所有的部署操作,包括机器级别的设置
  • 重复以上三个步骤

Jenkins的管理

环境变量

内置变量

简述

  • 通过一个名为env的全局变量,将Jenkins内置环境变量暴露出来

示例

pipeline { 
	agent any  stages {    
		steps {      
			echo "test ${env.BUILD_NUMBER}"    
		}  
	}
}

常用的变量

  • BUILD_NUMBER
    • 构建号,累加的数字
    • 在打包时,可以作为制品名称的一部分
  • BRANCH_NAME
    • 多分支pipeline项目支持
    • 当需要根据不同的分支做不同的事情时就会用到
  • BUILD_URL
    • 当前构建的页面URL
    • 如果构建失败,则需要将失败的构建链接放在邮件通知中,这个连接就可以是BUILD_URL
  • GIT_BRANCH
    • 通过git拉取的源码构建的项目才会有此变量

自定义变量

简述

  • environment指令可以在pipeline中定义,代表变量作用域为整个pipeline
  • 也可以在stage中定义,代表变量只在该阶段有效

示例

pipeline { 
	agent any 
	#作用域在pipeline中 
	environment {  
		VALA = "clang" 
	} 
	stages {  
		testMethod() {   
			#作用域在stages中   
			environment {    
				DEBUG_FLAGS = "-g"   
			}  
		}  
		steps {   
			sh "${VALA} ${DEBUG_FLAGS}"   
			sh 'printenv'  
		} 
	}
}

定义全局的变量

是指跨pipeline的自定义变量

自定义全局环境变量会被加入env属性列表,使用自定义全局环境变量与内置变量的方法无异

添加流程

  1. 进入Manage Jenkins
  2. Configure System
  3. Global properties页
  4. 勾选"Environment variables"复选框
  5. 单击"Add"按钮
  6. 在输入框中输入变量名和变量值即可

安全交互

凭证管理

简述

  • 通过凭证管理,我们可以在此存储需要密文保护的数据库密码,GitLab 密码信息,Docker 私有仓库的登录密码。保存了这些信息后,Jenkins 就可以和这些第三方的应用进行交互

创建凭证的流程

  1. 选择Jenkins首页
  2. 点击Credentials
  3. 选择System
  4. 点击Global credentials(unrestricted)
  5. 再点击 add credentials
  6. 填写表单
    • Kind。凭证类型
    • Scope。凭证作用域
    • ID。凭证位移标识
  7. 点击ok,完成添加凭证

常用的凭证类型

  • Secret text
    • 是一串保密文本,如GitLab的API Token
  • Username with password
    • 是指用户名和密码的凭证
  • Secret file
    • 指需要保密的文本文件
  • SSH Username with private key
    • 是指一对SSH用户名和密钥

使用凭证

  • 通过pipeline提供的credentials helper方法来简化凭证的使用(只能在environment指令中使用)

  • 示例

    environment { 
    	ENV_SECRET_KEY= credentials('aws-secret-key-id')
    }
    

其它

  • HashiCorp Vault插件,可以增强凭证管理
  • Masked Pass-word插件,可以在Jenkins日志中隐藏指定的敏感信息

使用示例

  • Jenkins从Git拉取代码的安全认证流程
    1. 创建私钥,Jenkins -> Credentials -> System -> Global Credentials页面,选择Kind为"SSH Username with private Key"
    2. 将生成的SSH的公钥放到Git仓库中
    3. Jenkins从git仓库拉取代码时,配置所需要的需要SSH KEY

认证与授权

认证管理

简述

  • 设置Jenkins进行安全检查,只有通过Jenkins认证的用户才允许操作Jenkins

开启安全检查

  • 进入Manage Jenkins
  • Manage Configure Global Security页面
  • 勾选Enable security复选框

支持的认证方式

Delegate to servlet container
Jenkins own user database
  • 即使用自带的用户数据库进行认证
  • 创建用户
    • 进入Manage Jenkins
    • Manage Users页面
    • 点击Create User选项
    • 填写用户信息,并点击Create User完成创建
集成LDAP认证

LDAP在企业中最常用的应用场景就是单点登录

  • 安装LDAP插件
  • 开启LDAP认证
    • 进入Manage Jenkins
    • Manage Configure Global Security页面
    • 勾选Enable security复选框后,选择LDAP
  • 设置LDAP
    • 点击Advanced Server Configuration按钮
    • 输入相关信息后,点击Test LDAP Settings按钮
    • 输入LDAP中的用户名和密码,如果登录成功,则表明集成LDAP认证成功

授权管理

简述

  • 默认的授权方式无法满足复杂的场景
  • Jenkins有三款插件,分别支持不同维度的授权方式

常见插件

Matrix Authorization Strategy插件

基于矩阵的安全策略

Project-based Matrix Authorization Strategy插件

提供基于项目的矩阵授权策略

Role-based Authorization Strategy插件

提供基于角色的安全策略

  • 使用
    • 安装插件Role-based Authorization Strategy
    • 在Configure Global Security页面的Authorization下,就会显示出多种授权方式
    • 选择Role-based Strategy,然后保存,这样就启用了基于角色的安全策略
    • 在Manage Jenkins下点击Manage and Assign Roles菜单项,进行管理角色
  • 角色
    • 全局角色(Global roles)
    • 项目角色(Project roles)
    • Slave角色(Slave roles)
  • 权限列表项
  • 角色分配
  • 内置角色
    • anonymous,匿名用户
    • Authenticated,认证通过的用户

Jenkins的全局访问凭证

  • 生成Jenkins的全局访问权限
  • 为pipeline生成一个Secret Token
  • 外部系统远程访问Jenkins时只有带上Secret token的请求才会被处理

Jenkins监控

Monitoring插件

简述

  • 该插件提供的监控维度非常多,例如CPU、内存、系统负载、HTTP响应时间、线程数、进程数、当前请求数

使用

  • 安装插件
  • 在Manage Jenkins菜单下找到Monitoring of Jenkins master菜单项
  • 点击并进入该页面,当前页面显示Monitoring仪表盘

Prometheus监控

简述

  • 是一款开源的监控、告警系统
  • 采用的是pull模式收集指标数据,即主动从目标拉取指标数据

通知

邮件通知

使用Jenkins内置邮件通知功能

使用

  • 进入Manage Jenkins -> Configure System -> Jenkins Location设置页面
  • 填写管理员邮件信息
  • 找到E-mail Notification部分
  • 填写邮件相关信息
  • 勾选Test configuration by sending test e-main复选框,输入接收测试邮件的邮箱,点击Test configuration按钮进行测试
  • 如果提示Email was successfully sent,说明配置成功
  • 在pipeline中配置mail相关信息

使用Email Extension插件发送通知

简述

  • 该插件对默认的邮件功能进行了拓展
  • 支持丰富的特性
    • 可以定制接收人的邮件列表
    • 可以将构建日志以附件形式加到邮件中,还可以设置对日志进行压缩
    • 可以发送附件

使用

  • 安装Email Extension插件
  • 进入Manage Jenkins -> Configure System -> 选择Extended E-mail Notification配置页面
  • 填写相关信息
  • 在pipeline中使用emailext

钉钉通知

简述

  • 就是在钉钉群中增加一个钉钉机器人,将消息发送到钉钉机器人的API即可

使用钉钉机器人

  • 在钉钉群的右上角单击机器人形状的图标
  • 在弹出的机器人类型中,选择Custom类型
  • 按照提示操作到达最后一步,复制webhook的URL中的accessToken的值,该值将在Jenkins访问钉钉机器人API时提供的访问令牌
  • 安装Dingding插件
  • 在pipeline中加入dingTalk步骤

HTTP请求通知

简述

  • 使用HTTP Request插件,支持发送HTTP请求给第三方系统
  • 这是最通用的与第三方系统集成的方式之一

Jenkins备份

简述

  • Jenkins的所有数据都是存放在文件中的,所以,备份其实就是备份JENKINS_HOME目录
  • 使用Periodic Backup插件进行备份

汉化

  • Jenkins默认根据用户浏览器的语言设置来显示的
  • 如果希望设置Jenkins界面的语言,则安装Local插件
    • 进入Manage Jenkins→Configure System页面
    • 找到Local进行设置(zh_CN),勾选ignore...复选框,表示忽略用户浏览器语言设置

自动化部署

自动化部署需要解决的问题

  • 如何与受控机器通信
  • 如何组织成百上千台机器
  • 如何描述部署逻辑,同时还应该是幂等的
  • 如何得到执行结果

常用工具

  • Puppet
    • 使用的是C/S架构,分为主控机器与受控机器,它们之间使用HTTPS进行通信
  • Chef
    • 使用的是C/S架构,也是使用HTTPS通信
  • Ansible
    • 使用SSH协议与受控机器进行通信,任意一台安装了Ansible的机器都可以作为主控机器
    • 使用YAML格式作为自己的DSL格式
    • 在Jenkins上安装Ansible插件可以与Ansible进行集成

其它

tools

简述

  • 该指令能帮助我们自动下载并安装所指定的构建工具,并将其加入PATH变量中
  • 在agent为none的情况下不会生效
  • tools指令还可以支持更多工具
  • 该指令默认支持3种工具
    • JDK
    • Maven
    • Gradle

多版本编译

使用tools作用域实现多版本编译

  • 示例

    pipeline{ 
    agent any 
    	stages{  
    		stage('build with jdk-8') {   
    			tools {    
    				jdk 'jdk-8'   
    			}   
    			steps{    
    				sh 'printenv'   
    			}  
    		}  
    		stage('build with jdk-9') {   
    			tools {    
    				jdk 'jdk-9'   
    			}   
    			steps {    
    				sh 'printenv'   
    			}  
    		} 
    	}
    }
    

从版本控制库拉取Pipeline

注意事项

  • 在"Credentials"中选择我们创建的用于拉取代码的凭证
  • "Script Path"就是pipeline的文件名,默认时Jenkinsfile

流程

  • 在Pipeline节点下
  • 在"Definition"中选择Pipeline script from SCM
  • 并在"SCM"中选择"GIT"
  • 然后根据选项填入信息内容就可以了

安装Maven

在pipeline文件中填写相关配置项,会进行自动安全

安装

  1. 进入Manager Jenkins -> Global Tool configuration -> Maven
  2. 留意Name输入框中的值,在后面的pipeline中会使用到
  3. settings.xml文件的默认路径是${M2_HOME}/conf/settings.xml

配置settings.xml

  1. 安装Config File Provider插件
  2. 进入Manage Jenkins页面
  3. 选择Managed files菜单
  4. 选择Add a new Config
  5. 选择Global Maven settings.xml选项
  6. 填写相关信息,Jenkins pipeline会引用ID字段
  7. 单击submit按钮提交后,就能看到编辑页了

使用

configFileProvider(
[
	configFile(
		fileId:'maven-global-settings',
		variable:'MAVEN_GLOBAL_ENV'
	)
]
) 
{
	sh "mvn -s $MAVEN_GLOBAL_ENV clean install"
}

安装JDK

注意事项

  • 留意Name输入框中的值,在后面的pipeline中会使用到
  • 基于安全考虑,部署环境无法直接访问外网,无法使用自动下载,这时需要手动指定JDK,并配置JDK路径

自动安装

  • 进入Manager Jenkins -> Global Tool Configuration -> 单击Add JDK按钮,就可以设置自动安装JDK

手动指定JDK路径

  • 进入Manager Jenkins -> Global Tool Configuration -> 在JDK页中指定名称和JAVA_HOME路径
  • 此处指定的JAVA_HOME是通过自动化脚本安装的JDK的PATH

安装Go语言环境

安装Go插件

  • 进入Manage Jenkins -> Global Tool Configuration -> 选择Go
  • 在pipeline中加入tools部分
  • 设置GOPATH
  • 在environment指令中添加即可

安装Python环境

  • 在Jenkins机器上安装python、pip、virtualenv
  • pip是python的包管理工具
  • virtualenv是python中的虚拟环境管理工具
  • 安装pyenv Pipeline插件
  • 在pipeline中使用pyenv Pipeline插件提供的withPythonEnv方法

Jenkins简单使用示例

创建maven项目,

安装Jenkins运行的环境(JDK、Maven),

编写jenkinsfile项目编译打包相关配置

  1. 创建Maven项目
  2. 在Jenkins上安装JDK和Maven。可以手动安装,也可以让Jenkins自动安装
  3. 编写Jenkinsfile内容

常见插件

  • Version Number,该插件用于版本号的生成