当前位置:网站首页>Jenkins API groovy调用实践: Jenkins Core Api & Job DSL创建项目
Jenkins API groovy调用实践: Jenkins Core Api & Job DSL创建项目
2022-08-09 12:34:00 【学亮编程手记】
在大规模的Jenkins实践中创建项目也是一个问题,如何通过模板自动化的创建Jenkins项目呢? 可以通过安装Job Dsl插件后,通过 Dsl直接创建项目。也可以通过工具将dsl转换为xml,然后再通过Jenkins API创建项目。相对比较第一种方式更加直接一些,由于时间问题今天暂时分享第二种创建项目的方式。
1.根据Job DSL API生成模板
我们需要先安装好Job Dsl 插件,然后执行DSL创建项目。地址:https://jenkinsci.github.io/job-dsl-plugin/
例如: 使用官网的example。这里定义了一个流水线项目,配置了项目的信息包括(项目描述、项目参数、Jenkinsfile地址)
pipelineJob("test-schdule-service") {
description("this is my first job")
keepDependencies(false)
parameters {
choiceParam("test", [1, 2, 3], "")
}
definition {
cpsScm {
scm {
git {
remote {
github("https://gitlab.com/xxx/xxx.git", "https")
credentials("24982560-17fc-4589-819b-bc5bea89da77")
}
branch("*/master")
}
}
scriptPath("Jenkinsfile")
}
}
disabled(false)
}
2.通过Playground转换DSL -> XML
url: http://job-dsl.herokuapp.com/
3.通过Jenkins Core Api创建项目
import javax.xml.transform.stream.StreamSource
import jenkins.model.Jenkins
//创建项目
void createOrUpdateJob(String name, String xml) {
def j = Jenkins.instance
String fullName = name
if(name.contains('/')) {
j = j.getItemByFullName(name.tokenize('/')[0..-2])
name = name.tokenize('/')[-1]
}
Jenkins.checkGoodName(name)
if(j.getItem(name) == null) {
println "Created job \"${fullName}\"."
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 \"${fullName}\" already exists. Updated using XML."
}
else {
println "Nothing changed. Job \"${fullName}\" already exists."
}
}
try {
//just by trying to access properties should throw an exception
itemName == null
xmlData == null
isPropertiesSet = true
} catch(MissingPropertyException e) {
println 'ERROR Can\'t create job.'
println 'ERROR Missing properties: itemName, xmlData'
return
}
String xmlData = """<!-- 1. test-schdule-service -->
<flow-definition>
<actions></actions>
<description>this is my first job</description>
<keepDependencies>false</keepDependencies>
<properties>
<hudson.model.ParametersDefinitionProperty>
<parameterDefinitions>
<hudson.model.ChoiceParameterDefinition>
<choices class='java.util.Arrays$ArrayList'>
<a class='string-array'>
<string>1</string>
<string>2</string>
<string>3</string>
</a>
</choices>
<name>test</name>
<description></description>
</hudson.model.ChoiceParameterDefinition>
</parameterDefinitions>
</hudson.model.ParametersDefinitionProperty>
<com.coravy.hudson.plugins.github.GithubProjectProperty>
<projectUrl>https://github.com/https://gitlab.com/xxx/xxx.git/</projectUrl>
</com.coravy.hudson.plugins.github.GithubProjectProperty>
</properties>
<triggers></triggers>
<definition class='org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition'>
<scriptPath>Jenkinsfile</scriptPath>
<lightweight>false</lightweight>
<scm class='hudson.plugins.git.GitSCM'>
<userRemoteConfigs>
<hudson.plugins.git.UserRemoteConfig>
<url>https://github.com/https://gitlab.com/xxx/xxx.git.git</url>
<credentialsId>24982560-17fc-4589-819b-bc5bea89da77</credentialsId>
</hudson.plugins.git.UserRemoteConfig>
</userRemoteConfigs>
<branches>
<hudson.plugins.git.BranchSpec>
<name>*/master</name>
</hudson.plugins.git.BranchSpec>
</branches>
<configVersion>2</configVersion>
<doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
<gitTool>Default</gitTool>
<browser class='hudson.plugins.git.browser.GithubWeb'>
<url>https://github.com/https://gitlab.com/xxx/xxx.git/</url>
</browser>
</scm>
</definition>
<disabled>false</disabled>
</flow-definition>
"""
String itemName = "my-first-pipeline"
createOrUpdateJob(itemName, xmlData)
4.通过Jenkins Script Console运行
创建完成
边栏推荐
- Rust 入门指南(使用JSON)
- Say goodbye to the AI era of hand looms
- #Internet of Things essay#Xiaoxiong pie equipment development actual combat
- 使用RecyclerView实现三级折叠列表
- 用场景定义硬件,英码科技破解“边缘计算”密码
- Flutter Getting Started and Advanced Tour (3) Text Widgets
- Flutter Getting Started and Advanced Tour (4) Text Input Widget TextField
- Ten minutes to teach you how to use VitePress to build and deploy a personal blog site
- 手写大根堆
- How to upload local file trial version in binary mode in ABAP report
猜你喜欢
Flutter入门进阶之旅(八)Button Widget
[HCIP Continuous Update] Principle and Configuration of IS-IS Protocol
Rust from entry to proficient 04 - data types
Redis源码剖析之跳表(skiplist)
苹果Meta都在冲的Pancake技术,中国VR团队YVR竟抢先交出产品答卷
Ten minutes to teach you how to use VitePress to build and deploy a personal blog site
【微服务~远程调用】整合RestTemplate、WebClient、Feign
Resolved IndentationError: unindent does not match any oute r indentation Level
在“Extend the Omniverse”比赛中构建用于 3D 世界的工具
Scala Advanced (7): Collection Content Summary (Part 1)
随机推荐
大佬们,请教一下,我看官方文档中,sqlserver cdc只支持2012版之后的,对于sqlser
十分钟教会你如何使用VitePress搭建及部署个人博客站点
Flutter入门进阶之旅(四)文本输入Widget TextField
Redis源码剖析之数据过期(expire)
Resolved IndentationError: unindent does not match any oute r indentation Level
JVM之配置介绍(一)
26. Pipeline parameter substitution command xargs
位图与位运算
两分钟录音就可秒变语言通!火山语音音色复刻技术如何修炼而成?
h264协议
腾讯欲成育碧最大股东/ 米哈游招NLP内容生成研究员/ AI发现四千余物种濒临灭绝...今日更多新鲜事在此...
About the handling of variable parameters in the Retrofit network request URL
用场景定义硬件,英码科技破解“边缘计算”密码
How to upload local file trial version in binary mode in ABAP report
基于CAP组件实现补偿事务与幂等性保障
面试题精选:神奇的斐波那契数列
The FFmpeg library is configured and used on win10 (libx264 is not configured)
Report: The number of students who want to learn AI has increased by 200%, and there are not enough teachers
一维数组&指针
罗振宇折戟创业板/ B站回应HR称用户是Loser/ 腾讯罗技年内合推云游戏掌机...今日更多新鲜事在此...