在我之前的工作工程中, 每次感觉头大的都是新项目的部署, 这个过程中就会涉及到Jenkins Job的创建。 在文章运维平台化一定是你的追求吗?中我们有提到Jenkins是实现Gitops的重要组成部分, 他是要干很多活的。 基于这样的情况我们就要对Jenkins job相关的东西首先代码化。
PS: 本文所有东西使用Jenkins Pipeline实现, 如果没有相关基础请先学习了解
第一步 - 安装Job DSL插件
我们使用Jenkins Job DSL来实现job的管理, Jenkins Job DSL 支持使用 Groovy 代码以编程方式创建 Jenkins Job。 我们需要将代码存储到git仓库中,从而使更改可追溯并自动完成 Jenkins Job的创建。
https://jenkinsci.github.io/job-dsl-plugin/
首先,浏览器输入your_jenkins_url/pluginManager/available
. 在搜索框中,输入Job DSL
。接下来,在生成的插件列表中,选中Job DSL旁边的框,然后单击Install without restart。
注意:如果搜索Job DSL
没有返回结果,则表示已经安装了 Job DSL 插件,或者您的 Jenkins 服务器的插件列表未更新。您可以通过浏览器访问your_jenkins_url/pluginManager/installed
并搜索Job DSL
.还可以访问your_jenkins_url/pluginManager/available
并单击插件列表底部的“check now”按钮来更新 Jenkins 服务器的插件列表。
启动安装以后,我们会进入安装进度的页面,当看到Job DSL和Loading plugin extensions旁边看到“success”,然后再继续下一步。
安装完成job dsl插件后, 我们就可以使用job DSL将配置代码化。
第二部 - 创建seed job
要创建seed job, 访问you_jenkins_url并且登陆以后, 点击左侧的New Item
选项。 会出现如下图所示的页面,输入job名称,并选择类型为Freestyle project
, 点击OK
保存
保存成功后进入job配置页面, 向下滚动到Source Code Management
部分, 点击选择git, 在文本框内输入git地址以及选择对应的deloy key, 输入文件的分支
Repository URL: git@git.example.com:devops/jenkins-job-dsl.git
Credentials: Deploy Key For Gitlab
Branches to build: master
注意: Deploy Key 最好使用单独的key, 并且只分配可以clone代码的权限。
保存成功后进入job配置页面, 向下滚动到Build部分,并单击Add Build
步骤下拉菜单。接下来选择Process Job DSLs
。
然后,单击Use the provided DSL
脚本旁边的单选按钮,并将编写的Job DSL
脚本路径粘贴到DSL script
文本区域。
文本内容为
jenkins-job-dsl/jobs/*.groovy
jenkins-job-dsl/jobs/demo/*/*.groovy
jenkins-job-dsl/jobs/example/*/*.groovy```
## 第三部 - Running Seed job
点击刚创建好的job, 进行构建
## 第四部 - 配置gitlab webhook
1) `Settings` > `Webhooks` > `Add webhook`
2) URL - https://jenkins.example.com/project/prod-yunwei-jenkins-seed-all
3) Triggers - Whatever you want them to be (most likely at least **push**)
**注意:** 需要gitlab当前项目的master权限
## 第五部 - 维护git仓库
首先在git中创建好`jenkins-job-dsl`名称的仓库, 按照如下的目录维护好仓库基础内容
http://git.example.com/devops/jenkins-job-dsl.git
**仓库目录结构**
$ tree -L 3
.
├── CONTRIBUTING.md
├── README.md
├── jobs
│ ├── example # 维护业务相关的job目录
│ │ ├── java # 维护java程序相关的job目录
│ │ ├── mobile # 维护app程序相关的job, 包括安卓和ios
│ │ ├── node # 维护前端相关的job
│ │ └── php # 维护php相关的job
│ ├── devops # 维护运维相关的job
│ │ ├── argocd_app.groovy
│ │ ├── docker_image
│ │ ├── dockerhub_to_aliyun.groovy
│ │ ├── kube_core_prod.groovy
│ │ ├── mother_imager_build.groovy
│ │ └── terraform_prod.groovy
│ ├── dashboard.groovy #维护jenkins view的脚本
│ ├── folders.groovy #维护全局目录的脚本
│ └── seed_all.groovy #seed job的入口文件
└── scripts # 维护其它需要的groovy脚本
├── argocd.groovy
├── dockerhub-to-aliyun.groovy
├── image_build.groovy
└── mother_image_build.groovy
14 directories, 14 files
### Example: 添加一个java程序
编辑/jobs/java/config_prod.json`文件, 按照下面的格式添加项目
{
"PLEASE_READ": "Always add the following properties: 'name', 'owner', and 'description' for your multi-branch pipeline. Keep objects sorted by 'name'. Contact @devops in Slack with any questions.",
"pipelines": [
{
"name": "yunwei-demo",
"repository": "git@git.example.com:middle/yunwei-demo.git",
"git_address": "git@git.example.com",
"git_group": "middle",
"git_project": "yunwei-demo",
"module": "",
"job_folder": "match",
"env" : "pre",
"branch": "pre",
"language": "java",
"jenkinsfile_path": "Jenkinsfile",
"clone_option_timeout": 30,
"owner": "match"
}
]
}
编辑完成后push到gitlab,会触发`seed job`的构建