中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微服務需求與代碼管理的方法是什么

發布時間:2021-10-26 09:27:47 來源:億速云 閱讀:146 作者:iii 欄目:web開發

這篇文章主要介紹“微服務需求與代碼管理的方法是什么”,在日常操作中,相信很多人在微服務需求與代碼管理的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”微服務需求與代碼管理的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

業務的簡稱為demo,微服務架構。N多個微服務。服務命名:業務簡稱-應用名稱-類型(demo-hello-service)。特性分支開發,版本分支發布。每個需求(任務/故事)對應一個特性分支。每個發布(release)對應一個版本分支。

1.需求與代碼管理
Jira作為需求和缺陷管理,采用Scrum開發方法,jira中的項目名稱與業務簡稱一致(demo)。Gitlab作為版本控制系統,每個Group對應一個業務,每個微服務對應一個代碼庫。

微服務需求與代碼管理的方法是什么

需求與代碼關聯:在jira中創建一個任務/故事,關聯模塊后自動在該模塊創建一個以ISSUE(任務/故事)ID的特性分支。此時的模塊等同于每個微服務的項目(代碼庫)名稱。以下面圖中為例:我們在demo項目中創建了一個模塊demo-hello-service,其實對應的就是Gitlab代碼庫中demo組的demo-hello-service服務。

微服務需求與代碼管理的方法是什么

特性分支:創建好每個模塊后,就可以實現需求與代碼關聯。例如:我們在Jira項目demo中創建一個問題,類型為故事(不受限制可為其他),重點是需要將改故事關聯到模塊(只有關聯到模塊,我們才能通過接口得知哪個問題關聯的哪個代碼庫)。

微服務需求與代碼管理的方法是什么

版本分支:當特性分支開發完成以及測試驗證完成后,基于主干分支創建一個版本分支,然后將所有的特性分支合并到版本分支。此時可以通過Jira中創建一個發布版本,然后問題關聯發布版本(此動作表示該特性分支已經通過驗證,可以合并)。自動完成版本分支的創建和特性分支到版本分支的合并請求。

微服務需求與代碼管理的方法是什么

2. 配置過程
需求與代碼庫關聯,主要用到的工具鏈為: Jira + GitLab + Jenkins。Jira負責創建需求,配置webhook。Jenkins負責接收Jira webhook請求,然后通過接口實現GitLab項目分支創建。

特性分支自動化:當我們在jira上面創建了問題,此時會通過Jira的webhook觸發對應的Jenkins作業,該Jenkins作業通過解析Jira webhook傳遞的數據,找到問題名稱和模塊名稱。調用GitlabAPI 項目查詢接口,根據模塊名稱找到代碼庫。調用GitLabAPI 分支創建接口,根據問題名稱基于主干分支創建一個特性分支。任務結束。

版本分支自動化:Jira創建發布版本,Issue關聯版本。自動在gitlab代碼庫基于master創建版本分支,并開啟特性分支到版本分支的合并請求。

2.1 準備工作
在Jenkins, 創建一個Pipeline 作業并配置GenericTrigger 觸發器,接收JiraWebhook數據。projectKey 參數表示Jira項目名稱,webHookData 參數為Jira  webhook的所有數據。token 是觸發器的觸發token,這里默認采用的作業名稱(作業名稱要唯一)。

