diff options
Diffstat (limited to 'app/graphql/types/ci')
-rw-r--r-- | app/graphql/types/ci/build_need_type.rb | 2 | ||||
-rw-r--r-- | app/graphql/types/ci/job_need_union.rb | 21 | ||||
-rw-r--r-- | app/graphql/types/ci/job_type.rb | 28 | ||||
-rw-r--r-- | app/graphql/types/ci/pipeline_type.rb | 10 | ||||
-rw-r--r-- | app/graphql/types/ci/runner_status_enum.rb | 49 | ||||
-rw-r--r-- | app/graphql/types/ci/runner_type.rb | 9 | ||||
-rw-r--r-- | app/graphql/types/ci/runner_web_url_edge.rb | 2 | ||||
-rw-r--r-- | app/graphql/types/ci/stage_type.rb | 7 | ||||
-rw-r--r-- | app/graphql/types/ci/test_case_type.rb | 2 | ||||
-rw-r--r-- | app/graphql/types/ci/test_report_total_type.rb | 2 | ||||
-rw-r--r-- | app/graphql/types/ci/test_suite_summary_type.rb | 2 | ||||
-rw-r--r-- | app/graphql/types/ci/test_suite_type.rb | 2 |
12 files changed, 101 insertions, 35 deletions
diff --git a/app/graphql/types/ci/build_need_type.rb b/app/graphql/types/ci/build_need_type.rb index 7bd12c99a08..b71d10c4c06 100644 --- a/app/graphql/types/ci/build_need_type.rb +++ b/app/graphql/types/ci/build_need_type.rb @@ -8,7 +8,7 @@ module Types graphql_name 'CiBuildNeed' field :id, GraphQL::Types::ID, null: false, - description: 'ID of the job we need to complete.' + description: 'ID of the BuildNeed.' field :name, GraphQL::Types::String, null: true, description: 'Name of the job we need to complete.' end diff --git a/app/graphql/types/ci/job_need_union.rb b/app/graphql/types/ci/job_need_union.rb new file mode 100644 index 00000000000..59608a6a312 --- /dev/null +++ b/app/graphql/types/ci/job_need_union.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Types + module Ci + class JobNeedUnion < GraphQL::Schema::Union + TypeNotSupportedError = Class.new(StandardError) + + possible_types Types::Ci::JobType, Types::Ci::BuildNeedType + + def self.resolve_type(object, context) + if object.is_a?(::Ci::BuildNeed) + Types::Ci::BuildNeedType + elsif object.is_a?(CommitStatus) + Types::Ci::JobType + else + raise TypeNotSupportedError + end + end + end + end +end diff --git a/app/graphql/types/ci/job_type.rb b/app/graphql/types/ci/job_type.rb index 48bd91bfc5b..928ca2f597d 100644 --- a/app/graphql/types/ci/job_type.rb +++ b/app/graphql/types/ci/job_type.rb @@ -50,6 +50,8 @@ module Types null: true, description: 'How long the job was enqueued before starting.' + field :previous_stage_jobs_or_needs, Types::Ci::JobNeedUnion.connection_type, null: true, + description: 'Jobs that must complete before the job runs. Returns `BuildNeed`, which is the needed jobs if the job uses the `needs` keyword, or the previous stage jobs otherwise.' field :detailed_status, Types::Ci::DetailedStatusType, null: true, description: 'Detailed status of the job.' field :artifacts, Types::Ci::JobArtifactType.connection_type, null: true, @@ -74,7 +76,7 @@ module Types description: 'Indicates the job is active.' field :stuck, GraphQL::Types::Boolean, null: false, method: :stuck?, description: 'Indicates the job is stuck.' - field :coverage, GraphQL::FLOAT_TYPE, null: true, + field :coverage, GraphQL::Types::Float, null: true, description: 'Coverage level of the job.' field :created_by_tag, GraphQL::Types::Boolean, null: false, description: 'Whether the job was created by a tag.' @@ -101,6 +103,30 @@ module Types end end + def previous_stage_jobs_or_needs + if object.scheduling_type == 'stage' + Gitlab::Graphql::Lazy.with_value(previous_stage_jobs) do |jobs| + jobs + end + else + object.needs + end + end + + def previous_stage_jobs + BatchLoader::GraphQL.for([object.pipeline, object.stage_idx - 1]).batch(default_value: []) do |tuples, loader| + tuples.group_by(&:first).each do |pipeline, keys| + positions = keys.map(&:second) + + stages = pipeline.stages.by_position(positions) + + stages.each do |stage| + loader.call([pipeline, stage.position], stage.latest_statuses) + end + end + end + end + def stage ::Gitlab::Graphql::Lazy.with_value(pipeline) do |pl| BatchLoader::GraphQL.for([pl, object.stage]).batch do |ids, loader| diff --git a/app/graphql/types/ci/pipeline_type.rb b/app/graphql/types/ci/pipeline_type.rb index da2f11be9e2..c8ac31bce4d 100644 --- a/app/graphql/types/ci/pipeline_type.rb +++ b/app/graphql/types/ci/pipeline_type.rb @@ -45,7 +45,7 @@ module Types field :queued_duration, Types::DurationType, null: true, description: 'How long the pipeline was queued before starting.' - field :coverage, GraphQL::FLOAT_TYPE, null: true, + field :coverage, GraphQL::Types::Float, null: true, description: 'Coverage percentage.' field :created_at, Types::TimeType, null: false, @@ -66,7 +66,7 @@ module Types field :stages, type: Types::Ci::StageType.connection_type, null: true, - authorize: :read_commit_status, + authorize: :read_build, description: 'Stages of the pipeline.', extras: [:lookahead], resolver: Resolvers::Ci::PipelineStagesResolver @@ -89,14 +89,14 @@ module Types field :jobs, ::Types::Ci::JobType.connection_type, null: true, - authorize: :read_commit_status, + authorize: :read_build, description: 'Jobs belonging to the pipeline.', resolver: ::Resolvers::Ci::JobsResolver field :job, type: ::Types::Ci::JobType, null: true, - authorize: :read_commit_status, + authorize: :read_build, description: 'Specific job in this pipeline, either by name or ID.' do argument :id, type: ::Types::GlobalIDType[::CommitStatus], @@ -116,7 +116,7 @@ module Types field :source_job, type: Types::Ci::JobType, null: true, - authorize: :read_commit_status, + authorize: :read_build, description: 'Job where pipeline was triggered from.' field :downstream, Types::Ci::PipelineType.connection_type, null: true, diff --git a/app/graphql/types/ci/runner_status_enum.rb b/app/graphql/types/ci/runner_status_enum.rb index 8501ce20204..dd056191ceb 100644 --- a/app/graphql/types/ci/runner_status_enum.rb +++ b/app/graphql/types/ci/runner_status_enum.rb @@ -5,24 +5,37 @@ module Types class RunnerStatusEnum < BaseEnum graphql_name 'CiRunnerStatus' - ::Ci::Runner::AVAILABLE_STATUSES.each do |status| - description = case status - when 'active' - "A runner that is not paused." - when 'online' - "A runner that contacted this instance within the last #{::Ci::Runner::ONLINE_CONTACT_TIMEOUT.inspect}." - when 'offline' - "A runner that has not contacted this instance within the last #{::Ci::Runner::ONLINE_CONTACT_TIMEOUT.inspect}." - when 'not_connected' - "A runner that has never contacted this instance." - else - "A runner that is #{status.to_s.tr('_', ' ')}." - end - - value status.to_s.upcase, - description: description, - value: status.to_sym - end + value 'ACTIVE', + description: 'Runner that is not paused.', + deprecated: { reason: 'Use CiRunnerType.active instead', milestone: '14.6' }, + value: :active + + value 'PAUSED', + description: 'Runner that is paused.', + deprecated: { reason: 'Use CiRunnerType.active instead', milestone: '14.6' }, + value: :paused + + value 'ONLINE', + description: "Runner that contacted this instance within the last #{::Ci::Runner::ONLINE_CONTACT_TIMEOUT.inspect}.", + value: :online + + value 'OFFLINE', + description: "Runner that has not contacted this instance within the last #{::Ci::Runner::ONLINE_CONTACT_TIMEOUT.inspect}.", + deprecated: { reason: 'This field will have a slightly different scope starting in 15.0, with STALE being returned after a certain period offline', milestone: '14.6' }, + value: :offline + + value 'STALE', + description: "Runner that has not contacted this instance within the last #{::Ci::Runner::STALE_TIMEOUT.inspect}. Only available if legacyMode is null. Will be a possible return value starting in 15.0.", + value: :stale + + value 'NOT_CONNECTED', + description: 'Runner that has never contacted this instance.', + deprecated: { reason: "Use NEVER_CONTACTED instead. NEVER_CONTACTED will have a slightly different scope starting in 15.0, with STALE being returned instead after #{::Ci::Runner::STALE_TIMEOUT.inspect} of no contact", milestone: '14.6' }, + value: :not_connected + + value 'NEVER_CONTACTED', + description: 'Runner that has never contacted this instance. Set legacyMode to null to utilize this value. Will replace NOT_CONNECTED starting in 15.0.', + value: :never_contacted end end end diff --git a/app/graphql/types/ci/runner_type.rb b/app/graphql/types/ci/runner_type.rb index 9bf98aa7e86..d37cca0927f 100644 --- a/app/graphql/types/ci/runner_type.rb +++ b/app/graphql/types/ci/runner_type.rb @@ -27,8 +27,11 @@ module Types description: 'Access level of the runner.' field :active, GraphQL::Types::Boolean, null: false, description: 'Indicates the runner is allowed to receive jobs.' - field :status, ::Types::Ci::RunnerStatusEnum, null: false, - description: 'Status of the runner.' + field :status, + Types::Ci::RunnerStatusEnum, + null: false, + description: 'Status of the runner.', + resolver: ::Resolvers::Ci::RunnerStatusResolver field :version, GraphQL::Types::String, null: true, description: 'Version of the runner.' field :short_sha, GraphQL::Types::String, null: true, @@ -50,7 +53,7 @@ module Types field :job_count, GraphQL::Types::Int, null: true, description: "Number of jobs processed by the runner (limited to #{JOB_COUNT_LIMIT}, plus one to indicate that more items exist)." field :admin_url, GraphQL::Types::String, null: true, - description: 'Admin URL of the runner. Only available for adminstrators.' + description: 'Admin URL of the runner. Only available for administrators.' def job_count # We limit to 1 above the JOB_COUNT_LIMIT to indicate that more items exist after JOB_COUNT_LIMIT diff --git a/app/graphql/types/ci/runner_web_url_edge.rb b/app/graphql/types/ci/runner_web_url_edge.rb index 3b9fdfd1571..368e16f972c 100644 --- a/app/graphql/types/ci/runner_web_url_edge.rb +++ b/app/graphql/types/ci/runner_web_url_edge.rb @@ -3,7 +3,7 @@ module Types module Ci # rubocop: disable Graphql/AuthorizeTypes - class RunnerWebUrlEdge < GraphQL::Types::Relay::BaseEdge + class RunnerWebUrlEdge < ::Types::BaseEdge include FindClosest field :web_url, GraphQL::Types::String, null: true, diff --git a/app/graphql/types/ci/stage_type.rb b/app/graphql/types/ci/stage_type.rb index c0d931b3d31..70e78e391a7 100644 --- a/app/graphql/types/ci/stage_type.rb +++ b/app/graphql/types/ci/stage_type.rb @@ -4,7 +4,7 @@ module Types module Ci class StageType < BaseObject graphql_name 'CiStage' - authorize :read_commit_status + authorize :read_build field :id, GraphQL::Types::ID, null: false, description: 'ID of the stage.' @@ -31,7 +31,10 @@ module Types BatchLoader::GraphQL.for(key).batch(default_value: []) do |keys, loader| by_pipeline = keys.group_by(&:pipeline) - include_needs = keys.any? { |k| k.requires?(%i[nodes jobs nodes needs]) } + include_needs = keys.any? do |k| + k.requires?(%i[nodes jobs nodes needs]) || + k.requires?(%i[nodes jobs nodes previousStageJobsAndNeeds]) + end by_pipeline.each do |pl, key_group| project = pl.project diff --git a/app/graphql/types/ci/test_case_type.rb b/app/graphql/types/ci/test_case_type.rb index 9ec5daa44ea..6e5f55aa3ed 100644 --- a/app/graphql/types/ci/test_case_type.rb +++ b/app/graphql/types/ci/test_case_type.rb @@ -18,7 +18,7 @@ module Types field :classname, GraphQL::Types::String, null: true, description: 'Classname of the test case.' - field :execution_time, GraphQL::FLOAT_TYPE, null: true, + field :execution_time, GraphQL::Types::Float, null: true, description: 'Test case execution time in seconds.' field :file, GraphQL::Types::String, null: true, diff --git a/app/graphql/types/ci/test_report_total_type.rb b/app/graphql/types/ci/test_report_total_type.rb index aa07a391519..48aea1257c5 100644 --- a/app/graphql/types/ci/test_report_total_type.rb +++ b/app/graphql/types/ci/test_report_total_type.rb @@ -7,7 +7,7 @@ module Types graphql_name 'TestReportTotal' description 'Total test report statistics.' - field :time, GraphQL::FLOAT_TYPE, null: true, + field :time, GraphQL::Types::Float, null: true, description: 'Total duration of the tests.' field :count, GraphQL::Types::Int, null: true, diff --git a/app/graphql/types/ci/test_suite_summary_type.rb b/app/graphql/types/ci/test_suite_summary_type.rb index 3db2d80d591..ec7b852213b 100644 --- a/app/graphql/types/ci/test_suite_summary_type.rb +++ b/app/graphql/types/ci/test_suite_summary_type.rb @@ -12,7 +12,7 @@ module Types field :name, GraphQL::Types::String, null: true, description: 'Name of the test suite.' - field :total_time, GraphQL::FLOAT_TYPE, null: true, + field :total_time, GraphQL::Types::Float, null: true, description: 'Total duration of the tests in the test suite.' field :total_count, GraphQL::Types::Int, null: true, diff --git a/app/graphql/types/ci/test_suite_type.rb b/app/graphql/types/ci/test_suite_type.rb index f9f37d4045e..7ce479632cc 100644 --- a/app/graphql/types/ci/test_suite_type.rb +++ b/app/graphql/types/ci/test_suite_type.rb @@ -12,7 +12,7 @@ module Types field :name, GraphQL::Types::String, null: true, description: 'Name of the test suite.' - field :total_time, GraphQL::FLOAT_TYPE, null: true, + field :total_time, GraphQL::Types::Float, null: true, description: 'Total duration of the tests in the test suite.' field :total_count, GraphQL::Types::Int, null: true, |