reposyncer同步仓库接口

This commit is contained in:
“xxq250” 2022-07-26 10:44:12 +08:00
parent 0df1e5fdd0
commit 1bbde165c2
9 changed files with 377 additions and 1 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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