# Gitlab5.3 API操作接口 # Add by nwb # 暂时没支持SSH # 接口通过HTTP协议与服务器交互,理论上只要能安装gitlab的操作系统本接口都能支持 # 本机的测试环境是Ubuntu 12.04 module GitlabHelper # gitlab版本库数据本地保存的根目录 ROOT_PATH="/home/git/repositories/" PROJECT_PATH_CUT = 40 # gitlab版本库所在服务器 # 注意REPO_IP_ADDRESS必须以http://开头,暂时只支持HTTP协议,未支持SSH #REPO_IP_ADDRESS = "http://" + Setting.repository_domain REPO_IP_ADDRESS = "http://192.168.137.100" GITLAB_API = "/api/v3" # 用户在项目中的权限级别 GUEST = 10 REPORTER = 20 DEVELOPER = 30 MASTER = 40 # gitlab的登录验证信息 # add by nwb def self.gitlab_token=(token) Thread.current[:gitlab_token] = token end # gitlab的登录验证信息 # add by nwb def self.gitlab_token Thread.current[:gitlab_token] ||= nil end # 登录gitlab # add by nwb def login_gitlab(email,password) url = REPO_IP_ADDRESS + GITLAB_API + "/session" uri = URI.parse(url) data = {email:email, password:password} begin res = Net::HTTP.post_form(uri, data) if res.code == '201' temp = ActiveSupport::JSON.decode(res.body) GitlabHelper.gitlab_token= temp['private_token'] return true else return false end rescue =>err return false end end # 创建项目 # add by nwb def create_project(project_name) url = REPO_IP_ADDRESS + GITLAB_API + "/projects" uri = URI.parse(url) data = {name:project_name, private_token:GitlabHelper.gitlab_token} begin res = Net::HTTP.post_form(uri, data) if res.code == '201' temp = ActiveSupport::JSON.decode(res.body) #新创建项目的版本库地址 respo = temp['http_url_to_repo'] respo['http://localhost'] = REPO_IP_ADDRESS # 新创建项目的web地址 webaddress = temp['web_url'] webaddress['http://localhost'] = REPO_IP_ADDRESS return true else return false end rescue =>err return false end end # 为指定用户创建版本库 # project_name:版本库名称 user_id:Gitlab版本库中的用户编号 # add by nwb def create_project_for_user(project_name,user_id) url = REPO_IP_ADDRESS + GITLAB_API + "/projects/user/" + user_id uri = URI.parse(url) data = {user_id:user_id, name:project_name,private_token:GitlabHelper.gitlab_token} begin res = Net::HTTP.post_form(uri, data) if res.code == '201' temp = ActiveSupport::JSON.decode(res.body) #新创建项目的版本库地址 respo = temp['http_url_to_repo'] respo['http://localhost'] = REPO_IP_ADDRESS # 新创建项目的web地址 webaddress = temp['web_url'] webaddress['http://localhost'] = REPO_IP_ADDRESS return true else return false end rescue =>err return false end end # 创建用户 # loginname:登录名称(版本库路径包含) name:用户姓名 # add by nwb def create_user (loginname,name,password,email) url = REPO_IP_ADDRESS + GITLAB_API + "/users" uri = URI.parse(url) data = {email:email,password:password,username:loginname, name:name, private_token:GitlabHelper.gitlab_token} begin res = Net::HTTP.post_form(uri, data) if res.code == '201' temp = ActiveSupport::JSON.decode(res.body) #新创建的gitlab用户编号(需保存) user_id = temp['id'] return true else return false end rescue =>err return false end end # 删除用户 # user_id:用户在gitlab中的id # add by nwb def delete_user(user_id) url = REPO_IP_ADDRESS + GITLAB_API + "/users/" + user_id uri = URI.parse(url) data = {id:user_id,private_token:GitlabHelper.gitlab_token} http = Net::HTTP.new uri.host, uri.port begin req = Net::HTTP::Delete.new(uri.request_uri) req.form_data = data res= http.start { |http| http.request req } if res.code == '200' temp = ActiveSupport::JSON.decode(res.body) # 删除成功,对应更新trustie用户的gitlab用户编号 return true else return false end rescue =>err return false end end # 给用户添加一个可操作的项目 # 若用户已在该项目中,权限级别取新权限与现有权限的最大值 # project_id:项目在gitlab中的id user_id:用户在gitlab中的id # access_level为用户在项目中的权限级别,对应如下: #GUEST = 10 #REPORTER = 20 #DEVELOPER = 30 #MASTER = 40 # add by nwb def add_user_to_project(project_id,user_id,access_level) url = REPO_IP_ADDRESS + GITLAB_API + "/projects/" + project_id +"/members" uri = URI.parse(url) data = {id:project_id,user_id:user_id,access_level:access_level, private_token:GitlabHelper.gitlab_token} begin res = Net::HTTP.post_form(uri, data) if res.code == '201' temp = ActiveSupport::JSON.decode(res.body) return true else return false end rescue =>err return false end end # 从项目中删除用户 # project_id:项目在gitlab中的ids user_id:用户在gitlab中的id # add by nwb def delete_user_from_project(project_id,user_id) url = REPO_IP_ADDRESS + GITLAB_API + "/projects/" + project_id +"/members/" + user_id uri = URI.parse(url) data = {id:project_id,user_id:user_id,private_token:GitlabHelper.gitlab_token} http = Net::HTTP.new uri.host, uri.port begin req = Net::HTTP::Delete.new(uri.request_uri) req.form_data = data res= http.start { |http| http.request req } if res.code == '200' temp = ActiveSupport::JSON.decode(res.body) return true else return false end rescue =>err return false end end # 发送post消息 # add by nwb def post(url, params) uri = URI.parse(url) http = Net::HTTP.new(uri.host, uri.port) if uri.scheme == 'https' http.verify_mode = OpenSSL::SSL::VERIFY_NONE http.use_ssl = true end begin request = Net::HTTP::Post.new(uri.request_uri) request['Content-Type'] = 'application/json;charset=utf-8' request['User-Agent'] = 'Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0' request['X-ACL-TOKEN'] = 'xxx_token' #request.set_form_data(params) request.body = params.to_json response = http.start { |http| http.request(request) } return JSON.parse response.body rescue =>err return nil end end # 发送get消息 # add by nwb def get(url, params) uri = URI.parse(url) uri.query = URI.encode_www_form(params) http = Net::HTTP.new uri.host, uri.port if uri.scheme == 'https' http.verify_mode = OpenSSL::SSL::VERIFY_NONE http.use_ssl = true end begin request = Net::HTTP::Get.new uri.request_uri request['Content-Type'] = 'application/json;charset=utf-8' request['User-Agent'] = 'Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0' request['X-ACL-TOKEN'] = 'xxx_token' response = http.start { |http| http.request request } return JSON.parse response.body rescue =>err return nil end end end