解决一些bug
* FIX 解决镜像项目手动同步镜像不成功的问题 * FIX新建易修api中 更新相关cache key
This commit is contained in:
commit
c5c67afacc
|
@ -94,7 +94,7 @@ module TagChosenHelper
|
||||||
|
|
||||||
def render_issue_tags(project)
|
def render_issue_tags(project)
|
||||||
# project.issue_tags.last&.cache_key
|
# project.issue_tags.last&.cache_key
|
||||||
cache_key = "all_issue_tags/#{project.issue_tags.maximum('updated_at')}"
|
cache_key = "project-#{project.id}/all_issue_tags/size-#{project.issue_tags.size}/#{project.issue_tags.maximum('updated_at')}"
|
||||||
|
|
||||||
Rails.cache.fetch(cache_key) do
|
Rails.cache.fetch(cache_key) do
|
||||||
project.issue_tags.select(:id, :name, :color).collect do |event|
|
project.issue_tags.select(:id, :name, :color).collect do |event|
|
||||||
|
@ -109,7 +109,7 @@ module TagChosenHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_cache_milestones(project)
|
def render_cache_milestones(project)
|
||||||
cache_key = "all_milestones/#{project.versions.maximum('updated_on')}"
|
cache_key = "project-#{project.id}/all_milestones/size-#{project.versions.size}/#{project.versions.maximum('updated_on')}"
|
||||||
|
|
||||||
Rails.cache.fetch(cache_key) do
|
Rails.cache.fetch(cache_key) do
|
||||||
project.versions.select(:id, :name, :status).collect do |event|
|
project.versions.select(:id, :name, :status).collect do |event|
|
||||||
|
@ -124,7 +124,7 @@ module TagChosenHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_cache_collaborators(project)
|
def render_cache_collaborators(project)
|
||||||
cache_key = "all_collaborators/#{project.all_collaborators.maximum('created_on')}"
|
cache_key = "project-#{project.id}/all_collaborators/size-#{project.all_collaborators.size}/#{project.all_collaborators.maximum('updated_on')}"
|
||||||
Rails.cache.fetch(cache_key) do
|
Rails.cache.fetch(cache_key) do
|
||||||
project.all_collaborators.order(created_on: :desc).collect do |user|
|
project.all_collaborators.order(created_on: :desc).collect do |user|
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,7 +5,27 @@ class SyncMirroredRepositoryJob < ApplicationJob
|
||||||
repo = Repository.find_by(id: repo_id)
|
repo = Repository.find_by(id: repo_id)
|
||||||
current_user = User.find_by(id: user_id)
|
current_user = User.find_by(id: user_id)
|
||||||
return if repo.blank? || current_user.blank?
|
return if repo.blank? || current_user.blank?
|
||||||
result = Gitea::Repository::SyncMirroredService.new(repo.owner.login, repo.identifier, token: current_user.gitea_token).call
|
|
||||||
|
# TODO
|
||||||
|
# 先同步镜像库
|
||||||
|
if repo.config_accelerator?
|
||||||
|
puts "[gitea-accelerator]: ###### 镜像库开始同步 ######"
|
||||||
|
result = Gitea::Accelerator::SyncMirroredService.call(repo.identifier)
|
||||||
|
puts "[gitea-accelerator]: ###### 镜像库同步状态为 #{result[:status]}"
|
||||||
|
|
||||||
|
# TODO 暂时解决从镜像库镜像动作时间先执行的问题
|
||||||
|
# 避免了Gitea::Repository::SyncMirroredService先执行后,加速器Gitea::Accelerator::SyncMirroredService
|
||||||
|
# 再执行的导致Gitea::Repository::SyncMirroredService执行镜像不是最新代码的问题
|
||||||
|
sleep 3.seconds
|
||||||
|
end
|
||||||
|
|
||||||
|
sync_common!(repo, current_user)
|
||||||
|
end
|
||||||
|
|
||||||
|
def sync_common!(repo, user)
|
||||||
|
result = Gitea::Repository::SyncMirroredService.call(repo.owner.login,
|
||||||
|
repo.identifier, token: user.gitea_token)
|
||||||
repo&.mirror.set_status! if result[:status] === 200
|
repo&.mirror.set_status! if result[:status] === 200
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -82,5 +82,8 @@ class Repository < ApplicationRecord
|
||||||
source_clone_url.blank? ? mirror_url : source_clone_url
|
source_clone_url.blank? ? mirror_url : source_clone_url
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def config_accelerator?
|
||||||
|
!source_clone_url.blank?
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
class Gitea::Accelerator::BaseService < ApplicationService
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
private
|
||||||
|
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')
|
||||||
|
else
|
||||||
|
error("MigrateError")
|
||||||
|
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
|
|
@ -1,4 +1,4 @@
|
||||||
class Gitea::Accelerator::MigrateService < ApplicationService
|
class Gitea::Accelerator::MigrateService < Gitea::Accelerator::BaseService
|
||||||
attr_reader :params
|
attr_reader :params
|
||||||
|
|
||||||
# params description:
|
# params description:
|
||||||
|
@ -36,8 +36,8 @@ class Gitea::Accelerator::MigrateService < ApplicationService
|
||||||
render_status(response)
|
render_status(response)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
|
private
|
||||||
def request_params
|
def request_params
|
||||||
{
|
{
|
||||||
uid: access_uid,
|
uid: access_uid,
|
||||||
|
@ -52,97 +52,4 @@ class Gitea::Accelerator::MigrateService < ApplicationService
|
||||||
def url
|
def url
|
||||||
"/repos/migrate".freeze
|
"/repos/migrate".freeze
|
||||||
end
|
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')
|
|
||||||
else
|
|
||||||
error("MigrateError")
|
|
||||||
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
|
end
|
|
@ -0,0 +1,31 @@
|
||||||
|
# Sync a mirrored repository
|
||||||
|
class Gitea::Accelerator::SyncMirroredService < Gitea::Accelerator::BaseService
|
||||||
|
attr_reader :repo, :token
|
||||||
|
|
||||||
|
# repo *
|
||||||
|
# name of the repo to sync
|
||||||
|
# example:
|
||||||
|
# Gitea::Accelerator::SyncMirroredService.call(repo.identifier)
|
||||||
|
def initialize(repo, token=nil)
|
||||||
|
@repo = repo
|
||||||
|
@token = token
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
return error('[gitea:] accelerator config missing') if check_accelerator!
|
||||||
|
|
||||||
|
response = post(url, request_params)
|
||||||
|
|
||||||
|
{status: response.status}
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def request_params
|
||||||
|
Hash.new.merge(token: token).compact
|
||||||
|
end
|
||||||
|
|
||||||
|
def url
|
||||||
|
"/repos/#{access_username}/#{repo}/mirror-sync".freeze
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue