require 'KCommercialPipeline/core/change_log/doc_builder' require 'KCommercialPipeline/core/git' require 'git' require 'uri' # 版本change log; 受限于doc api 内容大小、频率等限制;每个版本增加一个doc; # 整体流程获取tag查找最新的两个tag比对出commit -->获取token -->创建doc-->根据commit信息一个commit发起一次编辑文档请求; # 文档生成地址 https://docs.corp.kuaishou.com/k/home/VEH16BgYm-i8/fcACQuPoTP6FiHYcHBONdL0MF module KCommercial module KCPipeline class ChangeLogTask def init # 文档父视图 https://docs.corp.kuaishou.com/k/home/VEH16BgYm-i8/fcACQuPoTP6FiHYcHBONdL0MF $parent_view_id = KimConfig.configs["change_log"]["doc_parent_view_id"] $app_key = KimConfig.configs["change_log"]["app_key"] $secret_key = KimConfig.configs["change_log"]["secret_key"] @access_token = "" @doc_version = -1 end def run init prepare send end def send index = 1 @request_body_list.each { |i| begin t = Thread.new { @access_token = "" @doc_version = -1 get_access_token get_doc_version if @access_token.empty? || @doc_version < 0 exit(-1) else puts "send_change_log #{@doc_id}, #{@access_token}, #{@doc_version}" send_change_log(i) # sleep(0.05) index += 1 end } t.join end } end def send_change_log(doc) doc["docId"] = @doc_id doc["version"] = @doc_version # url = "https://is-gateway.corp.kuaishou.com/merlot/e/api/docs/edit" url = KimConfig.configs["change_log"]["edit_doc_url"] RestClient::Request.new({ method: :post, url: url, headers: get_net_header, payload: doc.to_json }).execute do |response| puts "response==#{response}" puts "doc==#{doc.to_json}" case response.code when 400 [:error, JSON.parse(response.to_str)] when 200 [:success, JSON.parse(response.to_str)] else fail "Invalid response #{response.to_str} received." end end end def get_net_header { "Content-Type" => "application/json", "appKey" => $app_key, "secretKey" => $secret_key, "Authorization" => "Bearer #{@access_token}" } end def doc_builder diffs = KCBranchDiffs.new(@new_branch, @old_branch, "tag").diffs puts diffs puts '---------------------' #读取配置正则 regular = KimConfig.configs["change_log"]["commit_regular"] puts "#{regular}" unless regular.size > 0 regular = "^(\\[[a-zA-Z0-9]+\\])?feat(\\(.*\\))?:.*" end diffs = diffs.find_all { |c| c.message =~ /#{regular}/ } puts diffs @request_body_list = [] unless diffs.empty? index = diffs.size diffs.each do |c| doc_commit_author(c) doc_commit_id(c) doc_commit_data(c) doc_commit_msg(c, index) index = index - 1 end title_doc = DocBuilder.build_doc title_list_element = DocBuilder.build_paragraph_element_list title_list_element["paragraphElementList"].push(DocBuilder.build_doc_version(@version)) title_list_element["paragraphElementList"].push(DocBuilder.build_doc_paragraph) # title_list_element["paragraphElementList"].push(DocBuilder.build_doc_paragraph) puts title_list_element.to_json title_doc["editRequestList"].push(title_list_element.to_json) @request_body_list.push(title_doc) end end def doc_commit_author(c) content_doc = DocBuilder.build_doc content_list_element = DocBuilder.build_paragraph_element_list content_list_element["paragraphElementList"].push(DocBuilder.build_doc_changes("author : #{c.author.author || ""}")) # content_list_element["paragraphElementList"].push(DocBuilder.build_doc_paragraph) content_doc["editRequestList"].push(content_list_element.to_json) @request_body_list.push(content_doc) end def doc_commit_id(c) content_doc = DocBuilder.build_doc content_list_element = DocBuilder.build_paragraph_element_list content_list_element["paragraphElementList"].push(DocBuilder.build_doc_changes("commit:#{c.ori_commit_id || ""}")) # content_list_element["paragraphElementList"].push(DocBuilder.build_doc_paragraph) content_doc["editRequestList"].push(content_list_element.to_json) @request_body_list.push(content_doc) end def doc_commit_data(c) content_doc = DocBuilder.build_doc content_list_element = DocBuilder.build_paragraph_element_list content_list_element["paragraphElementList"].push(DocBuilder.build_doc_changes("date:#{c.date || ""}")) # content_list_element["paragraphElementList"].push(DocBuilder.build_doc_paragraph) content_doc["editRequestList"].push(content_list_element.to_json) @request_body_list.push(content_doc) end def doc_commit_msg(c, index) content_doc = DocBuilder.build_doc content_list_element = DocBuilder.build_paragraph_element_list content_list_element["paragraphElementList"].push(DocBuilder.build_doc_title("#{index}、#{c.message.split("\n")[0] || ""}")) # content_list_element["paragraphElementList"].push(DocBuilder.build_doc_paragraph) content_doc["editRequestList"].push(content_list_element.to_json) @request_body_list.push(content_doc) end # def prepare find_diff_branch doc_builder get_access_token create_doc end def create_doc unless @request_body_list.empty? puts "create_doc #{@access_token}" if @access_token.empty? puts "access_token 获取失败" exit(-1) end # url = "https://is-gateway.corp.kuaishou.com/merlot/e/api/docs/create" url = KimConfig.configs["change_log"]["create_doc_url"] puts url body = { "docTypeEn": "doc", "docName": @version, "docDesc": "#{@version} change log", "knowLink": 3, "parentViewStrId": $parent_view_id, "shareDetail": [ { "uid": "liuxiaoliang", "accessLevelEn": "write" } ] } RestClient::Request.new({ method: :post, url: url, headers: get_net_header, payload: body.to_json }).execute do |response| puts "response==#{response}" case response.code when 400 [:error, JSON.parse(response.to_str)] when 200 json = JSON.parse(response.to_str) code = json["code"] if code == 0 doc_id = json["result"]["docId"] || "" if doc_id.empty? [:error, JSON.parse(response.to_str)] else @doc_id = doc_id [:success, JSON.parse(response.to_str)] end else [:error, JSON.parse(response.to_str)] end else fail "Invalid response #{response.to_str} received." end end end end def get_doc_version puts "get_doc_version docId: #{@doc_id}, access_token: #{@access_token}" if @doc_id.empty? return end # url = "https://is-gateway.corp.kuaishou.com/merlot/e/api/docs/get-rich-content?docId=#{@doc_id}&version=-1" url = "#{KimConfig.configs["change_log"]["get_doc_version_url"]}?docId=#{@doc_id}&version=-1" puts url RestClient::Request.new({ method: :get, url: url, headers: get_net_header }).execute do |response| puts "response==#{response}" case response.code when 400 [:error, JSON.parse(response.to_str)] when 200 json = JSON.parse(response.to_str) code = json["code"] if code == 0 doc_version = json["result"]["version"] || -1 if doc_version < 0 [:error, JSON.parse(response.to_str)] else @doc_version = doc_version puts "docId : #{@doc_id}, docVersion : #{@doc_version}" [:success, JSON.parse(response.to_str)] end else [:error, JSON.parse(response.to_str)] end else fail "Invalid response #{response.to_str} received." end end end def get_access_token puts "get_access_token" # url = "https://is-gateway.corp.kuaishou.com/token/get?appKey=#{$app_key}&secretKey=#{$secret_key}" url = "#{KimConfig.configs["change_log"]["get_access_token_url"]}?appKey=#{$app_key}&secretKey=#{$secret_key}" puts url RestClient::Request.new({ method: :get, url: url, }).execute do |response| puts "response==#{response}" case response.code when 400 [:error, JSON.parse(response.to_str)] when 200 json = JSON.parse(response.to_str) code = json["code"] if code == 0 access_token = json["result"]["accessToken"] if access_token.empty? [:error, JSON.parse(response.to_str)] else @access_token = access_token [:success, JSON.parse(response.to_str)] end else [:error, JSON.parse(response.to_str)] end else fail "Invalid response #{response.to_str} received." end end end def find_diff_branch reg = Regexp.new('^oversea/V\d(\d)?.\d(\d)?.\d(\d)?$') all_b = KCGit::git.lib.tags.find_all { |b| b =~ reg } all_tag = all_b.map do |b| if b.is_a? Array ReleaseBranch.new(b[0]) elsif b.is_a? String ReleaseBranch.new(b) end end branch_list = all_tag.sort_by { |v| version = v.name.gsub("oversea/V", "").split(".") version[0] * 1000 + version[1] * 100 + version[2] } if branch_list.size >= 2 last_branch = branch_list[-1] new_branch = last_branch.name || "" old_branch = branch_list[branch_list.size - 2].name || "" if new_branch != "" || old_branch != "" puts "最新tag: #{new_branch}" puts "上次tag: #{old_branch}" @new_branch = new_branch @old_branch = old_branch @version = new_branch.gsub("oversea/V", "") else exit -1 end end end end end end