当前位置:网站首页>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运行
创建完成
边栏推荐
- 一维数组&指针
- Flutter introduction advanced trip (5) Image Widget
- OOM排查和处理
- Do you know the difference between comments, keywords, and identifiers?
- ABAP interview questions: how to use the System CALL interface of the ABAP programming language, direct execution ABAP server operating System's shell command?
- 二叉树的序列化和反序列化
- Fragment中嵌套ViewPager数据空白页异常问题分析
- [Microservice ~ Remote Call] Integrate RestTemplate, WebClient, Feign
- AI basketball referee, walking is special, ask harden care don't care
- WebView injects Js code to realize large image adaptive screen click image preview details
猜你喜欢
The new features of ABP 6.0.0 - rc. 1
听声辨物,这是AI视觉该干的???|ECCV 2022
保存Simulink仿真模型为图片或者PDF的方法
【HCIP持续更新】IS-IS协议原理与配置
[HCIP Continuous Update] Principle and Configuration of IS-IS Protocol
金融业“限薪令”出台/ 软银出售过半阿里持仓/ DeepMind新实验室成立... 今日更多新鲜事在此...
Flutter Getting Started and Advanced Tour (4) Text Input Widget TextField
Nature:猪死亡1小时后,器官再次运转
Rust 入门指南(使用JSON)
在“Extend the Omniverse”比赛中构建用于 3D 世界的工具
随机推荐
FFmpeg compiles and installs on win10 (configure libx264)
OOM排查和处理
Flutter Getting Started and Advanced Tour (4) Text Input Widget TextField
Flutter入门进阶之旅(一)-初识Flutter
Compensation transaction and idempotency guarantee based on CAP components
正则引擎的几种分类
Redis源码剖析之robj(redisObject)
Resolved IndentationError: unindent does not match any oute r indentation Level
曼城推出可检测情绪的智能围巾,把球迷给整迷惑了
Redis源码剖析之跳表(skiplist)
#WeArePlay | 与更多开发者一起,探索新世界
JVM内存泄漏和内存溢出的原因
告别手摇织布机的AI时代
史上最猛“员工”,疯狂吐槽亿万富翁老板小扎:那么有钱,还总穿着同样的衣服!...
造自己的芯,让谷歌买单!谷歌再度开源 180nm 工艺的芯片
Adalvo收购其首个品牌产品Onsolis
Flutter入门进阶之旅(七)GestureDetector
go基础之web获取参数
张朝阳对话俞敏洪:一边是手推物理公式,一边是古诗信手拈来
Flutter Getting Started and Advanced Tour (1) - Getting to Know Flutter