forked from MystWeb/devops-library
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhelm-cd.jenkinsfile
192 lines (172 loc) · 8.32 KB
/
helm-cd.jenkinsfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
// 加载共享库
@Library("mylib@main") _
// 导入库
import org.devops.*
// New实例化
def checkout = new Checkout()
def notice = new Notice()
def gitlab = new GitLab()
def kubernetes = new Kubernetes()
def projectCustom = new ProjectCustom()
pipeline {
agent {
label "k8s"
}
options {
skipDefaultCheckout true
buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '180', numToKeepStr: '90')
}
parameters {
string defaultValue: 'RELEASE-1.3.0', description: '注意:选择应用发布分支', name: 'branchName'
choice choices: ['dev01', 'dev02', 'test01', 'test02'], description: '环境列表', name: 'envList'
choice choices: ['2048Mi', '3072Mi', '4096Mi', '5120Mi', '6144Mi'], description: '最大内存', name: 'memory'
choice choices: ['1', '2', '3', '4', '5'], description: '副本数', name: 'replicaCount'
choice choices: ['devops.web.frontend', 'devops.web.backend'], description: '服务访问的域名(注意:域名末尾会追加环境选择:domainName.dev01)', name: 'domainName'
// string defaultValue: '80', description: '注意:服务监听的端口号', name: 'port'
}
environment {
// GitLab用户密钥访问凭据Id:id_ed25519 (GitLab-Enterprise-私钥文件(192.168.100.150:/root/.ssh/id_ed25519))
gitlabKeysCredentialsId = "7f714471-562a-4ddd-884b-186f90556a9a"
// DingTalk-robot-token(Jenkins钉钉群聊)
dingTalkTokenCredentialsId = "8c6083c7-e1c2-47c0-9367-b67a9469bcd5"
// DingTalk-robot-id(Jenkins钉钉群聊)
dingTalkRebotIdCredentialsId = "5213e392-d78e-4a9a-a37e-91f394309df1"
// GitLab用户Token访问凭据Id:GitLab-DevOps-token(Your_GitLab_Enterprise_Edition_URL,users:devops)
gitlabUserTokenCredentialsId = "36e10c3d-997d-4eaa-9e46-d9848d5d6631"
// 注意:Helm Chart仓库地址
helmSrcUrl = "http://192.168.100.150/devops/devops-k8s-deployment.git"
// 注意:Helm Chart分支名称
helmBranchName = "main"
}
stages {
stage("Global") {
steps {
script {
// 任务名称截取构建类型(任务名称示例:devops-maven-service)
// env.buildType = "${JOB_NAME}".split("-")[1]
// JOB任务前缀(业务名称/组名称)
env.buName = "${JOB_NAME}".split('-')[0]
// 产品名称
env.productName = "${JOB_NAME}".split('-')[1]
// 服务/项目名称
// env.serviceName = "${JOB_NAME}".split('_')[0]
subName = "${JOB_NAME}".substring("${JOB_NAME}".indexOf('-') + 1) // 获取 - 后面的子字符串
env.serviceName = "${subName}".replaceFirst(/_.*/, "") // 替换第一个 "_" 及后面的字符为空
// Git项目Id
env.projectId = projectCustom.getProjectIdByProjectName("${env.serviceName}")
if ("${env.projectId}" == "null") {
env.projectId = gitlab.GetProjectId("${env.gitlabUserTokenCredentialsId}", "${env.buName}", "${env.serviceName}")
}
println("serviceName:${env.serviceName},projectId:${env.projectId}")
// Git提交ID
env.commitId = gitlab.GetShortCommitIdByApi("${env.gitlabUserTokenCredentialsId}", "${env.projectId}", "${params.branchName}")
// Git提交超链接
env.commitWebURL = gitlab.GetCommitWebURLByApi("${env.gitlabUserTokenCredentialsId}", "${env.projectId}", "${params.branchName}")
// 服务版本号(推荐定义:"${branchName}-${commitId}")
env.version = "${params.branchName}-${env.commitId}"
// 服务访问的域名
accessDomainName = projectCustom.getAccessDomainName("${params.domainName}")
if ("${accessDomainName}" == "null") {
env.accessDomainName = "${params.domainName}.${params.envList}"
} else {
env.accessDomainName = "${accessDomainName}.${params.envList}"
}
env.domainName = "${params.domainName}.${params.envList}"
// 服务部署的命名空间
env.namespace = "${env.buName}-${env.productName}-${params.envList}"
// 修改Jenkins构建描述
currentBuild.description = """ branchName:${params.branchName} \n namespace:${env.namespace} \n commitId:[${env.commitId}](${env.commitWebURL}) \n domainName: \n ${env.domainName} \n accessDomainName:${env.accessDomainName} """
// 修改Jenkins构建名称
currentBuild.displayName = "${env.version}"
}
}
}
stage("Checkout") {
steps {
script {
println("Checkout")
sh "[ -d ${env.namespace} ] || mkdir ${env.namespace}"
ws("${WORKSPACE}/${env.namespace}") {
checkout.GetCode("${env.helmSrcUrl}", "${env.helmBranchName}", "${env.gitlabKeysCredentialsId}")
}
}
}
}
stage("HelmReleaseFile") {
steps {
script {
// Git文件模板名称
fileName = "values.yaml"
// Git模板文件路径:项目服务名称_Helm/values.yaml
filePath = "${env.namespace}/${env.serviceName}/${fileName}"
// 项目定制参数
Map projectParamsMap = projectCustom.getProjectParamsMap("${params.envList}")
// Kubernetes发布模板文件内容替换
kubernetes.HelmReleaseTemplateFileReplace("${filePath}", "${env.domainName}", "${env.accessDomainName}", "${params.memory}", "${params.replicaCount}", projectParamsMap)
println("projectParamsMap:${projectParamsMap}")
}
}
}
stage("HelmDeploy") {
steps {
script {
kubernetes.HelmDeploy("${env.namespace}", "${env.namespace}/${env.serviceName}", "${env.serviceName}")
}
}
}
stage("HealthCheck") {
steps {
script {
// 注意:自定义域名需配置Hosts文件!
try {
sleep(5)
result = sh returnStdout: true, script: """ curl "http://${env.domainName}/health" """ - "\n"
if ("ok" == result) {
println("Successful!")
}
} catch (Exception e) {
println(e)
}
}
}
}
stage("RollOut") {
input {
message "是否进行回滚"
ok "提交"
submitter "admin,devops-dev,devops-test"
parameters {
choice(choices: ['no', 'yes'], name: 'opts')
}
}
steps {
script {
if ("${opts}" == "yes") {
def result = input message: "选择回滚版本?",
parameters: [choice(choices: "${env.REVISION}", name: 'revision')]
println("选择回滚版本:${result}")
sh "helm rollback ${env.serviceName} ${result} -n ${env.buName}"
}
}
}
}
}
post {
always {
// clean workspace build
cleanWs()
}
success {
script {
// notice.dingTalkNotice("${env.dingTalkTokenCredentialsId}")
notice.dingTalkPluginNotice("${env.dingTalkRebotIdCredentialsId}")
}
}
failure {
script {
// notice.dingTalkNotice("${env.dingTalkTokenCredentialsId}")
notice.dingTalkPluginNotice("${env.dingTalkRebotIdCredentialsId}")
}
}
}
}