自己动手开发Jenkins插件
首先声明由于本人是个菜鸟,之前根本不会Java相关的开发,所以在我看来是很值得注意的地方可能在很多人眼里是一个鸡毛蒜皮的小事,那也就当我自己以后复习看一下吧。所有开发的开始还是去看官方文档,最权威也应该是最及时的。如果和我一样没有什么Java的基础的话,我建议去w3cScholl去学习一下基础的语法知识
1.开发插件的初衷
因为Jenkins里面有很多插件,也有一个Xcode插件,可能作者是为了照顾大多数人的需求以至于做的很通用,但是我觉得这个配置对于一个新手来说并不十分友好,如果之前有用过xcodebuild脚本的打包的可能会好很多。我想尽可能简化插件的配置过程,所以就有了让我开发一个Jenkins插件的初衷。
2.插件的形式
1)、插件支持多种版本的打包;
2)、插件减少配置的过程;
现在插件的雏形是:
另外的文件:
1)、需要一个配置相关的xml文件,放在xml文件中,而不是放在插件中的目的是为了能够记住相关的操作,使用xml而不是使用plist是为了平台通用的配置(尽管plist也是一个xml文件,但是我没有尝试过将它放在一个windows电脑上能不能正常的识别)
因为无意中在libexec
中找到了PlistBuddy
这个工具,所以还是使用plist来代替xml文件吧,因为对于iOS开发者来说plist的地位太大了。
2)、一个打包相关的plist文件
3.插件开发所需要的准备
1)、需要下载一个jdk包
2)、需要maven的环境
3)、一个开发的ide,我是用的idea,虽然是个收费软件,但是有30天的免费使用时间,开始准备用eclipse的,但是经过网上所谓的方法配置了之后,那个代码联想功能和xcode的差距不是一点儿半点儿。没办法只有果断弃之。
4.插件开发工具IDEA的配置
跟着前面说的官方文档来做基本就能正常的走通,这里我说一下作为一个java相关的菜鸟(虽然在ios也是菜鸟,不要在意)中遇到的相关的坑吧!
上面所说的下载jdk需要去官网下载,而maven可以通过homebrew来下载,下载也就不需要网上说的那些的路径配置了。
在官方文档中有说要设置setting.xml
文件中相关的东西,通过homebrew来下载的maven的setting.xml文件的地址是/usr/local/Cellar/maven/3.3.9/libexec/conf
你如果跟着上面的教程做的话,到了Plugin Workspace Layout
的话,先不要急着向下走了,他后面介绍的相关东西文件之类的在idea里面能够很清晰的看到这些文件层次。所以这里需要先配置一下idea了。
1)、第一步你需要生成一个idea的工程,就像是iOS中的一个xcode project的工程。通过使用maven的命令
mvn idea:idea
生成一个idea的文件。
2)、java包相关的东西,网上有很多
3)、安装Jenkins Plugin的调试环境,Run -> Debug -> Edit Configuration -> + -> Remote -> 输入一个Debug名称,并修改端口为8000 -> Apply -> Debug
装Jenkins然后点击左下角有个绿色的昆虫样式的就可以开始调试,如果能够输出Connected to the target VM, address: 'localhost:8000', transport: ‘socket'
的log就说明已经成功创建了debug了。具体Debug相关的需要查看Debugging a Plugin一节其中Unix的设置中有一句命令
export MAVEN_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n"
,
这句命令设置maven options的相关,这就是为什么在idea中debug的时候需要讲端口号设置为8000,我猜测可以通过maven options设置为其他端口,具体行不行后面再说吧!
如果你在debug的时候开了一个localhost的话,最好是先把之前的localhost取消掉ctrl + c
用命令执行man hpi:run jenkins
环境。
5.插件的具体开发
当前工程的目录情况
在resources文件夹的下面有两个文件
global.jelly
和config.jelly
,其中config.jelly
就是我们需要在插件上需要配置的东西global.jelly``config.jelly
用于配置插件ui相关和HelloWorldBuilder
文件的数据传递作用,我设置的config.jelly
为:<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
<!-- This jelly script is used for per-project configuration.See global.jelly for a general discussion about jelly script. -->
<!-- Creates a text field that shows the value of the "name" property. When submitted, it will be passed to the corresponding constructor parameter. -->
<f:entry title="Name" field="name">
<f:textbox />
</f:entry>
<f:entry title="${%Build Debug Version?}" field="haveDebugVersion" description="Debug Version" help="this will build a debug ipa">
<f:checkbox title="YES" />
</f:entry>
<f:entry title="${%Build Release Version?}" field="haveReleaseVersion" description="Release Version" help="this will build a release spa">
<f:checkbox title="YES" />
</f:entry>
</j:jelly>
初始化方法只会在你更新插件设置的时候才会运行一次!
public HelloWorldBuilder(String name,Boolean haveDebugVersion,Boolean haveReleaseVersion) {
this.name = name;
this.haveDebugVersion = haveDebugVersion;
this.haveReleaseVersion = haveReleaseVersion;
System.out.println(this.haveDebugVersion);
System.out.println(this.haveReleaseVersion);
}
getProperty
这里的property就是属性名称,相当于oc里面的get方法吧,比如工程自带的
public String getName() {
return name;
}
我自己也添加了两个属性,分别名为haveDebugVersion
,haveReleaseVersion
。所以需要写一个这两个Property的get方法,通过这个get
方法就可以获取来自插件配置页面的数据了。
public boolean getHaveDebugVersion() {
return haveDebugVersion;
}
public boolean getHaveReleaseVersion() {
return haveReleaseVersion;
}
perform
当你的jenkins job在构建的时候会运行这个方法。在构建的一次job中的Console Ouput
中可以看到你自己相关的log。该方法会在每次构建一个job的时候运行一次,这和builder的初始化方法不一样!
DescriptorImpl
类
插件属性配置相关
getDisplayName
配置当前插件的名称。比如我这里return的是Easy Builder
;
6.插件开发过程中的相关笔记
自定义创建步骤下面这所有的操作我都是在idea中完成的。
1.创建一个类
这个类文件创建在scr/main/jave/文件夹(groupId.artifactId)
,
比如我的路径是:scr/main/jave/plugin.jenkinsplugintest)
。
public class XcodeBuilder extends Builder { (...)}
2.为这个类创建一个视图
同上,如果你要为XcodeBuilder
创建一个视图的话,就需要在scr/main/resources
下面创建一个package,创建好了package之后,然后在这个package下面创建一个config.jelly
,关于这个文件相关的东西我在前面有提到过,还可以创建一个help
文件,用来配置某一个属性的帮助信息,这个帮助信息在Jenkins中配置时可以看到。
Java中创建多线程的方式
Java多线程编程这是我看w3cScholl中的方法,如果用教程的方式来创建一个类并遵守Runaable
协议,这样写的弊端就需要每一个线程的逻辑都在run
函数中去写,感觉代码就很不友好,经过请教别人之后,发现了一个新的办法,特意在这里来记录一下:
//创建多线程并执行相关操作
Thread t = new Thread(new Runnable() {
@Override public void run() { }
});
String thread_name =String.format("com.thread_id_%d.easy_builder",i);
t.setName(thread_name);
t.start();
markdown中添加删除线的方式
这是一段需要添加删除线的句子
具体的语法为:
<pre>
这是一段需要添加删除线的句子
</pre>
相关工具介绍
PlistBuddy
该工具是通过终端来操作plist文件的,使用命令/usr/libexec/PlistBuddy -h
来获取相关的使用方法。
Security
我用来处理keychain相关的一个工具,同样适用命令/usr/bin/security -h
我在开发中主要用到的命令:
find-certificate [-h] [-a] [-c name] [-e emailAddress] [-m] [-p] [-Z] [keychain...]find-identity [-h] [-p policy] [-s string] [-v] [keychain...]
更多关于security
的使用方法情查看官方文档