1. #!groovy
    2. @Library('jenkinslibrary@master') _
    3. //func from shareibrary
    4. def build = new org.devops.build()
    5. def deploy = new org.devops.deploy()
    6. def tools = new org.devops.tools()
    7. def gitlab = new org.devops.gitlab()
    8. def toemail = new org.devops.toemail()
    9. def sonar = new org.devops.sonarqube()
    10. def sonarapi = new org.devops.sonarapi()
    11. def nexus = new org.devops.nexus()
    12. def artifactory = new org.devops.artifactory()
    13. def k8s = new org.devops.kubernetes()
    14. def runOpts
    15. //env
    16. String buildType = "${env.buildType}"
    17. String buildShell = "${env.buildShell}"
    18. String deployHosts = "${env.deployHosts}"
    19. String srcUrl = "${env.srcUrl}"
    20. String branchName = "${env.branchName}"
    21. String artifactUrl = "${env.artifactUrl}"
    22. if ("${runOpts}" == "GitlabPush"){
    23. branchName = branch - "refs/heads/"
    24. currentBuild.description = "Trigger by ${userName} ${branch}"
    25. gitlab.ChangeCommitStatus(projectId,commitSha,"running")
    26. env.runOpts = "GitlabPush"
    27. } else {
    28. userEmail = "2560350642@qq.com"
    29. }
    30. //pipeline
    31. pipeline{
    32. agent { node { label "build"}}
    33. stages{
    34. stage("GetCode"){
    35. steps{
    36. script{
    37. println("${branchName}")
    38. tools.PrintMes("获取代码","green")
    39. checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]],
    40. doGenerateSubmoduleConfigurations: false,
    41. extensions: [],
    42. submoduleCfg: [],
    43. userRemoteConfigs: [[credentialsId: 'gitlab-admin-user', url: "${srcUrl}"]]])
    44. }
    45. }
    46. }
    47. stage("Build&Test"){
    48. steps{
    49. script{
    50. tools.PrintMes("执行打包","green")
    51. artifactory.main(buildType,buildShell)
    52. artifactory.PushArtifact()
    53. //deploy.SaltDeploy("${deployHosts}","test.ping")
    54. //deploy.AnsibleDeploy("${deployHosts}","-m ping ")
    55. }
    56. }
    57. }
    58. //并行
    59. stage('parallel01') {
    60. parallel {
    61. stage("QA"){
    62. steps {
    63. script{
    64. tools.PrintMes("搜索项目","green")
    65. result = sonarapi.SerarchProject("${JOB_NAME}")
    66. println(result)
    67. if (result == "false"){
    68. println("${JOB_NAME}---项目不存在,准备创建项目---> ${JOB_NAME}!")
    69. sonarapi.CreateProject("${JOB_NAME}")
    70. } else {
    71. println("${JOB_NAME}---项目已存在!")
    72. }
    73. tools.PrintMes("配置项目质量规则","green")
    74. qpName="${JOB_NAME}".split("-")[0] //Sonar%20way
    75. sonarapi.ConfigQualityProfiles("${JOB_NAME}","java",qpName)
    76. tools.PrintMes("配置质量阈","green")
    77. sonarapi.ConfigQualityGates("${JOB_NAME}",qpName)
    78. tools.PrintMes("代码扫描","green")
    79. sonar.SonarScan("test","${JOB_NAME}","${JOB_NAME}","src","${branchName}")
    80. sleep 30
    81. tools.PrintMes("获取扫描结果","green")
    82. result = sonarapi.GetProjectStatus("${JOB_NAME}")
    83. println(result)
    84. if (result.toString() == "ERROR"){
    85. toemail.Email("代码质量阈错误!请及时修复!",userEmail)
    86. error " 代码质量阈错误!请及时修复!"
    87. } else {
    88. println(result)
    89. }
    90. }
    91. }
    92. }
    93. //构建镜像
    94. stage("BuildImages"){
    95. steps{
    96. script{
    97. tools.PrintMes("构建上传镜像","green")
    98. env.serviceName = "${JOB_NAME}".split("_")[0]
    99. withCredentials([usernamePassword(credentialsId: 'aliyun-registry-admin', passwordVariable: 'password', usernameVariable: 'username')]) {
    100. env.dockerImage = "registry.cn-beijing.aliyuncs.com/devopstest/${serviceName}:${branchName}"
    101. sh """
    102. docker login -u ${username} -p ${password} registry.cn-beijing.aliyuncs.com
    103. docker build -t registry.cn-beijing.aliyuncs.com/devopstest/${serviceName}:${branchName} .
    104. sleep 1
    105. docker push registry.cn-beijing.aliyuncs.com/devopstest/${serviceName}:${branchName}
    106. sleep 1
    107. #docker rmi registry.cn-beijing.aliyuncs.com/devopstest/${serviceName}:${branchName}
    108. """
    109. }
    110. }
    111. }
    112. }
    113. }
    114. }
    115. //发布
    116. stage("Deploy"){
    117. steps{
    118. script{
    119. tools.PrintMes("发布应用","green")
    120. //下载版本库文件
    121. releaseVersion = "${branchName}".split("-")[-1]
    122. response = gitlab.GetRepoFile(7,"demo-uat%2f${releaseVersion}-uat.yaml")
    123. //println(response)
    124. //替换文件中内容(镜像)
    125. fileData = readYaml text: """${response}"""
    126. println(fileData["spec"]["template"]["spec"]["containers"][0]["image"])
    127. println(fileData["metadata"]["resourceVersion"])
    128. oldImage = fileData["spec"]["template"]["spec"]["containers"][0]["image"]
    129. oldVersion = fileData["metadata"]["resourceVersion"]
    130. oldUid = fileData["metadata"]["uid"]
    131. response = response.replace(oldImage,dockerImage)
    132. response = response.replace(oldVersion,"")
    133. response = response.replace(oldUid,"")
    134. println(response)
    135. //更新gitlab文件内容
    136. base64Content = response.bytes.encodeBase64().toString()
    137. gitlab.UpdateRepoFile(7,"demo-uat%2f${releaseVersion}-uat.yaml",base64Content)
    138. //发布kubernetes
    139. k8s.UpdateDeployment("demo-uat","demoapp",response)
    140. }
    141. }
    142. }
    143. //接口自动化测试
    144. stage("InterfaceTest"){
    145. steps{
    146. script{
    147. tools.PrintMes("接口测试","green")
    148. }
    149. }
    150. }
    151. }
    152. post {
    153. always{
    154. script{
    155. println("always")
    156. }
    157. }
    158. success{
    159. script{
    160. println("success")
    161. if ("${runOpts}" == "GitlabPush"){
    162. gitlab.ChangeCommitStatus(projectId,commitSha,"success")
    163. }
    164. toemail.Email("流水线成功",userEmail)
    165. }
    166. }
    167. failure{
    168. script{
    169. println("failure")
    170. if ("${runOpts}" == "GitlabPush"){
    171. gitlab.ChangeCommitStatus(projectId,commitSha,"failed")
    172. }
    173. toemail.Email("流水线失败了!",userEmail)
    174. }
    175. }
    176. aborted{
    177. script{
    178. println("aborted")
    179. if ("${runOpts}" == "GitlabPush"){
    180. gitlab.ChangeCommitStatus(projectId,commitSha,"canceled")
    181. }
    182. toemail.Email("流水线被取消了!",userEmail)
    183. }
    184. }
    185. }
    186. }