在大规模的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 -->
-
-
this is my first job -
false -
-
-
-
-
'java.util.Arrays$ArrayList' > - 'string-array'>
-
1 -
2 -
3 -
-
- <name>testname>
-
-
-
-
-
-
https://github.com/https://gitlab.com/xxx/xxx.git/ -
-
-
-
'org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition' > -
Jenkinsfile -
false -
'hudson.plugins.git.GitSCM' > -
-
-
https://github.com/https://gitlab.com/xxx/xxx.git.git -
24982560-17fc-4589-819b-bc5bea89da77 -
-
-
-
- <name>*/mastername>
-
-
-
2 -
false -
Default -
'hudson.plugins.git.browser.GithubWeb' > -
https://github.com/https://gitlab.com/xxx/xxx.git/ -
-
-
-
false -
- """
- String itemName = "my-first-pipeline"
-
- createOrUpdateJob(itemName, xmlData)
4.通过Jenkins Script Console运行
创建完成