Merge branch 'sync_develop' into develop
This commit is contained in:
commit
03e54f9b3d
|
@ -0,0 +1,28 @@
|
||||||
|
module Acceleratorable
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
def enable_accelerator?(clone_addr)
|
||||||
|
clone_addr.include?(github_domain) || clone_addr.include?(gitlab_domain)
|
||||||
|
end
|
||||||
|
|
||||||
|
def accelerator_url(repo_name)
|
||||||
|
[accelerator_domain, accelerator_username, "#{repo_name}.git"].join('/')
|
||||||
|
end
|
||||||
|
|
||||||
|
def github_domain
|
||||||
|
'github.com'
|
||||||
|
end
|
||||||
|
|
||||||
|
def gitlab_domain
|
||||||
|
'gitlab.com'
|
||||||
|
end
|
||||||
|
|
||||||
|
def accelerator_domain
|
||||||
|
Gitea.gitea_config[:accelerator]["domain"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def accelerator_username
|
||||||
|
Gitea.gitea_config[:accelerator]["access_key_id"]
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -2,6 +2,8 @@ class ProjectsController < ApplicationController
|
||||||
include ApplicationHelper
|
include ApplicationHelper
|
||||||
include OperateProjectAbilityAble
|
include OperateProjectAbilityAble
|
||||||
include ProjectsHelper
|
include ProjectsHelper
|
||||||
|
include Acceleratorable
|
||||||
|
|
||||||
before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about menu_list]
|
before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about menu_list]
|
||||||
before_action :load_project, except: %i[index group_type_list migrate create recommend]
|
before_action :load_project, except: %i[index group_type_list migrate create recommend]
|
||||||
before_action :authorizate_user_can_edit_project!, only: %i[update]
|
before_action :authorizate_user_can_edit_project!, only: %i[update]
|
||||||
|
@ -53,7 +55,23 @@ class ProjectsController < ApplicationController
|
||||||
|
|
||||||
def migrate
|
def migrate
|
||||||
Projects::MigrateForm.new(mirror_params).validate!
|
Projects::MigrateForm.new(mirror_params).validate!
|
||||||
@project = Projects::MigrateService.new(current_user, mirror_params).call
|
|
||||||
|
@project =
|
||||||
|
if enable_accelerator?(mirror_params[:clone_addr])
|
||||||
|
source_clone_url = mirror_params[:clone_addr]
|
||||||
|
uid_logger("########## 已动加速器 ##########")
|
||||||
|
result = Gitea::Accelerator::MigrateService.call(mirror_params)
|
||||||
|
if result[:status] == :success
|
||||||
|
Rails.logger.info "########## 加速镜像成功 ########## "
|
||||||
|
Projects::MigrateService.call(current_user,
|
||||||
|
mirror_params.merge(source_clone_url: source_clone_url,
|
||||||
|
clone_addr: accelerator_url(mirror_params[:repository_name])))
|
||||||
|
else
|
||||||
|
Projects::MigrateService.call(current_user, mirror_params)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Projects::MigrateService.call(current_user, mirror_params)
|
||||||
|
end
|
||||||
rescue Exception => e
|
rescue Exception => e
|
||||||
uid_logger_error(e.message)
|
uid_logger_error(e.message)
|
||||||
tip_exception(e.message)
|
tip_exception(e.message)
|
||||||
|
|
|
@ -34,15 +34,14 @@ module ProjectsHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def json_response(project, user)
|
def json_response(project, user)
|
||||||
# repo = project.repository
|
repo = Repository.includes(:mirror).select(:id, :mirror_url, :source_clone_url).find_by(project: project)
|
||||||
repo = Repository.includes(:mirror).select(:id, :mirror_url).find_by(project: project)
|
|
||||||
|
|
||||||
tmp_json = {}
|
tmp_json = {}
|
||||||
unless project.common?
|
unless project.common?
|
||||||
tmp_json = tmp_json.merge({
|
tmp_json = tmp_json.merge({
|
||||||
mirror_status: repo.mirror_status,
|
mirror_status: repo.mirror_status,
|
||||||
mirror_num: repo.mirror_num,
|
mirror_num: repo.mirror_num,
|
||||||
mirror_url: repo.mirror_url,
|
mirror_url: repo.source_clone_url || repo.mirror_url,
|
||||||
first_sync: repo.first_sync?
|
first_sync: repo.first_sync?
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
|
@ -71,6 +71,7 @@
|
||||||
# index_projects_on_updated_on (updated_on)
|
# index_projects_on_updated_on (updated_on)
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class Project < ApplicationRecord
|
class Project < ApplicationRecord
|
||||||
include Matchable
|
include Matchable
|
||||||
include Publicable
|
include Publicable
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
# version_releases_count :integer default("0")
|
# version_releases_count :integer default("0")
|
||||||
# fork_url :string(255)
|
# fork_url :string(255)
|
||||||
# is_mirror :boolean default("0")
|
# is_mirror :boolean default("0")
|
||||||
|
# accelerator_url :string(255) default("")
|
||||||
|
# source_clone_url :string(255) default("")
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
|
|
|
@ -0,0 +1,146 @@
|
||||||
|
class Gitea::Accelerator::MigrateService < ApplicationService
|
||||||
|
attr_reader :params
|
||||||
|
|
||||||
|
# params description:
|
||||||
|
# {
|
||||||
|
# auth_username string
|
||||||
|
# clone_addr* string #clone地址
|
||||||
|
# description string
|
||||||
|
# issues boolean
|
||||||
|
# labels boolean
|
||||||
|
# milestones boolean
|
||||||
|
# mirror boolean
|
||||||
|
# private boolean
|
||||||
|
# pull_requests boolean
|
||||||
|
# releases boolean
|
||||||
|
# repo_name* string #仓库名称
|
||||||
|
# uid* integer($int64) #gitea用户id或组织id
|
||||||
|
# wiki boolean
|
||||||
|
# }
|
||||||
|
# EX:
|
||||||
|
# params = {
|
||||||
|
# clone_addr: 'xxx.com',
|
||||||
|
# repo_name: 'repo_name',
|
||||||
|
# uid: 2,
|
||||||
|
# private: false
|
||||||
|
# }
|
||||||
|
|
||||||
|
def initialize(params)
|
||||||
|
@params = params
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
return error('[gitea:] accelerator config missing') if check_accelerator!
|
||||||
|
response = post(url, request_params)
|
||||||
|
|
||||||
|
render_status(response)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def request_params
|
||||||
|
{
|
||||||
|
uid: access_uid,
|
||||||
|
clone_addr: params[:clone_addr],
|
||||||
|
repo_name: params[:repository_name],
|
||||||
|
auth_username: params[:auth_username],
|
||||||
|
auth_password: params[:auth_password],
|
||||||
|
mirror: ActiveModel::Type::Boolean.new.cast(params[:is_mirror])
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def url
|
||||||
|
"/repos/migrate".freeze
|
||||||
|
end
|
||||||
|
|
||||||
|
def post(url, params)
|
||||||
|
puts "[gitea] request params: #{params}"
|
||||||
|
puts "[gitea] access_username: #{access_username}"
|
||||||
|
puts "[gitea] access_password: #{access_password}"
|
||||||
|
conn.post do |req|
|
||||||
|
req.url full_url(url)
|
||||||
|
req.body = params.to_json
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def conn
|
||||||
|
@client ||= begin
|
||||||
|
Faraday.new(url: domain) do |req|
|
||||||
|
req.request :url_encoded
|
||||||
|
req.headers['Content-Type'] = 'application/json'
|
||||||
|
req.response :logger # 显示日志
|
||||||
|
req.adapter Faraday.default_adapter
|
||||||
|
req.basic_auth(access_username, access_password)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@client
|
||||||
|
end
|
||||||
|
|
||||||
|
def base_url
|
||||||
|
accelerator["base_url"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def domain
|
||||||
|
accelerator["domain"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def api_url
|
||||||
|
[domain, base_url].join('')
|
||||||
|
end
|
||||||
|
|
||||||
|
def full_url(api_rest, action='post')
|
||||||
|
url = [api_url, api_rest].join('').freeze
|
||||||
|
url = action === 'get' ? url : URI.escape(url)
|
||||||
|
puts "[gitea] request url: #{url}"
|
||||||
|
url
|
||||||
|
end
|
||||||
|
|
||||||
|
def access_username
|
||||||
|
accelerator["access_key_id"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def access_password
|
||||||
|
accelerator["access_key_secret"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def access_uid
|
||||||
|
accelerator["access_admin_uid"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def accelerator
|
||||||
|
Gitea.gitea_config[:accelerator]
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_status(response)
|
||||||
|
puts "[gitea] response status: #{response.status}"
|
||||||
|
puts "[gitea] response body: #{response.body}"
|
||||||
|
case response.status
|
||||||
|
when 201
|
||||||
|
success
|
||||||
|
when 403
|
||||||
|
error('APIForbiddenError')
|
||||||
|
when 422
|
||||||
|
error('APIValidationError')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def error(message)
|
||||||
|
{
|
||||||
|
status: :error,
|
||||||
|
message: message,
|
||||||
|
data: nil
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def success(data=nil)
|
||||||
|
{
|
||||||
|
status: :success,
|
||||||
|
message: nil,
|
||||||
|
data: data
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_accelerator!
|
||||||
|
accelerator.blank? || access_username.blank? || access_password.blank? || domain.blank?
|
||||||
|
end
|
||||||
|
end
|
|
@ -48,7 +48,8 @@ class Projects::MigrateService < ApplicationService
|
||||||
user_id: params[:user_id],
|
user_id: params[:user_id],
|
||||||
login: params[:auth_username],
|
login: params[:auth_username],
|
||||||
password: params[:auth_password],
|
password: params[:auth_password],
|
||||||
is_mirror: params[:is_mirror]
|
is_mirror: params[:is_mirror],
|
||||||
|
source_clone_url: params[:source_clone_url]
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,9 @@ class Repositories::MigrateService < ApplicationService
|
||||||
|
|
||||||
private
|
private
|
||||||
def repository_params
|
def repository_params
|
||||||
params.merge(project_id: project.id, identifier: params[:identifier])
|
params.merge(project_id: project.id,
|
||||||
|
identifier: params[:identifier],
|
||||||
|
source_clone_url: params[:source_clone_url])
|
||||||
end
|
end
|
||||||
|
|
||||||
def gitea_repository_params
|
def gitea_repository_params
|
||||||
|
|
|
@ -21,7 +21,7 @@ json.versions_count @project.versions_count #里程碑数量
|
||||||
json.version_releases_count @project.releases_size(@user.try(:id), "all")
|
json.version_releases_count @project.releases_size(@user.try(:id), "all")
|
||||||
json.version_releasesed_count @project.releases_size(@user.try(:id), "released") #已发行的版本
|
json.version_releasesed_count @project.releases_size(@user.try(:id), "released") #已发行的版本
|
||||||
json.permission render_permission(@user, @project)
|
json.permission render_permission(@user, @project)
|
||||||
json.mirror_url @project&.repository.mirror_url
|
json.mirror_url @project&.repository.source_clone_url
|
||||||
json.mirror @project&.repository.mirror_url.present?
|
json.mirror @project&.repository.mirror_url.present?
|
||||||
json.type @project.numerical_for_project_type
|
json.type @project.numerical_for_project_type
|
||||||
json.open_devops @project.open_devops?
|
json.open_devops @project.open_devops?
|
||||||
|
|
|
@ -45,10 +45,16 @@ default: &default
|
||||||
signature_key: 'test12345678'
|
signature_key: 'test12345678'
|
||||||
|
|
||||||
gitea:
|
gitea:
|
||||||
access_key_id: 'root'
|
access_key_id: ''
|
||||||
access_key_secret: '_Trustie_10010'
|
access_key_secret: ''
|
||||||
domain: 'https://testgitea.trustie.net'
|
domain: 'https://testgit.trustie.net'
|
||||||
base_url: '/api/v1'
|
base_url: '/api/v1'
|
||||||
|
accelerator:
|
||||||
|
access_key_id: ''
|
||||||
|
access_key_secret: ''
|
||||||
|
access_admin_uid: 1
|
||||||
|
domain: 'https://testgit.trustie.net'
|
||||||
|
base_url: '/api/v1'
|
||||||
|
|
||||||
|
|
||||||
production:
|
production:
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddAcceleratorUrlToRepositories < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :repositories, :accelerator_url, :string, default: ""
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddSourceCloneUrlToRepositories < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :repositories, :source_clone_url, :string, default: ""
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue