Jira自动化实践
Jira自动化实践
目录
[toc]
推荐文章
https:jenkins:2.346.3-2-lts-jdk11atlassian-jira-software-9.4.8-x64
- 实验软件
pipeline见正文。
==gitlab上模拟手动创建分支,提交代码==
- 创建
DEVOPS6-1
特性分支
提交一次代码。
- 创建版本分支
RELEASE-10.1.1
- 将特性分支合并到版本分支
这个是手动操作,接下来,我们就利用Jira,jenkins,gitlab来完成操作。
1、需求与代码关联
1.创建Jenkins作业并配置webhook
- 配置
Generic Webhook Trigger
webhookData: 这个变量存放的是Jira 传递的数据。
2.为Jira配置一个系统级别的webhook
选项解释:
- 指定Jenkins的webhook触发器地址;
- 通过JQL指定,允许devops6这个项目进行触发;
- 勾选动作,触发事件;(我在jira做了什么操作之后能够触发)
- 此时,我们来测试下
在jira上创建一个需求,看是否会触发jenkins作业?
可以看到jenkins作业被成功触发了。
我们再来打印下这个${webhookData}
变量:
编辑下pipeline代码,重新构建:
- 我们把json数据拿到在线json解析下
3.Jenkins流水线配置
- 解析Jira传递过来的数据;
groovy
webhookData =readJSON text:"${webhookData}"jiraEvent =webhookData.webhookEventjiraProjectName =webhookData.issue.fields.project.namegitlabProjects =[]gitlabBranchName =webhookData.issue.keygitlabGroupName =jiraProjectNamefor(i inwebhookData.issue.fields.components){gitlabProjects.add(i["name"])}currentBuild.description ="Trigger by ${jiraEvent} \nproject:${gitlabProjects} \nbranch:${gitlabBranchName}"
把此部分代码放到流水线里,重新构建下,可看到如下效果:
- 封装GitLab API接口
- Pipeline主程序
groovy
pipeline {agent {label "build"}stages{stage("Process"){steps{script{println(gitlabProjects)println(gitlabBranchName)projectIds =GetProjectsId(gitlabGroupName,gitlabProjects)switch(jiraEvent) {case"jira:issue_created":println(projectIds)for(id inprojectIds){CreateBranch(id,gitlabBranchName,"main")}breakdefault:println("error...")break}}}}}}
- 完整代码
groovy
webhookData =readJSON text:"${webhookData}"jiraEvent =webhookData.webhookEventjiraProjectName =webhookData.issue.fields.project.namegitlabProjects =[]gitlabBranchName =webhookData.issue.keygitlabGroupName =jiraProjectNamefor(i inwebhookData.issue.fields.components){gitlabProjects.add(i["name"])}currentBuild.description ="Trigger by ${jiraEvent} \nproject:${gitlabProjects} \nbranch:${gitlabBranchName}"pipeline {agent {label "build"}stages{stage("Process"){steps{script{println(gitlabProjects)println(gitlabBranchName)projectIds =GetProjectsId(gitlabGroupName,gitlabProjects)switch(jiraEvent) {case"jira:issue_created":println(projectIds)for(id inprojectIds){CreateBranch(id,gitlabBranchName,"main")}breakdefault:println("error...")break}}}}}}defCreateBranch(projectId,newBranchName,sourceBranchName){try{apiUrl ="projects/${projectId}/repository/branches?branch=${newBranchName}&ref=${sourceBranchName}"response =HttpReq('POST',apiUrl,"")}catch(Exceptione) {println(e)}}defGetProjectsId(gitlabGroupName,gitlabProjects){gitlabProjectIds =[]for(project ingitlabProjects){id =GetProjectId(gitlabGroupName,project)println(id)if(id !=0){gitlabProjectIds.add(id)}}returngitlabProjectIds}defGetProjectId(groupName,projectName){apiUrl ="projects?search=${projectName}"response =HttpReq('GET',apiUrl,"")response =readJSON text:response.content -"\n"if(response.size() >1){for(i inresponse){println(i["path_with_namespace"])println(groupName +projectName)if(i["path_with_namespace"] =="${groupName}/${projectName}"){println(i["id"])returni["id"]}}} else{returnresponse[0]["id"]}}defHttpReq(reqType,reqUrl,reqBody){defgitServer ="http:withCredentials([string(credentialsId:'5782c77d-ce9d-44e5-b9ba-1ba2097fc31d',variable:'GITLABTOKEN')]) {response =httpRequest acceptType:'APPLICATION_JSON_UTF8',consoleLogResponseBody:true,contentType:'APPLICATION_JSON_UTF8',customHeaders:[[maskValue:false,name:'PRIVATE-TOKEN',value:"${GITLABTOKEN}"]],httpMode:"${reqType}",url:"${gitServer}/${reqUrl}",wrapAsMultipart:false,requestBody:"${reqBody}"}returnresponse}
将次代码放到pipeline里。
4.效果验证
- 在Jira里面创建一个issue,关联 项目;
- Jenkins 流水线运行;
- 验证Gitlab中多了分支;
符合预期。
2、代码自动化合并
1. 更新配置Jira Webhook
2. Issue关联版本
- 这里有2个待关联版本的问题
- 创建
11.1.1
发布版本
同时可以看下devops6-maven-service
仓库是没有这个11.1.1
版本分支的。
3. Jenkins Pipeline
- 分析Jira Webhook传递的数据
groovy
jira event:webhookEvent:jira:issue_updatedargs:1. gitlab 项目名称 issue.fields.components []2. 分支名称 issue.key3. gitlab 项目组名称 issue.fields.project.name4. fixversion 版本分支 issue.fields.fixVersions []action:1.根据项目名称获取项目的id;2.根据项目id,基于master分支创建一个版本分支;3.根据fixversion, 拿到所有的特性分支;4.根据项目id,将该项目的特性分支合并版本分支;
- 编写Jenkinsfile
groovy
webhookData =readJSON text:"${webhookData}"jiraEvent =webhookData.webhookEventjiraProjectName =webhookData.issue.fields.project.namegitlabProjects =[]gitlabBranchName =webhookData.issue.keygitlabGroupName =jiraProjectNamefor(i inwebhookData.issue.fields.components){gitlabProjects.add(i["name"])}currentBuild.description ="Trigger by ${jiraEvent} \nproject:${gitlabProjects} \nbranch:${gitlabBranchName}"pipeline {agent {label "build"}stages{stage("Process"){steps{script{println(gitlabProjects)println(gitlabBranchName)projectIds =GetProjectsId(gitlabGroupName,gitlabProjects)switch(jiraEvent) {case"jira:issue_created":println(projectIds)for(id inprojectIds){CreateBranch(id,gitlabBranchName,"main")}breakcase"jira:issue_updated":if(webhookData.issue.fields.fixVersions.size() >=1){jiraFixVersion =webhookData.issue.fields.fixVersions[0]["name"]issues =GetIssuesByFixVersion(jiraProjectName,jiraFixVersion)for(id inprojectIds){CreateBranch(id,"RELEASE-${jiraFixVersion}","master") for(issue inissues) {CreateMergeRequest(id,issue,"RELEASE-${jiraFixVersion}")} }break}default:println("error...")break}}}}}}defCreateMergeRequest(projectId,sourceBranch,targetBranch){try{apiUrl ="projects/${projectId}/merge_requests"reqBody ="""{"source_branch":"${sourceBranch}","target_branch":"${targetBranch}","title":"${sourceBranch}>>>${targetBranch}byJenkins"}"""println(reqBody)response =HttpReq('POST',apiUrl,reqBody)}catch(Exceptione) {println(e)}}defGetIssuesByFixVersion(projectName,fixVersion){jql ="project%20=%20${projectName}%20AND%20fixVersion%20=%20${fixVersion}"response =sh returnStdout:true,script:"""curl \-u admin:Admin@123 \-H "Content-Type:application/json"\--request GET "http:"""response =readJSON text:"""${response - "\n"} """issues =[]for(i inresponse["issues"]){issues.add(i["key"])}returnissues}defCreateBranch(projectId,newBranchName,sourceBranchName){try{apiUrl ="projects/${projectId}/repository/branches?branch=${newBranchName}&ref=${sourceBranchName}"response =HttpReq('POST',apiUrl,"")}catch(Exceptione) {println(e)}}defGetProjectsId(gitlabGroupName,gitlabProjects){gitlabProjectIds =[]for(project ingitlabProjects){id =GetProjectId(gitlabGroupName,project)println(id)if(id !=0){gitlabProjectIds.add(id)}}returngitlabProjectIds}defGetProjectId(groupName,projectName){apiUrl ="projects?search=${projectName}"response =HttpReq('GET',apiUrl,"")response =readJSON text:response.content -"\n"if(response.size() >1){for(i inresponse){println(i["path_with_namespace"])println(groupName +projectName)if(i["path_with_namespace"] =="${groupName}/${projectName}"){println(i["id"])returni["id"]}}} else{returnresponse[0]["id"]}}defHttpReq(reqType,reqUrl,reqBody){defgitServer ="http:withCredentials([string(credentialsId:'5782c77d-ce9d-44e5-b9ba-1ba2097fc31d',variable:'GITLABTOKEN')]) {response =httpRequest acceptType:'APPLICATION_JSON_UTF8',consoleLogResponseBody:true,contentType:'APPLICATION_JSON_UTF8',customHeaders:[[maskValue:false,name:'PRIVATE-TOKEN',value:"${GITLABTOKEN}"]],httpMode:"${reqType}",url:"${gitServer}/${reqUrl}",wrapAsMultipart:false,requestBody:"${reqBody}"}returnresponse}
4. 效果验证
- jira上关联问题到发布版本
可以看到触发了jenkins流水线:
gitlab上也能看到有mr请求了:
jira付费插件也能支持这样的效果。
测试结束。😘
FAQ
ones
关于我
我的博客主旨:
- 排版美观,语言精炼;
- 文档即手册,步骤明细,拒绝埋坑,提供源码;
- 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!
🍀 微信二维码 x2675263825 (舍得), qq:2675263825。
🍀 微信公众号 《云原生架构师实战》
🍀 语雀