diff --git a/app/assets/javascripts/jobs/bridge/components/sidebar.vue b/app/assets/javascripts/jobs/bridge/components/sidebar.vue index 9c7ae1178ea44ff363d9a5c33eafd500c178a59b..34cefb0d0e20346512a15064764194b118424511 100644 --- a/app/assets/javascripts/jobs/bridge/components/sidebar.vue +++ b/app/assets/javascripts/jobs/bridge/components/sidebar.vue @@ -1,6 +1,7 @@ <script> import { GlButton, GlDropdown, GlDropdownItem } from '@gitlab/ui'; import { __ } from '~/locale'; +import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate/tooltip_on_truncate.vue'; import { JOB_SIDEBAR } from '../../constants'; import CommitBlock from '../../components/commit_block.vue'; @@ -25,6 +26,7 @@ export default { GlDropdownItem, TooltipOnTruncate, }, + mixins: [glFeatureFlagsMixin()], props: { bridgeJob: { type: Object, @@ -54,7 +56,10 @@ export default { </h4> </tooltip-on-truncate> <!-- TODO: implement retry actions --> - <div class="gl-flex-grow-1 gl-flex-shrink-0 gl-text-right"> + <div + v-if="glFeatures.triggerJobRetryAction" + class="gl-flex-grow-1 gl-flex-shrink-0 gl-text-right" + > <gl-dropdown :text="$options.i18n.retryButton" category="primary" diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb index fa7c62c34dd978d154fa2893b264ce0e461b17a1..bfc2fe6432d4b16254f5380d58d2e15e6251e95f 100644 --- a/app/controllers/projects/jobs_controller.rb +++ b/app/controllers/projects/jobs_controller.rb @@ -19,6 +19,7 @@ class Projects::JobsController < Projects::ApplicationController before_action do push_frontend_feature_flag(:infinitely_collapsible_sections, @project, default_enabled: :yaml) + push_frontend_feature_flag(:trigger_job_retry_action, @project, default_enabled: :yaml) end layout 'project' diff --git a/config/feature_flags/development/trigger_job_retry_action.yml b/config/feature_flags/development/trigger_job_retry_action.yml new file mode 100644 index 0000000000000000000000000000000000000000..79a8593fd05797bc1ed5befe77fc2d8bc1cb9380 --- /dev/null +++ b/config/feature_flags/development/trigger_job_retry_action.yml @@ -0,0 +1,8 @@ +--- +name: trigger_job_retry_action +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/77951 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/349966 +milestone: '14.7' +type: development +group: group::pipeline authoring +default_enabled: false diff --git a/spec/frontend/jobs/bridge/components/sidebar_spec.js b/spec/frontend/jobs/bridge/components/sidebar_spec.js index 9debbb14c306679e73f5f792a08aa32deff2e69d..03f5a15f288ec8e055f5d8db4188be84216d111f 100644 --- a/spec/frontend/jobs/bridge/components/sidebar_spec.js +++ b/spec/frontend/jobs/bridge/components/sidebar_spec.js @@ -7,12 +7,16 @@ import { mockCommit, mockJob } from '../mock_data'; describe('Bridge Sidebar', () => { let wrapper; - const createComponent = (props) => { + const createComponent = ({ featureFlag } = {}) => { wrapper = shallowMount(BridgeSidebar, { + provide: { + glFeatures: { + triggerJobRetryAction: featureFlag, + }, + }, propsData: { bridgeJob: mockJob, commit: mockCommit, - ...props, }, }); }; @@ -35,10 +39,6 @@ describe('Bridge Sidebar', () => { expect(findJobTitle().text()).toBe(mockJob.name); }); - it('renders retry dropdown', () => { - expect(findRetryDropdown().exists()).toBe(true); - }); - it('renders commit information', () => { expect(findCommitBlock().exists()).toBe(true); }); @@ -57,4 +57,24 @@ describe('Bridge Sidebar', () => { expect(wrapper.emitted('toggleSidebar')).toHaveLength(1); }); }); + + describe('retry action', () => { + describe('when feature flag is ON', () => { + beforeEach(() => { + createComponent({ featureFlag: true }); + }); + + it('renders retry dropdown', () => { + expect(findRetryDropdown().exists()).toBe(true); + }); + }); + + describe('when feature flag is OFF', () => { + it('does not render retry dropdown', () => { + createComponent({ featureFlag: false }); + + expect(findRetryDropdown().exists()).toBe(false); + }); + }); + }); });