Jenkins的简单了解
简述
- Jenkins是一个开源的持续集成(CI)和持续交付(CD)工具,主要用于自动化构建、测试和部署软件项目
- Jenkins基于Java开发,提供了一个开放易用的平台,支持各种编程语言和构建工具,如Java、C#、PHP等
- 并且可以与版本控制系统如SVN和Git无缝集成,它也提供了与代码托管平台如GitHub和Bitbucket的直接集成能力
- Jenkins旨在通过自动化重复性任务来提高软件开发和生产效率,它监控和自动化持续重复的工作,如代码编译、测试和部署,以促进持续集成和持续交付的过程
小团队自动化运维实施的顺序
- 做基础监控
- 搭建GitLab
- 搭建Jenkins,并集成GitLab
- 使用Jenkins实现自动编译打包
- 将制品交给制品库管理
- 使用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属性列表,使用自定义全局环境变量与内置变量的方法无异
添加流程
- 进入Manage Jenkins
- Configure System
- Global properties页
- 勾选"Environment variables"复选框
- 单击"Add"按钮
- 在输入框中输入变量名和变量值即可
安全交互
凭证管理
简述
- 通过凭证管理,我们可以在此存储需要密文保护的数据库密码,GitLab 密码信息,Docker 私有仓库的登录密码。保存了这些信息后,Jenkins 就可以和这些第三方的应用进行交互
创建凭证的流程
- 选择Jenkins首页
- 点击Credentials
- 选择System
- 点击Global credentials(unrestricted)
- 再点击 add credentials
- 填写表单
- Kind。凭证类型
- Scope。凭证作用域
- ID。凭证位移标识
- 点击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拉取代码的安全认证流程
- 创建私钥,Jenkins -> Credentials -> System -> Global Credentials页面,选择Kind为"SSH Username with private Key"
- 将生成的SSH的公钥放到Git仓库中
- 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文件中填写相关配置项,会进行自动安全
安装
- 进入Manager Jenkins -> Global Tool configuration -> Maven
- 留意Name输入框中的值,在后面的pipeline中会使用到
- settings.xml文件的默认路径是${M2_HOME}/conf/settings.xml
配置settings.xml
- 安装Config File Provider插件
- 进入Manage Jenkins页面
- 选择Managed files菜单
- 选择Add a new Config
- 选择Global Maven settings.xml选项
- 填写相关信息,Jenkins pipeline会引用ID字段
- 单击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项目编译打包相关配置
- 创建Maven项目
- 在Jenkins上安装JDK和Maven。可以手动安装,也可以让Jenkins自动安装
- 编写Jenkinsfile内容
常见插件
- Version Number,该插件用于版本号的生成