debian-mirror-gitlab/spec/features/projects/pipelines/pipelines_spec.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

867 lines
27 KiB
Ruby
Raw Normal View History

2019-10-12 21:52:04 +05:30
# frozen_string_literal: true
2017-08-17 22:00:37 +05:30
require 'spec_helper'
2023-03-04 22:38:38 +05:30
RSpec.describe 'Pipelines', :js, feature_category: :projects do
2023-03-17 16:20:25 +05:30
include ListboxHelpers
2019-07-07 11:18:12 +05:30
include ProjectForksHelper
2022-04-04 11:22:00 +05:30
include Spec::Support::Helpers::ModalHelpers
2019-07-07 11:18:12 +05:30
2017-09-10 17:25:29 +05:30
let(:project) { create(:project) }
2022-08-27 11:52:29 +05:30
let(:expected_detached_mr_tag) { 'merge request' }
2017-08-17 22:00:37 +05:30
context 'when user is logged in' do
let(:user) { create(:user) }
before do
2017-09-10 17:25:29 +05:30
sign_in(user)
2021-03-11 19:13:27 +05:30
2018-03-17 18:26:18 +05:30
project.add_developer(user)
2018-11-20 20:47:30 +05:30
project.update!(auto_devops_attributes: { enabled: false })
2017-08-17 22:00:37 +05:30
end
2021-03-11 19:13:27 +05:30
describe 'GET /:project/-/pipelines' do
2017-09-10 17:25:29 +05:30
let(:project) { create(:project, :repository) }
2017-08-17 22:00:37 +05:30
let!(:pipeline) do
create(
:ci_empty_pipeline,
project: project,
ref: 'master',
status: 'running',
2017-09-10 17:25:29 +05:30
sha: project.commit.id
2017-08-17 22:00:37 +05:30
)
end
context 'scope' do
before do
create(:ci_empty_pipeline, status: 'pending', project: project, sha: project.commit.id, ref: 'master')
create(:ci_empty_pipeline, status: 'running', project: project, sha: project.commit.id, ref: 'master')
create(:ci_empty_pipeline, status: 'created', project: project, sha: project.commit.id, ref: 'master')
create(:ci_empty_pipeline, status: 'success', project: project, sha: project.commit.id, ref: 'master')
end
[:all, :running, :pending, :finished, :branches].each do |scope|
context "when displaying #{scope}" do
before do
visit_project_pipelines(scope: scope)
end
it 'contains pipeline commit short SHA' do
expect(page).to have_content(pipeline.short_sha)
end
it 'contains branch name' do
expect(page).to have_content(pipeline.ref)
end
end
end
end
context 'header tabs' do
before do
2017-09-10 17:25:29 +05:30
visit project_pipelines_path(project)
wait_for_requests
2017-08-17 22:00:37 +05:30
end
it 'shows a tab for All pipelines and count' do
2018-03-17 18:26:18 +05:30
expect(page.find('.js-pipelines-tab-all').text).to include('All')
2017-08-17 22:00:37 +05:30
expect(page.find('.js-pipelines-tab-all .badge').text).to include('1')
end
it 'shows a tab for Finished pipelines and count' do
2018-03-17 18:26:18 +05:30
expect(page.find('.js-pipelines-tab-finished').text).to include('Finished')
2017-08-17 22:00:37 +05:30
end
it 'shows a tab for Branches' do
2018-03-17 18:26:18 +05:30
expect(page.find('.js-pipelines-tab-branches').text).to include('Branches')
2017-08-17 22:00:37 +05:30
end
it 'shows a tab for Tags' do
2018-03-17 18:26:18 +05:30
expect(page.find('.js-pipelines-tab-tags').text).to include('Tags')
end
it 'updates content when tab is clicked' do
2020-07-28 23:09:34 +05:30
page.find('.js-pipelines-tab-finished').click
2018-03-17 18:26:18 +05:30
wait_for_requests
2020-07-28 23:09:34 +05:30
expect(page).to have_content('There are currently no finished pipelines.')
2018-03-27 19:54:05 +05:30
end
end
context 'navigation links' do
before do
visit project_pipelines_path(project)
wait_for_requests
end
2021-04-29 21:17:54 +05:30
it 'renders "CI lint" link' do
expect(page).to have_link('CI lint')
2018-03-27 19:54:05 +05:30
end
2021-04-29 21:17:54 +05:30
it 'renders "Run pipeline" link' do
expect(page).to have_link('Run pipeline')
2017-08-17 22:00:37 +05:30
end
end
context 'when pipeline is cancelable' do
let!(:build) do
create(:ci_build, pipeline: pipeline,
2019-02-15 15:39:39 +05:30
stage: 'test')
2017-08-17 22:00:37 +05:30
end
before do
build.run
visit_project_pipelines
end
it 'indicates that pipeline can be canceled' do
expect(page).to have_selector('.js-pipelines-cancel-button')
expect(page).to have_selector('.ci-running')
end
context 'when canceling' do
before do
find('.js-pipelines-cancel-button').click
2021-01-03 14:25:43 +05:30
click_button 'Stop pipeline'
2017-09-10 17:25:29 +05:30
wait_for_requests
2017-08-17 22:00:37 +05:30
end
2019-12-26 22:10:19 +05:30
it 'indicated that pipelines was canceled', :sidekiq_might_not_need_inline do
2017-08-17 22:00:37 +05:30
expect(page).not_to have_selector('.js-pipelines-cancel-button')
expect(page).to have_selector('.ci-canceled')
end
end
end
2019-12-26 22:10:19 +05:30
context 'when pipeline is retryable', :sidekiq_might_not_need_inline do
2017-08-17 22:00:37 +05:30
let!(:build) do
create(:ci_build, pipeline: pipeline,
2019-02-15 15:39:39 +05:30
stage: 'test')
2017-08-17 22:00:37 +05:30
end
before do
build.drop
visit_project_pipelines
end
it 'indicates that pipeline can be retried' do
expect(page).to have_selector('.js-pipelines-retry-button')
expect(page).to have_selector('.ci-failed')
end
context 'when retrying' do
before do
find('.js-pipelines-retry-button').click
2017-09-10 17:25:29 +05:30
wait_for_requests
2017-08-17 22:00:37 +05:30
end
it 'shows running pipeline that is not retryable' do
expect(page).not_to have_selector('.js-pipelines-retry-button')
expect(page).to have_selector('.ci-running')
end
end
end
2022-05-07 20:08:51 +05:30
context 'when pipeline is detached merge request pipeline' do
2022-04-04 11:22:00 +05:30
let(:merge_request) do
create(:merge_request,
:with_detached_merge_request_pipeline,
source_project: source_project,
target_project: target_project)
end
let!(:pipeline) { merge_request.all_pipelines.first }
let(:source_project) { project }
let(:target_project) { project }
before do
visit project_pipelines_path(source_project)
end
shared_examples_for 'detached merge request pipeline' do
it 'shows pipeline information without pipeline ref', :sidekiq_might_not_need_inline do
within '.pipeline-tags' do
2022-05-07 20:08:51 +05:30
expect(page).to have_content(expected_detached_mr_tag)
2022-04-04 11:22:00 +05:30
expect(page).to have_link(merge_request.iid,
href: project_merge_request_path(project, merge_request))
expect(page).not_to have_link(pipeline.ref)
end
end
end
it_behaves_like 'detached merge request pipeline'
context 'when source project is a forked project' do
let(:source_project) { fork_project(project, user, repository: true) }
it_behaves_like 'detached merge request pipeline'
end
end
2022-05-07 20:08:51 +05:30
context 'when pipeline is merge request pipeline' do
2022-04-04 11:22:00 +05:30
let(:merge_request) do
create(:merge_request,
:with_merge_request_pipeline,
source_project: source_project,
target_project: target_project,
merge_sha: target_project.commit.sha)
end
let!(:pipeline) { merge_request.all_pipelines.first }
let(:source_project) { project }
let(:target_project) { project }
before do
visit project_pipelines_path(source_project)
end
shared_examples_for 'Correct merge request pipeline information' do
it 'does not show detached tag for the pipeline, and shows the link of the merge request, and does not show the ref of the pipeline', :sidekiq_might_not_need_inline do
within '.pipeline-tags' do
2022-05-07 20:08:51 +05:30
expect(page).not_to have_content(expected_detached_mr_tag)
2022-04-04 11:22:00 +05:30
expect(page).to have_link(merge_request.iid,
href: project_merge_request_path(project, merge_request))
expect(page).not_to have_link(pipeline.ref)
end
end
end
it_behaves_like 'Correct merge request pipeline information'
context 'when source project is a forked project' do
let(:source_project) { fork_project(project, user, repository: true) }
it_behaves_like 'Correct merge request pipeline information'
end
end
2017-08-17 22:00:37 +05:30
context 'when pipeline has configuration errors' do
let(:pipeline) do
create(:ci_pipeline, :invalid, project: project)
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
it 'contains badge that indicates errors' do
expect(page).to have_content 'yaml invalid'
end
it 'contains badge with tooltip which contains error' do
expect(pipeline).to have_yaml_errors
expect(page).to have_selector(
2020-03-13 15:44:24 +05:30
%Q{span[title="#{pipeline.yaml_errors}"]})
2017-08-17 22:00:37 +05:30
end
2018-03-17 18:26:18 +05:30
it 'contains badge that indicates failure reason' do
expect(page).to have_content 'error'
end
it 'contains badge with tooltip which contains failure reason' do
expect(pipeline.failure_reason?).to eq true
expect(page).to have_selector(
2020-03-13 15:44:24 +05:30
%Q{span[title="#{pipeline.present.failure_reason}"]})
2018-03-17 18:26:18 +05:30
end
2017-08-17 22:00:37 +05:30
end
context 'with manual actions' do
let!(:manual) do
create(:ci_build, :manual,
pipeline: pipeline,
name: 'manual build',
2019-02-15 15:39:39 +05:30
stage: 'test')
2017-08-17 22:00:37 +05:30
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
it 'has a dropdown with play button' do
2021-03-11 19:13:27 +05:30
expect(page).to have_selector('[data-testid="pipelines-manual-actions-dropdown"] [data-testid="play-icon"]')
2017-08-17 22:00:37 +05:30
end
it 'has link to the manual action' do
2021-03-11 19:13:27 +05:30
find('[data-testid="pipelines-manual-actions-dropdown"]').click
2017-08-17 22:00:37 +05:30
2023-06-20 00:43:36 +05:30
wait_for_requests
2017-08-17 22:00:37 +05:30
expect(page).to have_button('manual build')
end
context 'when manual action was played' do
before do
2021-03-11 19:13:27 +05:30
find('[data-testid="pipelines-manual-actions-dropdown"]').click
2023-06-20 00:43:36 +05:30
wait_for_requests
2017-08-17 22:00:37 +05:30
click_button('manual build')
end
2023-07-09 08:55:56 +05:30
it 'enqueues manual action job', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/409984' do
2021-03-11 19:13:27 +05:30
expect(page).to have_selector('[data-testid="pipelines-manual-actions-dropdown"] .gl-dropdown-toggle:disabled')
2017-08-17 22:00:37 +05:30
end
end
end
2018-12-05 23:21:45 +05:30
context 'when there is a delayed job' do
let!(:delayed_job) do
create(:ci_build, :scheduled,
pipeline: pipeline,
2020-11-24 15:15:51 +05:30
name: 'delayed job 1',
2023-06-20 00:43:36 +05:30
stage: 'test',
scheduled_at: 2.hours.since + 2.minutes)
2018-12-05 23:21:45 +05:30
end
before do
visit_project_pipelines
end
it 'has a dropdown for actionable jobs' do
2021-03-11 19:13:27 +05:30
expect(page).to have_selector('[data-testid="pipelines-manual-actions-dropdown"] [data-testid="play-icon"]')
2018-12-05 23:21:45 +05:30
end
it "has link to the delayed job's action" do
2021-03-11 19:13:27 +05:30
find('[data-testid="pipelines-manual-actions-dropdown"]').click
2018-12-05 23:21:45 +05:30
2023-06-20 00:43:36 +05:30
wait_for_requests
2020-11-24 15:15:51 +05:30
expect(page).to have_button('delayed job 1')
2023-06-20 00:43:36 +05:30
time_diff = [0, delayed_job.scheduled_at - Time.zone.now].max
expect(page).to have_content(Time.at(time_diff).utc.strftime("%H:%M"))
2018-12-05 23:21:45 +05:30
end
context 'when delayed job is expired already' do
let!(:delayed_job) do
create(:ci_build, :expired_scheduled,
pipeline: pipeline,
2020-11-24 15:15:51 +05:30
name: 'delayed job 1',
2019-02-15 15:39:39 +05:30
stage: 'test')
2018-12-05 23:21:45 +05:30
end
it "shows 00:00:00 as the remaining time" do
2021-03-11 19:13:27 +05:30
find('[data-testid="pipelines-manual-actions-dropdown"]').click
2018-12-05 23:21:45 +05:30
2023-06-20 00:43:36 +05:30
wait_for_requests
2018-12-05 23:21:45 +05:30
expect(page).to have_content("00:00:00")
end
end
context 'when user played a delayed job immediately' do
2022-11-25 23:54:43 +05:30
let(:manual_action_selector) { '[data-testid="pipelines-manual-actions-dropdown"]' }
2018-12-05 23:21:45 +05:30
before do
2022-11-25 23:54:43 +05:30
find(manual_action_selector).click
2022-04-04 11:22:00 +05:30
accept_gl_confirm do
click_button 'delayed job 1'
end
2022-11-25 23:54:43 +05:30
# Wait for UI to transition to ensure a request has been made
within(manual_action_selector) { find('.gl-spinner') }
within(manual_action_selector) { find('[data-testid="play-icon"]') }
2018-12-05 23:21:45 +05:30
wait_for_requests
end
2023-07-09 08:55:56 +05:30
it 'enqueues the delayed job', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/410129' do
2018-12-05 23:21:45 +05:30
expect(delayed_job.reload).to be_pending
end
end
end
2017-08-17 22:00:37 +05:30
context 'for generic statuses' do
2019-07-07 11:18:12 +05:30
context 'when preparing' do
let!(:pipeline) do
create(:ci_empty_pipeline,
status: 'preparing', project: project)
end
let!(:status) do
create(:generic_commit_status,
:preparing, pipeline: pipeline)
end
before do
visit_project_pipelines
end
it 'is cancelable' do
expect(page).to have_selector('.js-pipelines-cancel-button')
end
it 'shows the pipeline as preparing' do
expect(page).to have_selector('.ci-preparing')
end
end
2017-08-17 22:00:37 +05:30
context 'when running' do
let!(:running) do
create(:generic_commit_status,
status: 'running',
pipeline: pipeline,
stage: 'test')
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
it 'is cancelable' do
expect(page).to have_selector('.js-pipelines-cancel-button')
end
it 'has pipeline running' do
expect(page).to have_selector('.ci-running')
end
context 'when canceling' do
2017-09-10 17:25:29 +05:30
before do
2018-03-17 18:26:18 +05:30
find('.js-pipelines-cancel-button').click
2021-01-03 14:25:43 +05:30
click_button 'Stop pipeline'
2017-09-10 17:25:29 +05:30
end
2017-08-17 22:00:37 +05:30
2019-12-26 22:10:19 +05:30
it 'indicates that pipeline was canceled', :sidekiq_might_not_need_inline do
2017-08-17 22:00:37 +05:30
expect(page).not_to have_selector('.js-pipelines-cancel-button')
expect(page).to have_selector('.ci-canceled')
end
end
end
context 'when failed' do
let!(:status) do
create(:generic_commit_status, :pending,
pipeline: pipeline,
stage: 'test')
end
before do
status.drop
visit_project_pipelines
end
it 'is not retryable' do
expect(page).not_to have_selector('.js-pipelines-retry-button')
end
2019-12-26 22:10:19 +05:30
it 'has failed pipeline', :sidekiq_might_not_need_inline do
2017-08-17 22:00:37 +05:30
expect(page).to have_selector('.ci-failed')
end
end
end
context 'downloadable pipelines' do
context 'with artifacts' do
let!(:with_artifacts) do
2020-06-23 00:09:42 +05:30
build = create(:ci_build, :success,
2017-08-17 22:00:37 +05:30
pipeline: pipeline,
name: 'rspec tests',
stage: 'test')
2020-06-23 00:09:42 +05:30
create(:ci_job_artifact, :codequality, job: build)
2017-08-17 22:00:37 +05:30
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
2021-06-08 01:23:25 +05:30
it 'has artifacts dropdown' do
expect(page).to have_selector('[data-testid="pipeline-multi-actions-dropdown"]')
2017-08-17 22:00:37 +05:30
end
end
context 'with artifacts expired' do
let!(:with_artifacts_expired) do
2018-03-17 18:26:18 +05:30
create(:ci_build, :expired, :success,
2017-08-17 22:00:37 +05:30
pipeline: pipeline,
name: 'rspec',
stage: 'test')
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
2021-06-08 01:23:25 +05:30
it { expect(page).not_to have_selector('[data-testid="artifact-item"]') }
2017-08-17 22:00:37 +05:30
end
context 'without artifacts' do
let!(:without_artifacts) do
create(:ci_build, :success,
pipeline: pipeline,
name: 'rspec',
stage: 'test')
end
2017-09-10 17:25:29 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
2021-06-08 01:23:25 +05:30
it { expect(page).not_to have_selector('[data-testid="artifact-item"]') }
2017-08-17 22:00:37 +05:30
end
2018-03-27 19:54:05 +05:30
context 'with trace artifact' do
before do
create(:ci_build, :success, :trace_artifact, pipeline: pipeline)
visit_project_pipelines
end
it 'does not show trace artifact as artifacts' do
2021-06-08 01:23:25 +05:30
expect(page).not_to have_selector('[data-testid="artifact-item"]')
2018-03-27 19:54:05 +05:30
end
end
2017-08-17 22:00:37 +05:30
end
2021-04-17 20:07:23 +05:30
context 'mini pipeline graph' do
let!(:build) do
create(:ci_build, :pending, pipeline: pipeline,
stage: 'build',
name: 'build')
end
2017-08-17 22:00:37 +05:30
2021-04-17 20:07:23 +05:30
dropdown_selector = '[data-testid="mini-pipeline-graph-dropdown"]'
2017-08-17 22:00:37 +05:30
2021-04-17 20:07:23 +05:30
before do
visit_project_pipelines
end
2017-08-17 22:00:37 +05:30
2021-04-17 20:07:23 +05:30
it 'renders a mini pipeline graph' do
2021-04-29 21:17:54 +05:30
expect(page).to have_selector('[data-testid="pipeline-mini-graph"]')
2021-04-17 20:07:23 +05:30
expect(page).to have_selector(dropdown_selector)
end
2017-08-17 22:00:37 +05:30
2021-04-17 20:07:23 +05:30
context 'when clicking a stage badge' do
it 'opens a dropdown' do
find(dropdown_selector).click
2017-08-17 22:00:37 +05:30
2021-04-17 20:07:23 +05:30
expect(page).to have_link build.name
end
2018-05-09 12:01:36 +05:30
2021-04-17 20:07:23 +05:30
it 'is possible to cancel pending build' do
find(dropdown_selector).click
find('.js-ci-action').click
wait_for_requests
2021-03-11 19:13:27 +05:30
2021-04-17 20:07:23 +05:30
expect(build.reload).to be_canceled
2018-05-09 12:01:36 +05:30
end
2021-04-17 20:07:23 +05:30
end
2018-05-09 12:01:36 +05:30
2021-04-17 20:07:23 +05:30
context 'for a failed pipeline' do
let!(:build) do
create(:ci_build, :failed, pipeline: pipeline,
2022-10-11 01:57:18 +05:30
stage: 'build',
name: 'build')
2021-04-17 20:07:23 +05:30
end
2021-03-11 19:13:27 +05:30
2021-04-17 20:07:23 +05:30
it 'displays the failure reason' do
find(dropdown_selector).click
2018-05-09 12:01:36 +05:30
2021-04-17 20:07:23 +05:30
within('.js-builds-dropdown-list') do
build_element = page.find('.mini-pipeline-graph-dropdown-item')
expect(build_element['title']).to eq('build - failed - (unknown failure)')
2018-05-09 12:01:36 +05:30
end
end
end
2017-08-17 22:00:37 +05:30
end
context 'with pagination' do
before do
allow(Ci::Pipeline).to receive(:default_per_page).and_return(1)
2019-03-02 22:35:43 +05:30
create(:ci_empty_pipeline, project: project)
2017-08-17 22:00:37 +05:30
end
2019-07-07 11:18:12 +05:30
it 'renders pagination' do
2017-09-10 17:25:29 +05:30
visit project_pipelines_path(project)
wait_for_requests
2017-08-17 22:00:37 +05:30
expect(page).to have_selector('.gl-pagination')
end
2019-07-07 11:18:12 +05:30
it 'renders second page of pipelines' do
2017-09-10 17:25:29 +05:30
visit project_pipelines_path(project, page: '2')
wait_for_requests
2017-08-17 22:00:37 +05:30
2020-01-01 13:55:28 +05:30
expect(page).to have_selector('.gl-pagination .page-link', count: 4)
2017-08-17 22:00:37 +05:30
end
2018-03-17 18:26:18 +05:30
2019-07-07 11:18:12 +05:30
it 'shows updated content' do
2018-03-17 18:26:18 +05:30
visit project_pipelines_path(project)
wait_for_requests
2020-01-01 13:55:28 +05:30
page.find('.page-link.next-page-item').click
2018-03-17 18:26:18 +05:30
2020-01-01 13:55:28 +05:30
expect(page).to have_selector('.gl-pagination .page-link', count: 4)
2018-03-17 18:26:18 +05:30
end
2017-08-17 22:00:37 +05:30
end
2021-10-27 15:23:28 +05:30
context 'with pipeline key selection' do
before do
2022-04-04 11:22:00 +05:30
visit project_pipelines_path(project)
wait_for_requests
end
it 'changes the Pipeline ID column for Pipeline IID' do
2023-03-17 16:20:25 +05:30
page.find('[data-testid="pipeline-key-collapsible-box"]').click
2022-04-04 11:22:00 +05:30
2023-04-23 21:23:45 +05:30
within '.gl-new-dropdown-contents' do
dropdown_options = page.find_all '.gl-new-dropdown-item'
2022-04-04 11:22:00 +05:30
dropdown_options[1].click
end
expect(page.find('[data-testid="pipeline-th"]')).to have_content 'Pipeline'
expect(page.find('[data-testid="pipeline-url-link"]')).to have_content "##{pipeline.iid}"
end
end
2017-08-17 22:00:37 +05:30
end
2021-03-11 19:13:27 +05:30
describe 'GET /:project/-/pipelines/show' do
2017-09-10 17:25:29 +05:30
let(:project) { create(:project, :repository) }
2017-08-17 22:00:37 +05:30
let(:pipeline) do
create(:ci_empty_pipeline,
project: project,
sha: project.commit.id,
user: user)
end
2023-03-17 16:20:25 +05:30
let(:external_stage) { create(:ci_stage, name: 'external', pipeline: pipeline) }
2017-08-17 22:00:37 +05:30
before do
create_build('build', 0, 'build', :success)
create_build('test', 1, 'rspec 0:2', :pending)
create_build('test', 1, 'rspec 1:2', :running)
create_build('test', 1, 'spinach 0:2', :created)
create_build('test', 1, 'spinach 1:2', :created)
create_build('test', 1, 'audit', :created)
create_build('deploy', 2, 'production', :created)
2023-03-17 16:20:25 +05:30
create(:generic_commit_status, pipeline: pipeline, ci_stage: external_stage, name: 'jenkins', ref: 'master')
2017-08-17 22:00:37 +05:30
2017-09-10 17:25:29 +05:30
visit project_pipeline_path(project, pipeline)
wait_for_requests
2017-08-17 22:00:37 +05:30
end
it 'shows a graph with grouped stages' do
expect(page).to have_css('.js-pipeline-graph')
# header
expect(page).to have_text("##{pipeline.id}")
2021-12-11 22:18:48 +05:30
expect(page).to have_selector(%Q(img[src="#{pipeline.user.avatar_url}"]))
2017-08-17 22:00:37 +05:30
expect(page).to have_link(pipeline.user.name, href: user_path(pipeline.user))
# stages
2022-10-11 01:57:18 +05:30
expect(page).to have_text('build')
expect(page).to have_text('test')
expect(page).to have_text('deploy')
expect(page).to have_text('external')
2017-08-17 22:00:37 +05:30
# builds
expect(page).to have_text('rspec')
expect(page).to have_text('spinach')
expect(page).to have_text('rspec')
expect(page).to have_text('production')
expect(page).to have_text('jenkins')
end
def create_build(stage, stage_idx, name, status)
create(:ci_build, pipeline: pipeline, stage: stage, stage_idx: stage_idx, name: name, status: status)
end
end
2021-03-11 19:13:27 +05:30
describe 'POST /:project/-/pipelines' do
2017-09-10 17:25:29 +05:30
let(:project) { create(:project, :repository) }
2017-08-17 22:00:37 +05:30
2023-03-04 22:38:38 +05:30
before do
visit new_project_pipeline_path(project)
end
context 'for valid commit', :js do
before do
click_button project.default_branch
wait_for_requests
2023-07-09 08:55:56 +05:30
find('.gl-new-dropdown-item', text: '2-mb-file').click
2023-03-04 22:38:38 +05:30
wait_for_requests
end
2021-06-08 01:23:25 +05:30
context 'with gitlab-ci.yml', :js do
2017-09-10 17:25:29 +05:30
before do
stub_ci_pipeline_to_return_yaml_file
end
2017-08-17 22:00:37 +05:30
it 'creates a new pipeline' do
2021-06-08 01:23:25 +05:30
expect do
2023-07-09 08:55:56 +05:30
find('[data-testid="run_pipeline_button"]', text: 'Run pipeline').click
2021-06-08 01:23:25 +05:30
wait_for_requests
end
2017-08-17 22:00:37 +05:30
.to change { Ci::Pipeline.count }.by(1)
2017-09-10 17:25:29 +05:30
expect(Ci::Pipeline.last).to be_web
2017-08-17 22:00:37 +05:30
end
2018-10-15 14:42:47 +05:30
context 'when variables are specified' do
2023-05-27 22:25:52 +05:30
it 'creates a new pipeline with variables' do
2021-06-08 01:23:25 +05:30
page.within(find("[data-testid='ci-variable-row']")) do
find("[data-testid='pipeline-form-ci-variable-key']").set('key_name')
find("[data-testid='pipeline-form-ci-variable-value']").set('value')
2018-10-15 14:42:47 +05:30
end
2021-06-08 01:23:25 +05:30
expect do
2023-07-09 08:55:56 +05:30
find('[data-testid="run_pipeline_button"]', text: 'Run pipeline').click
2021-06-08 01:23:25 +05:30
wait_for_requests
end
2018-10-15 14:42:47 +05:30
.to change { Ci::Pipeline.count }.by(1)
expect(Ci::Pipeline.last.variables.map { |var| var.slice(:key, :secret_value) })
.to eq [{ key: "key_name", secret_value: "value" }.with_indifferent_access]
end
end
2017-08-17 22:00:37 +05:30
end
context 'without gitlab-ci.yml' do
2017-09-10 17:25:29 +05:30
before do
2023-07-09 08:55:56 +05:30
find('[data-testid="run_pipeline_button"]', text: 'Run pipeline').click
2021-06-08 01:23:25 +05:30
wait_for_requests
2017-09-10 17:25:29 +05:30
end
2017-08-17 22:00:37 +05:30
2020-01-01 13:55:28 +05:30
it { expect(page).to have_content('Missing CI config file') }
2022-08-27 11:52:29 +05:30
2023-05-27 22:25:52 +05:30
it 'creates a pipeline after first request failed and a valid gitlab-ci.yml file is available when trying again' do
2018-03-17 18:26:18 +05:30
stub_ci_pipeline_to_return_yaml_file
2021-06-08 01:23:25 +05:30
expect do
2023-07-09 08:55:56 +05:30
find('[data-testid="run_pipeline_button"]', text: 'Run pipeline').click
2021-06-08 01:23:25 +05:30
wait_for_requests
2018-03-17 18:26:18 +05:30
end
.to change { Ci::Pipeline.count }.by(1)
end
2017-08-17 22:00:37 +05:30
end
2022-10-11 01:57:18 +05:30
end
2017-08-17 22:00:37 +05:30
end
2018-03-17 18:26:18 +05:30
describe 'Reset runner caches' do
let(:project) { create(:project, :repository) }
before do
create(:ci_empty_pipeline, status: 'success', project: project, sha: project.commit.id, ref: 'master')
2018-11-18 11:00:15 +05:30
project.add_maintainer(user)
2018-03-17 18:26:18 +05:30
visit project_pipelines_path(project)
end
it 'has a clear caches button' do
2021-04-29 21:17:54 +05:30
expect(page).to have_button 'Clear runner caches'
2018-03-17 18:26:18 +05:30
end
describe 'user clicks the button' do
context 'when project already has jobs_cache_index' do
before do
2021-04-29 21:17:54 +05:30
project.update!(jobs_cache_index: 1)
2018-03-17 18:26:18 +05:30
end
it 'increments jobs_cache_index' do
2021-04-29 21:17:54 +05:30
click_button 'Clear runner caches'
2018-05-09 12:01:36 +05:30
wait_for_requests
2022-04-04 11:22:00 +05:30
expect(page.find('[data-testid="alert-info"]')).to have_content 'Project cache successfully reset.'
2018-03-17 18:26:18 +05:30
end
end
context 'when project does not have jobs_cache_index' do
it 'sets jobs_cache_index to 1' do
2021-04-29 21:17:54 +05:30
click_button 'Clear runner caches'
2018-05-09 12:01:36 +05:30
wait_for_requests
2022-04-04 11:22:00 +05:30
expect(page.find('[data-testid="alert-info"]')).to have_content 'Project cache successfully reset.'
2018-03-17 18:26:18 +05:30
end
end
end
end
2018-03-27 19:54:05 +05:30
2021-04-29 21:17:54 +05:30
describe 'Run Pipelines' do
let(:project) { create(:project, :repository) }
before do
visit new_project_pipeline_path(project)
end
describe 'new pipeline page' do
it 'has field to add a new pipeline' do
2023-03-17 16:20:25 +05:30
expect(page).to have_button project.default_branch
2021-04-29 21:17:54 +05:30
expect(page).to have_content('Run for')
end
end
describe 'find pipelines' do
it 'shows filtered pipelines', :js do
click_button project.default_branch
2023-07-09 08:55:56 +05:30
send_keys('2-mb-file')
2021-04-29 21:17:54 +05:30
2023-07-09 08:55:56 +05:30
expect_listbox_item('2-mb-file')
2021-04-29 21:17:54 +05:30
end
end
end
2018-03-27 19:54:05 +05:30
describe 'Empty State' do
let(:project) { create(:project, :repository) }
2022-07-16 23:28:13 +05:30
context 'when `ios_specific_templates` is not enabled' do
before do
visit project_pipelines_path(project)
end
it 'renders empty state' do
expect(page).to have_content 'Try test template'
end
2018-03-27 19:54:05 +05:30
end
2022-07-16 23:28:13 +05:30
describe 'when the `ios_specific_templates` experiment is enabled and the "Set up a runner" button is clicked' do
before do
stub_experiments(ios_specific_templates: :candidate)
create(:project_setting, project: project, target_platforms: %w(ios))
visit project_pipelines_path(project)
click_button 'Set up a runner'
end
it 'displays a modal with the macOS platform selected and an explanation popover' do
expect(page).to have_button 'macOS', class: 'selected'
expect(page).to have_selector('#runner-instructions-modal___BV_modal_content_')
expect(page).to have_selector('.popover')
end
2018-03-27 19:54:05 +05:30
end
end
2017-08-17 22:00:37 +05:30
end
context 'when user is not logged in' do
before do
2018-11-20 20:47:30 +05:30
project.update!(auto_devops_attributes: { enabled: false })
2017-09-10 17:25:29 +05:30
visit project_pipelines_path(project)
2017-08-17 22:00:37 +05:30
end
context 'when project is public' do
2017-09-10 17:25:29 +05:30
let(:project) { create(:project, :public, :repository) }
2017-08-17 22:00:37 +05:30
2018-03-27 19:54:05 +05:30
context 'without pipelines' do
it { expect(page).to have_content 'This project is not currently set up to run pipelines.' }
end
2017-08-17 22:00:37 +05:30
end
context 'when project is private' do
2017-09-10 17:25:29 +05:30
let(:project) { create(:project, :private, :repository) }
2017-08-17 22:00:37 +05:30
2019-10-31 01:37:42 +05:30
it 'redirects the user to sign_in and displays the flash alert' do
expect(page).to have_content 'You need to sign in'
2022-05-07 20:08:51 +05:30
expect(page).to have_current_path("/users/sign_in")
2019-10-31 01:37:42 +05:30
end
2017-08-17 22:00:37 +05:30
end
end
def visit_project_pipelines(**query)
2017-09-10 17:25:29 +05:30
visit project_pipelines_path(project, query)
wait_for_requests
2017-08-17 22:00:37 +05:30
end
end