diff --git a/app/helpers/tag_chosen_helper.rb b/app/helpers/tag_chosen_helper.rb index 1e7879d18..5193c9ab4 100644 --- a/app/helpers/tag_chosen_helper.rb +++ b/app/helpers/tag_chosen_helper.rb @@ -94,7 +94,7 @@ module TagChosenHelper def render_issue_tags(project) # 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 project.issue_tags.select(:id, :name, :color).collect do |event| @@ -109,7 +109,7 @@ module TagChosenHelper end 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 project.versions.select(:id, :name, :status).collect do |event| @@ -124,7 +124,7 @@ module TagChosenHelper end 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 project.all_collaborators.order(created_on: :desc).collect do |user| { diff --git a/app/jobs/sync_mirrored_repository_job.rb b/app/jobs/sync_mirrored_repository_job.rb index f0617146a..a1408153f 100644 --- a/app/jobs/sync_mirrored_repository_job.rb +++ b/app/jobs/sync_mirrored_repository_job.rb @@ -5,7 +5,27 @@ class SyncMirroredRepositoryJob < ApplicationJob repo = Repository.find_by(id: repo_id) current_user = User.find_by(id: user_id) 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 end + end diff --git a/app/models/repository.rb b/app/models/repository.rb index 0daa4b916..a012b449a 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -82,5 +82,8 @@ class Repository < ApplicationRecord source_clone_url.blank? ? mirror_url : source_clone_url end + def config_accelerator? + !source_clone_url.blank? + end end diff --git a/app/services/gitea/accelerator/base_service.rb b/app/services/gitea/accelerator/base_service.rb new file mode 100644 index 000000000..e63d77aab --- /dev/null +++ b/app/services/gitea/accelerator/base_service.rb @@ -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 \ No newline at end of file diff --git a/app/services/gitea/accelerator/migrate_service.rb b/app/services/gitea/accelerator/migrate_service.rb index 015a09b16..26541b48e 100644 --- a/app/services/gitea/accelerator/migrate_service.rb +++ b/app/services/gitea/accelerator/migrate_service.rb @@ -1,4 +1,4 @@ -class Gitea::Accelerator::MigrateService < ApplicationService +class Gitea::Accelerator::MigrateService < Gitea::Accelerator::BaseService attr_reader :params # params description: @@ -36,8 +36,8 @@ class Gitea::Accelerator::MigrateService < ApplicationService render_status(response) end - private + private def request_params { uid: access_uid, @@ -52,97 +52,4 @@ class Gitea::Accelerator::MigrateService < ApplicationService 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') - 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 \ No newline at end of file diff --git a/app/services/gitea/accelerator/sync_mirrored_service.rb b/app/services/gitea/accelerator/sync_mirrored_service.rb new file mode 100644 index 000000000..0e0a7ca94 --- /dev/null +++ b/app/services/gitea/accelerator/sync_mirrored_service.rb @@ -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