Class: Pixab::GitlabMR
- Inherits:
-
Object
- Object
- Pixab::GitlabMR
- Defined in:
- lib/gitlab/GitlabMR.rb
Instance Method Summary collapse
-
#create_merge_request(path, reviewers_ids) ⇒ Object
创建 Merge Request 方法.
-
#get_project_id ⇒ Object
获取项目 ID 方法.
-
#initialize(token) ⇒ GitlabMR
constructor
A new instance of GitlabMR.
- #run(path, reviewers_ids) ⇒ Object
Constructor Details
#initialize(token) ⇒ GitlabMR
Returns a new instance of GitlabMR.
12 13 14 |
# File 'lib/gitlab/GitlabMR.rb', line 12 def initialize(token) @token = token end |
Instance Method Details
#create_merge_request(path, reviewers_ids) ⇒ Object
创建 Merge Request 方法
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 |
# File 'lib/gitlab/GitlabMR.rb', line 28 def create_merge_request(path, reviewers_ids) # 获取项目 ID project_id = get_project_id if project_id.nil? return end # 获取 git 分支信息 git_repo_info = GitRepoInfo.new if git_repo_info.branch.nil? return end if git_repo_info.is_remote_branch_synced # 远程分支代码已经同步到远程目标分支,无需创建 Merge Request puts "#{File.basename(path)}:代码已同步。\n".green return end title = "Merge branch #{git_repo_info.branch} into #{git_repo_info.target_branch}." uri = URI("#{GitlabInfo::API_ENDPOINT}/projects/#{project_id}/merge_requests") # 构建 HTTP 请求 request = Net::HTTP::Post.new(uri) request['PRIVATE-TOKEN'] = @token request['Content-Type'] = 'application/json' body = { source_branch: git_repo_info.branch, target_branch: git_repo_info.target_branch, title: title, } if reviewers_ids.length > 0 body[:assignee_id] = reviewers_ids[0] end if reviewers_ids.length > 1 body[:reviewer_ids] = reviewers_ids[1..-1] end # 设置请求体 request.body = body.to_json # 发送请求 http = Net::HTTP.new(uri.hostname, uri.port) http.use_ssl = (uri.scheme == 'https') # 如果是 HTTPS,启用 SSL response = http.request(request) # 处理响应 if response.is_a?(Net::HTTPSuccess) puts "#{File.basename(path)}:MR已创建,#{JSON.parse(response.body)['web_url']}\n".green else puts "创建 Merge Request 失败!".red puts "错误信息: #{response.body}".red end end |
#get_project_id ⇒ Object
获取项目 ID 方法
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 |
# File 'lib/gitlab/GitlabMR.rb', line 89 def get_project_id git_url = `git remote get-url origin`.strip project_path = nil if git_url =~ %r{(?:https?:\/\/.*?\.com\/|git@.*?:)(.+?)(\.git)?$} project_path = $1 else puts "无法解析地址: #{git_url}".red end uri = URI("#{GitlabInfo::API_ENDPOINT}/projects/#{URI.encode_www_form_component(project_path)}") request = Net::HTTP::Get.new(uri) request['PRIVATE-TOKEN'] = @token http = Net::HTTP.new(uri.hostname, uri.port) http.use_ssl = (uri.scheme == 'https') # 如果是 HTTPS,启用 SSL response = http.request(request) if response.is_a?(Net::HTTPSuccess) data = JSON.parse(response.body) return data['id'] else puts "获取项目 ID 失败!错误信息: #{response.body}".red return nil end end |
#run(path, reviewers_ids) ⇒ Object
16 17 18 19 20 21 22 23 24 25 |
# File 'lib/gitlab/GitlabMR.rb', line 16 def run(path, reviewers_ids) unless Dir.exist?(path) puts "当前目录不存在: #{path}".red return end Dir.chdir(path) do create_merge_request(path, reviewers_ids) end end |