From 8eefb8ca07ae273680b2f15a3aec415925526b24 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 5 Mar 2024 09:43:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E7=BA=BF=E6=8E=A5=E5=8F=A3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 +- .../v1/projects/actions/actions_controller.rb | 31 ++++++++++++++ .../v1/projects/actions/base_controller.rb | 4 ++ .../v1/projects/actions/runs_controller.rb | 12 ++++++ .../projects/actions/runs/job_show_service.rb | 42 +++++++++++++++++++ .../v1/projects/actions/runs/list_service.rb | 36 ++++++++++++++++ .../actions/actions/index.json.jbuilder | 4 ++ .../projects/actions/runs/index.json.jbuilder | 19 +++++++++ .../actions/runs/job_show.json.jbuilder | 16 +++++++ config/routes/api.rb | 9 ++++ 10 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 app/controllers/api/v1/projects/actions/actions_controller.rb create mode 100644 app/controllers/api/v1/projects/actions/base_controller.rb create mode 100644 app/controllers/api/v1/projects/actions/runs_controller.rb create mode 100644 app/services/api/v1/projects/actions/runs/job_show_service.rb create mode 100644 app/services/api/v1/projects/actions/runs/list_service.rb create mode 100644 app/views/api/v1/projects/actions/actions/index.json.jbuilder create mode 100644 app/views/api/v1/projects/actions/runs/index.json.jbuilder create mode 100644 app/views/api/v1/projects/actions/runs/job_show.json.jbuilder diff --git a/Gemfile b/Gemfile index c73a66428..dd2bcd982 100644 --- a/Gemfile +++ b/Gemfile @@ -143,4 +143,4 @@ gem 'doorkeeper' gem 'doorkeeper-jwt' -gem 'gitea-client', '~> 1.4.5' +gem 'gitea-client', '~> 1.4.6' diff --git a/app/controllers/api/v1/projects/actions/actions_controller.rb b/app/controllers/api/v1/projects/actions/actions_controller.rb new file mode 100644 index 000000000..3825b4685 --- /dev/null +++ b/app/controllers/api/v1/projects/actions/actions_controller.rb @@ -0,0 +1,31 @@ +class Api::V1::Projects::Actions::ActionsController < Api::V1::Projects::Actions::BaseController + + def index + begin + gitea_result = $gitea_hat_client.get_repos_actions_by_owner_repo(@project&.owner&.login, @project&.identifier) + @data = gitea_result[:data]["Workflows"] + rescue + @data = [] + end + end + + def disable + return render_error("请输入正确的流水线文件!") if params[:workflow].blank? + gitea_result = $gitea_hat_client.post_repos_actions_disable(@project&.owner&.login, @project&.identifier, {query: {workflow: params[:workflow]}}) rescue nil + if gitea_result + render_ok + else + render_error("禁用流水线失败") + end + end + + def enable + return render_error("请输入正确的流水线文件!") if params[:workflow].blank? + gitea_result = $gitea_hat_client.post_repos_actions_enable(@project&.owner&.login, @project&.identifier, {query: {workflow: params[:workflow]}}) rescue nil + if gitea_result + render_ok + else + render_error("取消禁用流水线失败") + end + end +end \ No newline at end of file diff --git a/app/controllers/api/v1/projects/actions/base_controller.rb b/app/controllers/api/v1/projects/actions/base_controller.rb new file mode 100644 index 000000000..d76b446ad --- /dev/null +++ b/app/controllers/api/v1/projects/actions/base_controller.rb @@ -0,0 +1,4 @@ +class Api::V1::Projects::Actions::BaseController < Api::V1::BaseController + before_action :require_public_and_member_above + +end \ No newline at end of file diff --git a/app/controllers/api/v1/projects/actions/runs_controller.rb b/app/controllers/api/v1/projects/actions/runs_controller.rb new file mode 100644 index 000000000..fbb3e4403 --- /dev/null +++ b/app/controllers/api/v1/projects/actions/runs_controller.rb @@ -0,0 +1,12 @@ +class Api::V1::Projects::Actions::RunsController < Api::V1::Projects::Actions::BaseController + + def index + @result_object = Api::V1::Projects::Actions::Runs::ListService.call(@project, params[:workflow], current_user&.gitea_token) + end + + def job_show + @result_object = Api::V1::Projects::Actions::Runs::JobShowService.call(@project, params[:run_id], params[:job], params[:log_cursors], current_user&.gitea_token) + puts @result_object + end + +end \ No newline at end of file diff --git a/app/services/api/v1/projects/actions/runs/job_show_service.rb b/app/services/api/v1/projects/actions/runs/job_show_service.rb new file mode 100644 index 000000000..e80e882be --- /dev/null +++ b/app/services/api/v1/projects/actions/runs/job_show_service.rb @@ -0,0 +1,42 @@ +class Api::V1::Projects::Actions::Runs::JobShowService < ApplicationService + include ActiveModel::Model + + attr_reader :project, :token, :owner, :repo, :run, :job, :log_cursors + attr_accessor :gitea_data + + validates :run, :job, :log_cursors, presence: true + + def initialize(project, run, job, log_cursors, token = nil) + @project = project + @owner = project&.owner.login + @repo = project&.identifier + @run = run + @job = job + @log_cursors = log_cursors + @token = token + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + load_gitea_data + + @gitea_data + end + + private + def request_params + { + access_token: token + } + end + + def request_body + { + logCursors: log_cursors + } + end + + def load_gitea_data + @gitea_data = $gitea_hat_client.post_repos_actions_runs_jobs_by_owner_repo_run_job(owner, repo, run, job, {query: request_params, body: request_body.to_json}) + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/actions/runs/list_service.rb b/app/services/api/v1/projects/actions/runs/list_service.rb new file mode 100644 index 000000000..62dbc05a0 --- /dev/null +++ b/app/services/api/v1/projects/actions/runs/list_service.rb @@ -0,0 +1,36 @@ +class Api::V1::Projects::Actions::Runs::ListService < ApplicationService + include ActiveModel::Model + + attr_reader :project, :token, :owner, :repo, :workflow + attr_accessor :gitea_data + + validates :workflow, presence: true + + def initialize(project, workflow, token =nil) + @project = project + @owner = project&.owner.login + @repo = project&.identifier + @workflow = workflow + @token = token + end + + def call + raise Error, errors.full_messages.join(",") unless valid? + load_gitea_data + + @gitea_data + end + + private + def request_params + { + access_token: token, + workflow: workflow + } + end + + def load_gitea_data + @gitea_data = $gitea_hat_client.get_repos_actions_by_owner_repo(owner, repo, {query: request_params}) rescue nil + raise Error, '获取流水线执行记录失败!' unless @gitea_data.is_a?(Hash) + end +end \ No newline at end of file diff --git a/app/views/api/v1/projects/actions/actions/index.json.jbuilder b/app/views/api/v1/projects/actions/actions/index.json.jbuilder new file mode 100644 index 000000000..530cfc6af --- /dev/null +++ b/app/views/api/v1/projects/actions/actions/index.json.jbuilder @@ -0,0 +1,4 @@ +json.total_count @data.size +json.files @data.each do |file| + json.name file["Name"] +end \ No newline at end of file diff --git a/app/views/api/v1/projects/actions/runs/index.json.jbuilder b/app/views/api/v1/projects/actions/runs/index.json.jbuilder new file mode 100644 index 000000000..e21d86dc3 --- /dev/null +++ b/app/views/api/v1/projects/actions/runs/index.json.jbuilder @@ -0,0 +1,19 @@ +json.total_data @result_object[:total_data].to_i +json.runs @result_object[:data]["Runs"].each do |run| + json.workflow run["WorkflowID"] + json.index run["Index"] + json.title run["Title"] + json.trigger_user do + json.partial! 'api/v1/users/commit_user', locals: { user: render_cache_commit_author(run['TriggerUser']), name: run['TriggerUser']['Name'] } + end + + if run["Ref"].starts_with?("refs/tags") + json.ref run["Ref"].gsub!("/refs/tags/", "") + else + json.ref run["Ref"].gsub!("refs/heads/", "") + end + + json.status run["Status"] + json.time_ago time_from_now(run["Stopped"]) + json.holding_time run["Stopped"]-run["Started"] +end \ No newline at end of file diff --git a/app/views/api/v1/projects/actions/runs/job_show.json.jbuilder b/app/views/api/v1/projects/actions/runs/job_show.json.jbuilder new file mode 100644 index 000000000..bf5ce048a --- /dev/null +++ b/app/views/api/v1/projects/actions/runs/job_show.json.jbuilder @@ -0,0 +1,16 @@ +json.state do + json.run do + json.title @result_object["state"]["run"]["title"] + json.status @result_object["state"]["run"]["status"] + json.done @result_object["state"]["run"]["done"] + json.jobs @result_object["state"]["run"]["jobs"] + json.current_job do + json.title @result_object["state"]["currentJob"]["title"] + json.detail @result_object["state"]["currentJob"]["detail"] + json.steps @result_object["state"]["currentJob"]["steps"] + end + end +end +json.logs do + json.steps_log @result_object["logs"]["stepsLog"] +end \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index f487f8b44..20390a500 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -60,6 +60,15 @@ defaults format: :json do # projects文件夹下的 scope module: :projects do + resources :actions, module: 'actions' do + collection do + post :disable + post :enable + resources :runs, only: [:index] do + post '/jobs/:job', to: 'runs#job_show' + end + end + end resources :pulls, module: 'pulls' do resources :versions, only: [:index] do member do