大家是否还清楚之前发布的文章 实践: Jenkins Core Api & Job DSL创建项目,当时使用的是jenkins Core API完成了项目的创建,但是没有说明CoreAPI的使用,今天特意补充一下如何使用,我们就列举一个”通过Jenkinfile创建jenkins项目“的小案例来熟悉如何使用Core API。
API文档
需要一份API文档来使用Core API,没有Java开发的经验所以有些步骤真的很......
文档链接:https://javadoc.jenkins-ci.org/overview-summary.html
理解需求
在Jenkins项目管理中,我们可以用Folder对不同项目组的项目进行分类。项目在项目组对应的Folder中创建。因每个项目组的流水线参数和类型可能都不一样,所以我们可以在Folder中创建一个模板项目。后续根据此模板项目进行复制创建。当要创建的项目已经存在了,则直接更新配置。如果配置相同流水线结束。
开始根据我们的需求找到我们所需要的类。
jenkins.model.Jenkins # 用到的类 Jenkins.instance # 用于创建Jenkins实例getItemByFullName() # 创建一个项目实例getItem() # 获取项目(不存在返回null)getItem("xxxx").configFile.asString().trim() #获取项目的配置文件Jenkins.checkGoodName(name) # 检查项目名称是否符合规范createProjectFromXML() # 通过XML创建项目updateByXml() # 通过XML更新项目save() #保存项目配置
编写脚本
import javax.xml.transform.stream.StreamSourceimport jenkins.model.Jenkins
def j = Jenkins.instanceString name = "test/devops-ci" ## 项目的完整名称
//如果输入的项目名称带有/符号 意味着 /前面的是文件夹 后面的是项目名称//tokenize('/') 以'/'做分割生成listif(name.contains('/')) { println(name.tokenize('/')[0]) j = j.getItemByFullName(name.tokenize('/')[0]) //文件夹是否存在 println(j) name = name.tokenize('/')[-1] println(name)}
//获取模板项目的配置文件(确保此项目存在)xml = j.getItem("test-devops-service").configFile.asString().trim()
/*public static void checkGoodName(String name) throws FailureCheck if the given name is suitable as a name for job, view, etc.Throws:Failure - if the given name is not good*///检查给定名称是否适合作为作业,视图等的名称。Jenkins.checkGoodName(name)
println(name)
//判断项目是否存在,null不存在if(j.getItem(name) == null) { println "Created job \"${name}\"." j.createProjectFromXML(name, new ByteArrayInputStream(xml.getBytes())) j.save()}
else if(j.getItem(name).configFile.asString().trim() != xml.trim()) { j.getItem(name).updateByXml(new StreamSource(new ByteArrayInputStream(xml.getBytes()))) j.getItem(name).save() println "Job \"${name}\" already exists. Updated using XML."}else { println "Nothing changed. Job \"${name}\" already exists."}
运行调试
在进行调试的过程中很不顺利,会出现很多安全设置拦截的方法,需要允许。
这是$JENKINS_HOME/scriptApproval.xml文件 approvedSignatures 内容。可以复制过去重启Jenkins。
<approvedSignatures> <string>method hudson.XmlFile asString</string> <string>method hudson.model.AbstractItem getConfigFile</string> <string>method hudson.model.AbstractItem updateByXml javax.xml.transform.stream.StreamSource</string> <string>method hudson.model.ItemGroup getItem java.lang.String</string> <string>method hudson.model.Saveable save</string> <string>method java.lang.String getBytes</string> <string>method jenkins.model.Jenkins getItemByFullName java.lang.String</string> <string>method jenkins.model.ModifiableTopLevelItemGroup createProjectFromXML java.lang.String java.io.InputStream</string> <string>new java.io.ByteArrayInputStream byte[]</string> <string>new javax.xml.transform.stream.StreamSource java.io.InputStream</string> <string>staticMethod jenkins.model.Jenkins checkGoodName java.lang.String</string> <string>staticMethod jenkins.model.Jenkins getInstance</string> </approvedSignatures>
总结
这并不是必须通过Core API做项目创建的事情,通过这种方式能够编写groovy脚本实现Jenkins的初识化配置。例如:创建凭据,安装插件等等。这是Jenkins 无状态化研究的必要的一个步骤。