Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cross_project_pipeline_spec.rb « create_pipeline_service « ci « services « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 74d3534eb452c9ebd09c602654ef9f71b10e7a69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Ci::CreatePipelineService, '#execute', :yaml_processor_feature_flag_corectness do
  let_it_be(:group) { create(:group, name: 'my-organization') }

  let(:upstream_project) { create(:project, :repository, name: 'upstream', group: group) }
  let(:downstream_project) { create(:project, :repository, name: 'downstream', group: group) }
  let(:user) { create(:user) }

  let(:service) do
    described_class.new(upstream_project, user, ref: 'master')
  end

  before do
    upstream_project.add_developer(user)
    downstream_project.add_developer(user)
    create_gitlab_ci_yml(upstream_project, upstream_config)
    create_gitlab_ci_yml(downstream_project, downstream_config)
  end

  context 'with resource group', :aggregate_failures do
    let(:upstream_config) do
      <<~YAML
      instrumentation_test:
        stage: test
        resource_group: iOS
        trigger:
          project: my-organization/downstream
          strategy: depend
      YAML
    end

    let(:downstream_config) do
      <<~YAML
      test:
        script: echo "Testing..."
      YAML
    end

    it 'creates bridge job with resource group' do
      pipeline = create_pipeline!
      Ci::InitialPipelineProcessWorker.new.perform(pipeline.id)

      test = pipeline.statuses.find_by(name: 'instrumentation_test')
      expect(pipeline).to be_created_successfully
      expect(pipeline.triggered_pipelines).not_to be_exist
      expect(upstream_project.resource_groups.count).to eq(1)
      expect(test).to be_a Ci::Bridge
      expect(test).to be_waiting_for_resource
      expect(test.resource_group.key).to eq('iOS')
    end

    context 'when sidekiq processes the job', :sidekiq_inline do
      it 'transitions to pending status and triggers a downstream pipeline' do
        pipeline = create_pipeline!

        test = pipeline.statuses.find_by(name: 'instrumentation_test')
        expect(test).to be_pending
        expect(pipeline.triggered_pipelines.count).to eq(1)
      end

      context 'when the resource is occupied by the other bridge' do
        before do
          resource_group = create(:ci_resource_group, project: upstream_project, key: 'iOS')
          resource_group.assign_resource_to(create(:ci_build, project: upstream_project))
        end

        it 'stays waiting for resource' do
          pipeline = create_pipeline!

          test = pipeline.statuses.find_by(name: 'instrumentation_test')
          expect(test).to be_waiting_for_resource
          expect(pipeline.triggered_pipelines.count).to eq(0)
        end
      end
    end
  end

  def create_pipeline!
    service.execute(:push).payload
  end

  def create_gitlab_ci_yml(project, content)
    project.repository.create_file(user, '.gitlab-ci.yml', content, branch_name: 'master', message: 'test')
  end
end