[作者:Surpassme]Jenkins之所以这么流行,不仅在于本身功能非常齐全,也在于本身插件非常丰富,以下主要介绍平时经常使用的到插件。
[作者:Surpassme]依次点击Manage Jenkins -> Manage Plugins -> Available,搜索插件并安装即可,示意图如下所示:

[作者:Surpassme]该插件允许在构建时,选择指定的git分支、标签等,官网地址 :https://plugins.jenkins.io/git-parameter/。pipeline 示例录下所示:
pipeline {
agent any
environment{
CODE_SUB_DIR_PATH="surpass"
CODE_GitURL="https://gitlab.surpass.com/surpass/demo.git"
}
parameters {
gitParameter(
name:"CODE_TAG_BRANCH_NAME",
type:"PT_BRANCH_TAG",
branchFilter: "origin/(.*)",
defaultValue: "test",
selectedValue:"DEFAULT",
sortMode:"DESCENDING_SMART",
useRepository:"${env.CODE_GitURL}",
description: "请选择branch或tag"
)
}
stages {
stage("拉取代码"){
steps{
checkout([
$class:"GitSCM",
branches:[[name:"${params.CODE_TAG_BRANCH_NAME}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [[
$class:"RelativeTargetDirectory",
relativeTargetDir:"${env.CODE_SUB_DIR_PATH}"
]],
gitTool: "Default",
submoduleCfg: [],
userRemoteConfigs:[[
credentialsId:"32eddb12-cd66-444b-859d-ccb61c3864d1",
url:"${env.CODE_GitURL}"
]]
])
}
}
}
}
[作者:Surpassme]其主要参数解释如下所示:
PT_TAG、PT_BRANCH、PT_BRANCH_TAG、PT_REVISION、PT_PULL_REQUESTNONE、ASCENDING_SMART、DESCENDING_SMART、ASCENDING、DESCENDING [作者:Surpassme]通过设置环境变量来获取启动任务的用户名,官网地址:https://plugins.jenkins.io/build-user-vars-plugin/,一般常用于多用户下的Jenkins环境。主要支持的环境变量如下所示:
| 变量名称 | 描述信息 |
|---|---|
| BUILD_USER | Full name (first name + last name) |
| BUILD_USER_FIRST_NAME | First name |
| BUILD_USER_LAST_NAME | Last name |
| BUILD_USER_ID | Jenkins user ID |
| BUILD_USER_GROUPS | Jenkins user groups |
| BUILD_USER_EMAIL | Email address |
[作者:Surpassme]示例用法如下所示:
pipeline{
agent any
stages{
stage("get build user demo"){
steps{
script{
wrap([$class: 'BuildUser']) {
env.BUILD_USER = "${BUILD_USER_ID}"
}
}
}
}
stage("print build user"){
steps{
echo "build user is ${env.BUILD_USER}"
}
}
}
}
[作者:Surpassme]该插件功能非常多,可以用来比较版本大小、查找文件、读取CSV、JSON、YAML等,其官网地址:https://plugins.jenkins.io/pipeline-utility-steps/,我们以读写YAML为示例,如下所示:
def readYamlFile(filePath,imageName){
if (fileExists(filePath)){
println("Yaml file path is ${filePath}")
def data=readYaml(file:filePath)
println("YAML文件内容:\n${data}")
def testText=data.spec.template.spec.containers[0][0].image
data.spec.template.spec.containers[0][0].image=imageName
println("修改前的镜像地址:${testText}\n修改后的镜像地址:${imageName}")
return data
}
else{
println("${filePath} not exists,please check !!!")
}
}
def writeYamlFile(filePath,content,overwrite=true,charset="UTF-8"){
if (fileExists(filePath)){
writeYaml(file:filePath,datas:content,overwrite:overwrite,charset:charset)
}
else{
println("${filePath} not exists,please check !!!")
}
}
[作者:Surpassme]主要用于发送HTTP请求,比如向企业微信机器人发送消息等,官网地址:https://plugins.jenkins.io/http_request/,HTTP Request支持的参数如下所示:
- NOT_SET
- TEXT_HTML
- TEXT_PLAIN
- APPLICATION_FORM
- APPLICATION_JSON
- APPLICATION_JSON_UTF8 // 若含中文,需要使用这种方式
- APPLICATION_TAR
- APPLICATION_ZIP
- APPLICATION_OCTETSTREAM
name:字符串类型,Header名称
value:字符串类型,Header值
maskValue:布尔类型,是否隐藏Header值。若为true,则打印时使用*代替
- 单状态值:如200,当收到200状态码,表示HTTP请求成功
- 多状态值:当响应状态码符合多个状态码中的一个时,则代表请求成功,多个状态码之间使用逗号分隔。如200,300
- 范围状态值:格式为"From:To",如200:302,代表收到200~302的响应状态码都算请求成功
- NONE:不读取响应内容
- LEAVE_OPEN:当执行完请求后,并不会返回响应内容,而是返回一个打开的inputStream,由你自己决定如何读取响应内容,在使用完之后,需要调用inputStream的close方法关闭
- STRING:默认值,将响应内容转换为一个字符串
示例代码如下所示:
def httpRequestSendMessage(address,method,body){
def response=httpRequest(url:address,
acceptType:"APPLICATION_JSON_UTF8",
contentType:"APPLICATION_JSON_UTF8",
httpMode:method,
requestBody:body,
ignoreSslErrors:true,
validResponseCodes:"200"
)
println("response.status is:${response.status}\nresponse.content:${response.content}")
allure是一个轻量级别的多语言测试报告插件,常用于在自动化测试中以WEB形式展示测试报告,官网地址:https://plugins.jenkins.io/allure-jenkins-plugin/,其示例用法如下所示:
post{
always{
script{
allure([
includeProperties : false,
jdk:"",
properties: [],
reportBuildPolicy: "ALWAYS",
report: "${env.ALLURE_REPORT_PATH}",
results: [[ path: "${env.ALLURE_RESULT_PATH}" ]]
])
}
}
}
[作者:Surpassme]使用注意事项如下所示:
最终报告的存储路径,其中默认生成的路径为相对于$WORKSPACE的路径中间数据,即生成的原始报告数据,支持多个路径中间数据,其中默认生成的路径为相对于$WORKSPACE的路径[作者:Surpassme]Active Choices 插件常用于创建动态交互式参数化插件。其官网地址:https://plugins.jenkins.io/uno-choice/,其主要支持的参数类型有:
Active Choices parameters 允许用户为任务参数选择值,参数值如下所示:
[作者:Surpassme]Active Choices parameter 使用Groovy脚本动态生成参数列表
[作者:Surpassme]Active Choices parameters 可以生成标准列表选择、复选框和单选框
[作者:Surpassme]可以生成文本框筛选器来筛选选项

图片来自于:https://github.com/jenkinsci/active-choices-plugin/blob/master/docs/images/001.jpg
[作者:Surpassme]与Active Choices Parameter类似,可以使用Groovy脚本为构建任务动态生成参数选项,当UI控件值发生变更时,也可以动态级联更新。
[作者:Surpassme]Active Choices Reactive:可以生成标准列表选择、复选框、单选框和文本框筛选器来筛选选项
[作者:Surpassme]Active Choices Reactive Reference:可以生成HTML列表、HTML输入框、动态生成HTML等

图片来自于:https://cdn.jsdelivr.net/gh/jenkinsci/active-choices-plugin@master/docs/images/002.gif
[作者:Surpassme]以下为三种Active Choices parameter的行为和呈现特征对比

图片来自于:https://cdn.jsdelivr.net/gh/jenkinsci/active-choices-plugin@master/docs/images/003.jpg
[作者:Surpassme]以下为在自由风格中的配置,示例如下所示:

[作者:Surpassme]主要参数解释如下所示:
[作者:Surpassme]与常规Jenkins 参数一致,用于一个参数的名称和描述信息
动态生成参数所使用的脚本代码,脚本返回必须为 java.util.List、java、java.util.Map
[作者:Surpassme]主要提供备用选项,在脚本出错时,使用该值
[作者:Surpassme]主要提供四种不同的类型选择单选框、复选框、列表单选、列表多选
[作者:Surpassme]是否启用筛选搜索


[作者:Surpassme]通过自由风格来配置Active Choice非常方便,但迁移起来也非常麻烦的,pipeline示例如下所示:
properties([
parameters([
[
$class: "ChoiceParameter",
choiceType: "PT_SINGLE_SELECT",
description:"请选择一个省份",
filterable: true,
filterLength: 1,
name: "Province",
script: [
$class: "GroovyScript",
script:[
classpath: [],
sandbox: true,
script: "return ['江苏','浙江','安徽']"
],
fallbackScript:[
classpath: [],
sandbox: true,
script: "return['错误']"
]
]
],
[
$class: "CascadeChoiceParameter",
choiceType: "PT_CHECKBOX",
name: "City",
referencedParameters: "Province",
script: [
$class: "GroovyScript",
script:[
classpath: [],
sandbox: true,
script: '''
if(Province.equals("江苏")){
return ["南京:selected","苏州","无锡","常州"]
} else if(Province.equals("浙江")){
return ["杭州:selected","绍兴","宁波","温州"]
} else if(Province.equals("安徽")){
return ["合肥:selected","芜湖","六安","马鞍山"]
} else {
return ["未知城市"]
}
'''
],
fallbackScript:[
classpath: [],
sandbox: true,
script: "return['脚本错误']"
]
]
]
])
])
pipeline{
agent any
options{
timestamps()
}
stages{
stage("active choice demo"){
steps{
echo "Province is:${params.Province}"
echo "City is:${params.City}"
}
}
}
}
[作者:Surpassme]运行结果如下所示:

注意事项:[作者:Surpassme]
sandbox需要配置为true,因Jenkins安全策略限制,若为false,可能配置选项无法显示
常见的Choice Type 如下所示:
[作者:Surpassme]源码定义如下所示:
/*
* Constants.
*/
// default choice type
public static final String PARAMETER_TYPE_SINGLE_SELECT = "PT_SINGLE_SELECT";
public static final String PARAMETER_TYPE_MULTI_SELECT = "PT_MULTI_SELECT";
public static final String PARAMETER_TYPE_CHECK_BOX = "PT_CHECKBOX";
public static final String PARAMETER_TYPE_RADIO = "PT_RADIO";
// default choice type
public static final String ELEMENT_TYPE_TEXT_BOX = "ET_TEXT_BOX";
public static final String ELEMENT_TYPE_ORDERED_LIST = "ET_ORDERED_LIST";
public static final String ELEMENT_TYPE_UNORDERED_LIST = "ET_UNORDERED_LIST";
public static final String ELEMENT_TYPE_FORMATTED_HTML = "ET_FORMATTED_HTML";
public static final String ELEMENT_TYPE_FORMATTED_HIDDEN_HTML = "ET_FORMATTED_HIDDEN_HTML";
[作者:Surpassme]邮件也是日常Jenkins常用的通知方式,Jenkins默认支持
[作者:Surpassme]以QQ邮箱演示,操作步骤如下所示:
在配置邮箱时,需要确认所使用的邮箱
已经打开SMTP服务


pipeline{
agent any
options{
timestamps()
}
stages{
stage("Test e-mail Demo"){
steps{
echo "Test e-mail demo"
}
}
}
post{
success{
mail(
from: "surpassme@qq.com",
to: "surpassme@qq.com",
body: "This is test Jenkins send e-mail,please don't reply",
subject: "Test e-mail demo"
)
}
}
}
主要参数解释如下所示:
[作者:Surpassme]如果觉得Jenkins内置的邮件功能不能满足要求,也可以试试插件E-mail Extension,其官网为:https://plugins.jenkins.io/email-ext/,其主要特色功能:
E-mail Extension使用步骤如下所示:

pipeline{
agent any
options{
timestamps()
}
stages{
stage("Test e-mail Demo"){
steps{
echo "Test e-mail demo"
}
}
}
post{
success{
emailext (
to: "surpassme@qq.com",
subject: "Test e-mail demo",
body: """
JobName:${env.JOB_NAME}
BuildNumber:${env.BUILD_NUMBER}
BuildURL:${env.BUILD_URL}
View console log url:${env.BUILD_URL}console
""",
compressLog: true,
attachLog: true,
recipientProviders: [developers(), requestor()],
)
}
}
}
运行结果如下所示:

[作者:Surpassme]emailext的主要参数解释如下所示:
可选,为string类型,发件人地址可选,为string类型,收件人地址可选,为boolean类型,是否将构建日志以附件形式发送可选,为string类型,需要发送的附件的路径,支持ANT风格路径表达式可选,List类型,收件人列表类型常用的收件人列表类型如下所示
| 类型名称 | 功能解释 |
|---|---|
| developers | 此次构建所涉及变更的所有提交者列表 |
| requestor | 启动构建任务的人 |
| culprits | 引发构建失败的,即最后一次构建成功和最后一次构建失败之间的变更提交者列表 |
[作者:Surpassme]Jenkins本身并不提供备份功能,而是使用插件来进行备份。这里推荐使用插件Periodic Backup(https://plugins.jenkins.io/periodicbackup/)来实现备份。操作步骤如下所示:


[作者:Surpassme]主要参数如下所示:
备份的cron表达式,在配置后,可以点击Validate cron syntax进行校验
设备备份策略,ConfigOnly仅备份配置文件,FullBackup 全量备份,也可以在Excludes list 使用Ant风格路径表达式,排除不希望进行备份的文件
[作者:Surpassme]备份文件的保存格式。
备份文件存放位置。需要对文件夹具有相应的读写权限

Restore selected backup即可。原文地址:https://www.jianshu.com/p/9c6bf5a3a969
本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon
您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro