| @@ -0,0 +1,111 @@ | |||
| class ObRepositorySyncsController < ApplicationController | |||
| before_action :require_login | |||
| before_action :load_project | |||
| before_action :load_ob_repository_sync, except: [:create] | |||
| before_action :authenticate_user! | |||
| def index | |||
| render_ok(data: @ob_repository_sync) | |||
| end | |||
| def create | |||
| tip_exception "参数错误" if params[:github_address].blank? && params[:gitee_address].blank? | |||
| project_name ="#{@project.owner.name}:#{@project.identifier}" | |||
| service = ObRepositorySync::ApiService.new(project_name) | |||
| params.merge({ "gitlink_address": @project.repository.url }) | |||
| res = service.create_projects(params) | |||
| tip_exception "保存失败: #{res["msg"]}" if res["code"].to_s != "200" | |||
| sync_id = res["data"]["id"] | |||
| ob_repository_sync = ObRepositorySync.find_or_initialize_by(project_id: @project.id) | |||
| ob_repository_sync.project_id = @project.id | |||
| ob_repository_sync.user_id = current_user.id | |||
| ob_repository_sync.name = project_name | |||
| ob_repository_sync.github_address = "#{params[:github_address]}" | |||
| ob_repository_sync.gitee_address = "#{params[:gitee_address]}" | |||
| ob_repository_sync.github_token = "#{params[:github_token]}" | |||
| ob_repository_sync.gitee_token = "#{params[:gitee_token]}" | |||
| ob_repository_sync.sync_id = sync_id | |||
| ob_repository_sync.save! | |||
| render_ok | |||
| end | |||
| def delete | |||
| service = ObRepositorySync::ApiService.new(@ob_repository_sync.name) | |||
| res = service.delete_project @ob_repository_sync.sync_id | |||
| tip_exception "保存失败: #{res["msg"]}" if res["code"].to_s != "200" | |||
| if res["code"].to_s == "200" | |||
| @ob_repository_sync.destroy! | |||
| end | |||
| end | |||
| def jobs | |||
| tip_exception "该项目未创建同步任务" if @ob_repository_sync.blank? | |||
| service = ObRepositorySync::ApiService.new(@ob_repository_sync.name) | |||
| res = service.get_projects_jobs | |||
| render_ok(count: res["data"]["total"], data: res["data"]["list"]) | |||
| end | |||
| def create_jobs | |||
| service = ObRepositorySync::ApiService.new(@ob_repository_sync.name) | |||
| res = service.create_projects_jobs(params) | |||
| tip_exception "保存失败: #{res["msg"]}" if res["code"].to_s != "200" | |||
| job_id = res["data"]["id"] | |||
| job = ObRepositorySyncJob.new | |||
| job.ob_repository_sync_id = @ob_repository_sync.id | |||
| job.github_branch = "#{params[:github_branch]}" | |||
| job.gitee_branch = "#{params[:gitee_branch]}" | |||
| job.gitlink_branch = "#{params[:gitlink_branch]}" | |||
| job.job_type = "#{params[:type]}" | |||
| job.base = "#{params[:base]}" | |||
| job.job_id = job_id | |||
| job.save | |||
| render_ok | |||
| end | |||
| def delete_job | |||
| tip_exception "缺少参数job_id" if params[:job_id].blank? | |||
| service = ObRepositorySync::ApiService.new(@ob_repository_sync.name) | |||
| res = service.delete_job params[:job_id] | |||
| tip_exception "保存失败: #{res["msg"]}" if res["code"].to_s != "200" | |||
| @ob_repository_sync.destroy! | |||
| render_ok | |||
| end | |||
| def start_job | |||
| tip_exception "缺少参数job_id" if params[:job_id].blank? | |||
| service = ObRepositorySync::ApiService.new(@ob_repository_sync.name) | |||
| res = service.start_job params[:job_id] | |||
| tip_exception "启动错误: #{res["msg"]}" if res["code"].to_s != "200" | |||
| render_ok | |||
| end | |||
| def stop_job | |||
| tip_exception "缺少参数job_id" if params[:job_id].blank? | |||
| service = ObRepositorySync::ApiService.new(@ob_repository_sync.name) | |||
| res = service.stop_job params[:job_id] | |||
| tip_exception "停止错误: #{res["msg"]}" if res["code"].to_s != "200" | |||
| render_ok | |||
| end | |||
| def job_logs | |||
| tip_exception "该项目未创建同步任务" if @ob_repository_sync.blank? | |||
| tip_exception "缺少参数job_id" if params[:job_id].blank? | |||
| service = ObRepositorySync::ApiService.new(@ob_repository_sync.name) | |||
| @data = service.job_logs params[:job_id] | |||
| tip_exception "请求错误: #{res["msg"]}" if res["code"].to_s != "200" | |||
| render_ok(count: res["data"]["total"], data: res["data"]["list"]) | |||
| end | |||
| private | |||
| def load_ob_repository_sync | |||
| @ob_repository_sync = ObRepositorySync.find_by(project_id: @project.id) | |||
| end | |||
| def authenticate_user! | |||
| return if @project.member?(current_user) || current_user.admin? | |||
| render_forbidden('你没有权限操作') | |||
| end | |||
| end | |||
| @@ -0,0 +1,28 @@ | |||
| # == Schema Information | |||
| # | |||
| # Table name: ob_repository_syncs | |||
| # | |||
| # id :integer not null, primary key | |||
| # project_id :integer | |||
| # user_id :integer | |||
| # name :string(255) | |||
| # github_address :string(255) | |||
| # gitee_address :string(255) | |||
| # github_token :string(255) | |||
| # gitee_token :string(255) | |||
| # sync_id :integer | |||
| # created_at :datetime not null | |||
| # updated_at :datetime not null | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_ob_repository_syncs_on_project_id (project_id) | |||
| # index_ob_repository_syncs_on_user_id (user_id) | |||
| # | |||
| class ObRepositorySync < ApplicationRecord | |||
| belongs_to :project | |||
| belongs_to :user | |||
| has_many :ob_repository_sync_jobs, dependent: :destroy | |||
| end | |||
| @@ -0,0 +1,24 @@ | |||
| # == Schema Information | |||
| # | |||
| # Table name: ob_repository_sync_jobs | |||
| # | |||
| # id :integer not null, primary key | |||
| # ob_repository_sync_id :integer | |||
| # github_branch :string(255) | |||
| # gitee_branch :string(255) | |||
| # gitlink_branch :string(255) | |||
| # job_type :string(255) | |||
| # base :string(255) | |||
| # job_id :integer | |||
| # created_at :datetime not null | |||
| # updated_at :datetime not null | |||
| # | |||
| # Indexes | |||
| # | |||
| # index_ob_repository_sync_jobs_on_ob_repository_sync_id (ob_repository_sync_id) | |||
| # | |||
| class ObRepositorySyncJob < ApplicationRecord | |||
| belongs_to :ob_repository_sync | |||
| end | |||
| @@ -37,7 +37,7 @@ class PullRequest < ApplicationRecord | |||
| has_many :pull_request_tags, foreign_key: :pull_request_id | |||
| has_many :project_trends, as: :trend, dependent: :destroy | |||
| has_many :attachments, as: :container, dependent: :destroy | |||
| has_one :gitea_pull, foreign_key: :id, primary_key: :gitea_number, class_name: 'Gitea::Pull' | |||
| has_one :gitea_pull, foreign_key: :id, primary_key: :gitea_id, class_name: 'Gitea::Pull' | |||
| has_many :journals, :as => :journalized, :dependent => :destroy | |||
| has_many :journal_details, through: :journals | |||
| has_many :reviews, dependent: :destroy | |||
| @@ -49,7 +49,7 @@ class Repository < ApplicationRecord | |||
| end | |||
| def url | |||
| self['url'].blank? ? "#{Rails.application.config_for(:configuration)['platform_url']}/#{self.owner&.login}/#{self.identifier}.git" : self['url'] | |||
| self['url'].blank? ? "#{Gitea.gitea_config[:domain]}/#{self.owner&.login}/#{self.identifier}.git" : self['url'] | |||
| end | |||
| # with repository is mirror | |||
| @@ -0,0 +1,166 @@ | |||
| class ObRepositorySync::ApiService < ApplicationService | |||
| attr_reader :project_name | |||
| def initialize(project_name) | |||
| @project_name = project_name | |||
| end | |||
| def call | |||
| true | |||
| end | |||
| def create_projects(params = {}) | |||
| projects_body = { | |||
| "name": "#{@project_name}", | |||
| "github_address": "#{params[:github_address]}", | |||
| "gitee_address": "#{params[:gitee_address]}", | |||
| "github_token": "#{params[:github_token]}", | |||
| "gitee_token": "#{params[:gitee_token]}" | |||
| } | |||
| url = URI("#{domain}/cerobot/projects") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Post.new(url) | |||
| request["Content-Type"] = "application/json" | |||
| request.body = JSON.dump(projects_body) | |||
| response = http.request(request) | |||
| # Rails.logger.info "cerobot/projects response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| res | |||
| end | |||
| def delete_project sync_id | |||
| url = URI("#{domain}/cerobot/projects?id=#{sync_id}") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Delete.new(url) | |||
| request["Content-Type"] = "application/json" | |||
| response = http.request(request) | |||
| # Rails.logger.info "delete project response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| res | |||
| end | |||
| def get_projects_jobs | |||
| url = URI("#{domain}/cerobot/projects/#{@project_name}/jobs") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Get.new(url) | |||
| request["Content-Type"] = "application/json" | |||
| response = http.request(request) | |||
| Rails.logger.info "cerobot/projects response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| res | |||
| end | |||
| def create_projects_jobs(params = {}) | |||
| job_body = { | |||
| "github_branch": "#{params[:github_branch]}", | |||
| "gitee_branch": "#{params[:gitee_branch]}", | |||
| "gitlink_branch": "#{params[:gitlink_branch]}", | |||
| "type": "#{params[:type]}", | |||
| "base": "#{params[:base]}" | |||
| } | |||
| url = URI("#{domain}/cerobot/projects/#{@project_name}/jobs") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Post.new(url) | |||
| request["Content-Type"] = "application/json" | |||
| request.body = JSON.dump(job_body) | |||
| response = http.request(request) | |||
| Rails.logger.info "cerobot/projects response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| res | |||
| end | |||
| def delete_job job_id | |||
| url = URI("#{domain}/cerobot/projects/#{@project_name}/jobs?id=#{job_id}") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Delete.new(url) | |||
| request["Content-Type"] = "application/json" | |||
| response = http.request(request) | |||
| Rails.logger.info "delete job response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| res | |||
| end | |||
| def start_job job_id | |||
| url = URI("#{domain}/cerobot/projects/#{@project_name}/jobs/#{job_id}/start") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Put.new(url) | |||
| request["Content-Type"] = "application/json" | |||
| response = http.request(request) | |||
| Rails.logger.info "start job response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| res | |||
| end | |||
| def stop_job job_id | |||
| url = URI("#{domain}/cerobot/projects/#{@project_name}/jobs/#{job_id}/stop") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Put.new(url) | |||
| request["Content-Type"] = "application/json" | |||
| response = http.request(request) | |||
| Rails.logger.info "stop job response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| res | |||
| end | |||
| def set_commit job_id, commit_id | |||
| url = URI("#{domain}/cerobot/projects/#{@project_name}/jobs/#{job_id}/set_commit?commit=#{commit_id}") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Put.new(url) | |||
| response = http.request(request) | |||
| Rails.logger.info "set_commit job response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| res | |||
| end | |||
| def job_logs job_id | |||
| url = URI("#{domain}/cerobot/projects/#{@project_name}/jobs/#{job_id}/logs") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Get.new(url) | |||
| request["Content-Type"] = "application/json" | |||
| response = http.request(request) | |||
| Rails.logger.info "set_commit job response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| if res["code"].to_s == "200" | |||
| res["data"] | |||
| else | |||
| [] | |||
| end | |||
| end | |||
| def pull_requests | |||
| url = URI("#{domain}/cerobot/projects/#{@project_name}/pullrequests") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Get.new(url) | |||
| request["Content-Type"] = "application/json" | |||
| response = http.request(request) | |||
| Rails.logger.info "pull_requests response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| if res["code"].to_s == "200" | |||
| res["data"] | |||
| else | |||
| [] | |||
| end | |||
| end | |||
| def pull_requests_sync | |||
| url = URI("#{domain}/cerobot/projects/#{@project_name}/pullrequests/sync") | |||
| http = Net::HTTP.new(url.host, url.port) | |||
| request = Net::HTTP::Get.new(url) | |||
| request["Content-Type"] = "application/json" | |||
| response = http.request(request) | |||
| Rails.logger.info "pull_requests_sync response.read_body======#{response.read_body}" | |||
| res = JSON.parse(response.body) | |||
| if res["code"].to_s == "200" | |||
| res["data"] | |||
| else | |||
| [] | |||
| end | |||
| end | |||
| def domain | |||
| EduSetting.get("ob_repository_sync_api_domain") || "http://106.75.110.152:50087" | |||
| end | |||
| end | |||
| @@ -0,0 +1,8 @@ | |||
| json.status 0 | |||
| json.message "success" | |||
| json.data do | |||
| if @ob_repository_sync | |||
| json.extract! @ob_repository_sync, :user_id, :name, :github_address, :gitee_address, :github_token, :gitee_token,:sync_id, :created_at, :updated_at | |||
| end | |||
| end | |||
| @@ -555,6 +555,16 @@ Rails.application.routes.draw do | |||
| resources :project_trends, :path => :activity, only: [:index, :create] | |||
| resources :issue_tags, :path => :labels, only: [:create, :edit, :update, :destroy, :index] | |||
| resources :version_releases, :path => :releases, only: [:index,:new, :show, :create, :edit, :update, :destroy] | |||
| resources :ob_repository_syncs, :path => :synchronizes, only: [:index, :create] do | |||
| collection do | |||
| delete :delete | |||
| get :jobs | |||
| post :create_jobs | |||
| delete :delete_job | |||
| post :start_job | |||
| post :stop_job | |||
| end | |||
| end | |||
| scope module: :ci do | |||
| scope do | |||
| @@ -0,0 +1,15 @@ | |||
| class CreateObRepositorySyncs < ActiveRecord::Migration[5.2] | |||
| def change | |||
| create_table :ob_repository_syncs do |t| | |||
| t.references :project | |||
| t.references :user | |||
| t.string :name | |||
| t.string :github_address | |||
| t.string :gitee_address | |||
| t.string :github_token | |||
| t.string :gitee_token | |||
| t.integer :sync_id | |||
| t.timestamps | |||
| end | |||
| end | |||
| end | |||
| @@ -0,0 +1,14 @@ | |||
| class CreateObRepositorySyncJobs < ActiveRecord::Migration[5.2] | |||
| def change | |||
| create_table :ob_repository_sync_jobs do |t| | |||
| t.references :ob_repository_sync | |||
| t.string :github_branch | |||
| t.string :gitee_branch | |||
| t.string :gitlink_branch | |||
| t.string :job_type | |||
| t.string :base | |||
| t.integer :job_id | |||
| t.timestamps | |||
| end | |||
| end | |||
| end | |||