Jenkins做爲一款開源的持續集成工具,在平常的開發、集成、部署等環節中應用十分普遍。Jenkins的環境搭建和配置就很少說了,網上有不少相關資料,整體使用流程也很是簡單。Jenkins的一大特色就是基於插件的高可擴展性,在使用過程當中咱們能夠發現,Jenkins的許多功能都是經過插件進行集成的,例如php
在常規使用過程當中,一些基本的插件就能夠知足要求,但總有那麼些奇怪的要求不能很快的找到對應的插件,那就須要本身開發了。html
安裝JDK和maven,添加環境變量,增長maven配置java
<settings>
<pluginGroups>
<pluginGroup>org.jenkins-ci.tools</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>jenkins</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/public/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</settings>
複製代碼
官方的插件開發插件:連接。具體步驟以下:python
mvn -U hpi:create
複製代碼
cd plugin-name(artifactId)
mvn verify
複製代碼
mvn hpi:run
複製代碼
mvnDebug hpi:run
複製代碼
官方提供了一個樣例教程:Extend the Plugin,樣例介紹瞭如何開發一個繼承自Action的組件,並顯示在job運行狀態頁面的側邊欄上。shell
官方還有相關的API文檔:文檔。api
固然整體來講相關的插件開發文檔並不算不少,接下來就以兩個實際的需求場景來說解一下Jenkins插件的開發。bash
對於這樣一個需求,是否須要額外開個端口響應請求呢?Jenkins有沒有這樣的擴展方式呢? 答案是確定的,Jenkins官方提供了Remote Access API相關功能及擴展。官方文檔中提到了Jenkins自帶的一些Remote Access API,那如何自定義一個API呢?具體步驟以下:服務器
public class HookPlugin extends Plugin {
public Api getApi() {
return new HookApi(this);
}
}
複製代碼
public class HookApi extends Api {
@WebMethod(name = "pull_request_build")
public void doPullRequestBuild(StaplerRequest req, StaplerResponse resp) throws IOException {
// do something
}
}
複製代碼
到此爲止,一個接口就開發完成了,過程至關簡單。接口地址爲{jenkins_host}/plugin/{plugin-name}/api/pull_request_build,其中plugin-name就是前文中建立插件時輸入的artifactId。maven
public class IMNotifier extends Notifier {
private final String user;
@DataBoundConstructor
public IMNotifier(String user) {
this.user = user;
}
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException {
// do something
}
// 使用自定義的Descriptor
@Override
public DescriptorImpl getDescriptor() {
return (DescriptorImpl) super.getDescriptor();
}
@Extension
public static final class DescriptorImpl extends BuildStepDescriptor<Publisher> {
@Override
public boolean isApplicable(Class<? extends AbstractProject> aClass) {
return true;
}
@Override
public String getDisplayName() { // 插件在界面上展現的名字
return "IM Notification";
}
public FormValidation doCheckDefaultUser(@QueryParameter String value) { // 對輸入框進行校驗
if (value.length() == 0) {
return FormValidation.error("Please set a user");
}
return FormValidation.ok();
}
}
}
複製代碼
因此在這個需求中,咱們須要修改config.jelly,添加一個輸入框,具體代碼以下,須要注意其中field要和IMNotifier中的參數名一致,jelly文件的位置也須要和IMNotifier文件的位置相匹配。ide
<?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">
<f:entry title="User" field="user">
<f:textbox />
</f:entry>
</j:jelly>
複製代碼
插件功能開發完成後就可使用如下命令進行編譯:
mvn clean install
複製代碼
編譯完成後會生成一個hpi文件,手動上傳到jenkins服務器安裝便可。
從上文的兩個樣例來看,Jenkins插件並不複雜,其中的關鍵點在於找到系統相關的API做爲切入點。例如Builder是構建過程,Notifier是構建後過程,遠程接口就要繼承Plugin等等。官方有一個擴展點的文檔能夠進行參考:擴展文檔。開發過程當中能夠根據實際需求在任何擴展點進行擴展。