From 1bbde165c23852064277a0a2fdd8f3c1d0d86048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cxxq250=E2=80=9D?= <“xxq250@qq.com”> Date: Tue, 26 Jul 2022 10:44:12 +0800 Subject: [PATCH] =?UTF-8?q?reposyncer=E5=90=8C=E6=AD=A5=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ob_repository_syncs_controller.rb | 111 ++++++++++++ app/models/ob_repository_sync.rb | 28 +++ app/models/ob_repository_sync_job.rb | 24 +++ app/models/repository.rb | 2 +- .../ob_repository_sync/api_service.rb | 166 ++++++++++++++++++ .../ob_repository_syncs/index.json.jbuilder | 8 + config/routes.rb | 10 ++ ...220721034359_create_ob_repository_syncs.rb | 15 ++ ...21034618_create_ob_repository_sync_jobs.rb | 14 ++ 9 files changed, 377 insertions(+), 1 deletion(-) create mode 100644 app/controllers/ob_repository_syncs_controller.rb create mode 100644 app/models/ob_repository_sync.rb create mode 100644 app/models/ob_repository_sync_job.rb create mode 100644 app/services/ob_repository_sync/api_service.rb create mode 100644 app/views/ob_repository_syncs/index.json.jbuilder create mode 100644 db/migrate/20220721034359_create_ob_repository_syncs.rb create mode 100644 db/migrate/20220721034618_create_ob_repository_sync_jobs.rb diff --git a/app/controllers/ob_repository_syncs_controller.rb b/app/controllers/ob_repository_syncs_controller.rb new file mode 100644 index 00000000..0d14d25e --- /dev/null +++ b/app/controllers/ob_repository_syncs_controller.rb @@ -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 + + 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 diff --git a/app/models/ob_repository_sync.rb b/app/models/ob_repository_sync.rb new file mode 100644 index 00000000..b938658e --- /dev/null +++ b/app/models/ob_repository_sync.rb @@ -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 diff --git a/app/models/ob_repository_sync_job.rb b/app/models/ob_repository_sync_job.rb new file mode 100644 index 00000000..3961f0a2 --- /dev/null +++ b/app/models/ob_repository_sync_job.rb @@ -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 diff --git a/app/models/repository.rb b/app/models/repository.rb index 12cc2fa3..03c4e98e 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -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 diff --git a/app/services/ob_repository_sync/api_service.rb b/app/services/ob_repository_sync/api_service.rb new file mode 100644 index 00000000..7bed888e --- /dev/null +++ b/app/services/ob_repository_sync/api_service.rb @@ -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 diff --git a/app/views/ob_repository_syncs/index.json.jbuilder b/app/views/ob_repository_syncs/index.json.jbuilder new file mode 100644 index 00000000..4b719aa8 --- /dev/null +++ b/app/views/ob_repository_syncs/index.json.jbuilder @@ -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 \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 73e06ea5..f32f1050 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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 diff --git a/db/migrate/20220721034359_create_ob_repository_syncs.rb b/db/migrate/20220721034359_create_ob_repository_syncs.rb new file mode 100644 index 00000000..e4b6b91a --- /dev/null +++ b/db/migrate/20220721034359_create_ob_repository_syncs.rb @@ -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 diff --git a/db/migrate/20220721034618_create_ob_repository_sync_jobs.rb b/db/migrate/20220721034618_create_ob_repository_sync_jobs.rb new file mode 100644 index 00000000..bd4aa1bf --- /dev/null +++ b/db/migrate/20220721034618_create_ob_repository_sync_jobs.rb @@ -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