triggers {         GenericTrigger( causeString: 'Trigger By Jira Server -->>>>> Generic Cause',                          genericRequestVariables: [[key: 'projectKey', regexpFilter: '']],                          genericVariables: [[defaultValue: '', key: 'webHookData', regexpFilter: '', value: '$']],                          printContributedVariables: true,                          printPostContent: true,                          regexpFilterExpression: '',                          regexpFilterText: '',                          silentResponse: true,                          token: "${JOB_NAME}"         )

在Jira項目中配置Webhook,勾選觸發事件填寫觸發URL。http://jenkins.idevops.site/generic-webhook-trigger/invoke?token=demo-jira-service&projectKey=${project.key}  (這個地址是jenkins Generictrigger生成的,這里不做過多的介紹)

微服務需求與代碼管理的方法是什么

Jira webhook數據參考, 這些參數可以在Jenkinsfile中通過readJSON格式化,然后獲取值。

response = readJSON text: """${webHookData}""" println(response)  //獲取webhook的事件類型 env.eventType = response["webhookEvent"]
{     "timestamp":1603087582648,     "webhookEvent":"jira:issue_created",     "issue_event_type_name":"issue_created",     "user":Object{...},     "issue":{         "id":"10500",         "self":"http://192.168.1.200:8050/rest/api/2/issue/10500",         "key":"DEMO-2",         "fields":{             "issuetype":{                 "self":"http://192.168.1.200:8050/rest/api/2/issuetype/10001",                 "id":"10001",                 "description":"",                 "iconUrl":"http://192.168.1.200:8050/images/icons/issuetypes/story.svg",                 "name":"故事",                 "subtask":false             },             "components":[                 {                     "self":"http://192.168.1.200:8050/rest/api/2/component/10200",                     "id":"10200",                     "name":"demo-hello-service",                     "description":"demo-hello-service應用"                 }             ],             "timespent":null,             "timeoriginalestimate":null,             "description":null,             ...             ...             ...

2.2 封裝GitLab接口
Gitlab接口文檔:https://docs.gitlab.com/ce/api/README.html

共享庫:src/org/devops/gitlab.groovy

package org.devops  //封裝HTTP請求 def HttpReq(reqType,reqUrl,reqBody){     def gitServer = "http://gitlab.idevops.site/api/v4"     withCredentials([string(credentialsId: 'gitlab-token', variable: 'gitlabToken')]) {       result = httpRequest customHeaders: [[maskValue: true, name: 'PRIVATE-TOKEN', value: "${gitlabToken}"]],                  httpMode: reqType,                  contentType: "APPLICATION_JSON",                 consoleLogResponseBody: true,                 ignoreSslErrors: true,                  requestBody: reqBody,                 url: "${gitServer}/${reqUrl}"                 //quiet: true     }     return result }   //更新文件內容 def UpdateRepoFile(projectId,filePath,fileContent){     apiUrl = "projects/${projectId}/repository/files/${filePath}"     reqBody = """{"branch": "master","encoding":"base64", "content": "${fileContent}", "commit_message": "update a new file"}"""     response = HttpReq('PUT',apiUrl,reqBody)     println(response)  }  //獲取文件內容 def GetRepoFile(projectId,filePath){     apiUrl = "projects/${projectId}/repository/files/${filePath}/raw?ref=master"     response = HttpReq('GET',apiUrl,'')     return response.content }  //創建倉庫文件 def CreateRepoFile(projectId,filePath,fileContent){     apiUrl = "projects/${projectId}/repository/files/${filePath}"     reqBody = """{"branch": "master","encoding":"base64", "content": "${fileContent}", "commit_message": "create a new file"}"""     response = HttpReq('POST',apiUrl,reqBody)     println(response) }   //更改提交狀態 def ChangeCommitStatus(projectId,commitSha,status){     commitApi = "projects/${projectId}/statuses/${commitSha}?state=${status}"     response = HttpReq('POST',commitApi,'')     println(response)     return response }  //獲取項目ID def GetProjectID(repoName='',projectName){     projectApi = "projects?search=${projectName}"     response = HttpReq('GET',projectApi,'')     def result = readJSON text: """${response.content}"""          for (repo in result){        // println(repo['path_with_namespace'])         if (repo['path'] == "${projectName}"){                          repoId = repo['id']             println(repoId)         }     }     return repoId }  //刪除分支 def DeleteBranch(projectId,branchName){     apiUrl = "/projects/${projectId}/repository/branches/${branchName}"     response = HttpReq("DELETE",apiUrl,'').content     println(response) }  //創建分支 def CreateBranch(projectId,refBranch,newBranch){     try {         branchApi = "projects/${projectId}/repository/branches?branch=${newBranch}&ref=${refBranch}"         response = HttpReq("POST",branchApi,'').content         branchInfo = readJSON text: """${response}"""     } catch(e){         println(e)     }  //println(branchInfo) }  //創建合并請求 def CreateMr(projectId,sourceBranch,targetBranch,title,assigneeUser=""){     try {         def mrUrl = "projects/${projectId}/merge_requests"         def reqBody = """{"source_branch":"${sourceBranch}", "target_branch": "${targetBranch}","title":"${title}","assignee_id":"${assigneeUser}"}"""         response = HttpReq("POST",mrUrl,reqBody).content         return response     } catch(e){         println(e)     } }  //搜索分支 def SearchProjectBranches(projectId,searchKey){     def branchUrl =  "projects/${projectId}/repository/branches?search=${searchKey}"     response = HttpReq("GET",branchUrl,'').content     def branchInfo = readJSON text: """${response}"""          def branches = [:]     branches[projectId] = []     if(branchInfo.size() ==0){         return branches     } else {         for (branch in branchInfo){             //println(branch)             branches[projectId] += ["branchName":branch["name"],                                     "commitMes":branch["commit"]["message"],                                     "commitId":branch["commit"]["id"],                                     "merged": branch["merged"],                                     "createTime": branch["commit"]["created_at"]]         }         return branches     } }  //允許合并 def AcceptMr(projectId,mergeId){     def apiUrl = "projects/${projectId}/merge_requests/${mergeId}/merge"     HttpReq('PUT',apiUrl,'') }

2.3 共享庫配置

微服務需求與代碼管理的方法是什么

到此,關于“微服務需求與代碼管理的方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥德县| 湘阴县| 循化| 微山县| 和田市| 吉林省| 攀枝花市| 获嘉县| 枣阳市| 虹口区| 宁武县| 高碑店市| 怀安县| 乌海市| 卓资县| 奉化市| 文水县| 新晃| 西藏| 左贡县| 青州市| 高平市| 兰坪| 天柱县| 汝南县| 突泉县| 开江县| 汨罗市| 安多县| 招远市| 龙口市| 镇远县| 施秉县| 眉山市| 若羌县| 吴忠市| 积石山| 山东省| 溧水县| 光泽县| 稷山县|