|
|
|
|
# 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.host_repository
|
|
|
|
|
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
|