From a89fb014a3f520d44351489bca73a42f3d4d42e8 Mon Sep 17 00:00:00 2001 From: Olivier Gonzalez Date: Mon, 5 Nov 2018 18:56:52 -0500 Subject: Backport generic methods to CE Allow to fetch all pipelines for every projects in a group and its subgroups. Allow to fetch the latest pipeline id for each projects of a group and its subgroups. --- spec/models/ci/pipeline_spec.rb | 13 +++++++++++++ spec/models/namespace_spec.rb | 11 +++++++++++ 2 files changed, 24 insertions(+) (limited to 'spec/models') diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 153244b2159..0f58c06864e 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -1148,6 +1148,19 @@ describe Ci::Pipeline, :mailer do end end + describe '.latest_successful_ids_per_project' do + let(:projects) { create_list(:project, 2) } + let!(:pipeline1) { create(:ci_pipeline, :success, project: projects[0]) } + let!(:pipeline2) { create(:ci_pipeline, :success, project: projects[0]) } + let!(:pipeline3) { create(:ci_pipeline, :failed, project: projects[0]) } + let!(:pipeline4) { create(:ci_pipeline, :success, project: projects[1]) } + + it 'returns expected pipeline ids' do + expect(described_class.latest_successful_ids_per_project) + .to contain_exactly(pipeline2, pipeline4) + end + end + describe '.internal_sources' do subject { described_class.internal_sources } diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb index 8913644a3ce..2db42fe802a 100644 --- a/spec/models/namespace_spec.rb +++ b/spec/models/namespace_spec.rb @@ -562,6 +562,17 @@ describe Namespace do it { expect(group.all_projects.to_a).to match_array([project2, project1]) } end + describe '#all_pipelines' do + let(:group) { create(:group) } + let(:child) { create(:group, parent: group) } + let!(:project1) { create(:project_empty_repo, namespace: group) } + let!(:project2) { create(:project_empty_repo, namespace: child) } + let!(:pipeline1) { create(:ci_empty_pipeline, project: project1) } + let!(:pipeline2) { create(:ci_empty_pipeline, project: project2) } + + it { expect(group.all_pipelines.to_a).to match_array([pipeline1, pipeline2]) } + end + describe '#share_with_group_lock with subgroups', :nested_groups do context 'when creating a subgroup' do let(:subgroup) { create(:group, parent: root_group )} -- cgit v1.2.1 From b3020aaffd1d04319c1d9a06b73a3dd7d93514de Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Mon, 5 Nov 2018 09:37:40 +0900 Subject: Squashed commit of the following: commit 931d6ab0e025b0268d94e455f736b09a025e0578 Merge: b34d165320d 93846eb152f Author: Shinya Maeda Date: Mon Nov 5 09:36:58 2018 +0900 Merge branch 'master-ce' into stateful_deployments commit b34d165320d6f3298c8b776ba66270a59c217412 Author: Shinya Maeda Date: Fri Nov 2 18:07:08 2018 +0900 Fix flaky spec commit b5e0527c5d4fe8f18b2fdda5916bae9b8cd859a4 Author: Shinya Maeda Date: Fri Nov 2 15:32:03 2018 +0900 Fix spec commit f78a5e96e66fe2d25086df495e339b470a274df8 Author: Shinya Maeda Date: Fri Nov 2 14:59:29 2018 +0900 Remove unnecessary line in schema.rb commit 6ce7c483e0591b5d6f9588a99853834327b80031 Author: Shinya Maeda Date: Fri Nov 2 14:55:48 2018 +0900 Add partial index for filling deployment at migration commit aecccfb5118c8982db3ba502fdf37b5e639fbfc6 Author: Shinya Maeda Date: Fri Nov 2 14:42:24 2018 +0900 Fix fill empty finished at migration commit 0199e1761ad1b391ae87a53a9a113d3256529e0e Author: Shinya Maeda Date: Fri Nov 2 14:19:44 2018 +0900 Fix flaky spec commit 56ac84cd8095afab5b909119445537b7da06a2ff Author: Shinya Maeda Date: Fri Nov 2 10:06:49 2018 +0900 Fix guard clause to prevent multiple deployments to a job commit 521561b6b303b54635c30cb23d78e49d14cec53d Author: Shinya Maeda Date: Thu Nov 1 20:19:24 2018 +0900 Fix spec commit 2878da0d29b9bd2dde69a1b216203df118dd59a1 Author: Shinya Maeda Date: Thu Nov 1 19:38:59 2018 +0900 Simplify the factory commit 22fd7df02133f3a21828554965fd5619905eac2c Author: Shinya Maeda Date: Thu Nov 1 19:33:50 2018 +0900 Simplify the Deployable and BuildSuccessWorker commit 41108959677ed614f4548443a2f4303c4c04925a Author: Shinya Maeda Date: Thu Nov 1 18:34:20 2018 +0900 Fix spec commit ae75fe7461ac72f621498797f478d42331342b84 Author: Shinya Maeda Date: Thu Nov 1 17:19:12 2018 +0900 Fix weird virtual deployment status commit 380fee7494d06407dccc292c3cbedbcee7b6e235 Author: Shinya Maeda Date: Thu Nov 1 15:59:31 2018 +0900 Fix spec commit 29889fcbaadb3bbfd2f11c10bfbf5dceb3e3ddba Author: Shinya Maeda Date: Thu Nov 1 15:07:10 2018 +0900 Fix coding offence commit 36ac13f345f5ef25725c2236a791a40a3a9e6126 Author: Shinya Maeda Date: Thu Nov 1 14:22:17 2018 +0900 Squashed commit of the following: commit ba9aede922e1643db3f06c56736d46d6d86d356b Author: Shinya Maeda Date: Thu Nov 1 14:21:33 2018 +0900 Fix ambiguious factory specification in update deployment service spec commit 013afb5668cb30dc4ca5b21945c17b341e7ea7f9 Author: Shinya Maeda Date: Thu Nov 1 14:10:24 2018 +0900 Fix spec commit 78793670d049e2dfb5fc98177eb4d10f20b9310b Author: Shinya Maeda Date: Wed Oct 31 18:26:12 2018 +0900 Fix spec commit 73d27e87c66698f2e3a817bb8728f02475b7ba4f Author: Shinya Maeda Date: Wed Oct 31 16:22:14 2018 +0900 Fix index commit 8580a226ea68bf5e49b35bfb5f404968bbfaf8e9 Author: Shinya Maeda Date: Wed Oct 31 15:34:57 2018 +0900 Fix deployment relationships in Ci::Build commit d6d28b55afd1179200b4f5188e0b53079ff3c1a7 Author: Shinya Maeda Date: Wed Oct 31 15:27:53 2018 +0900 Fix spec commit 94eb754e2e1bb9a1fe627f86823f571a8298d27b Author: Shinya Maeda Date: Wed Oct 31 14:07:11 2018 +0900 Fix spec commit 0b30f80bcd08a7a06bdde3378ec1733f865284be Author: Shinya Maeda Date: Tue Oct 30 20:15:31 2018 +0900 Fix spec commit 466bdcdb6af8cdb475c9fa16bd7d1dff23b11e40 Author: Shinya Maeda Date: Tue Oct 30 19:28:51 2018 +0900 Fix spec commit a7c3caac99139e70fe3f1f3d14856939fa25c527 Author: Shinya Maeda Date: Tue Oct 30 17:33:47 2018 +0900 Fix factory commit cea28ae100532e6711ce1d22676719a94e2da8a0 Author: Shinya Maeda Date: Tue Oct 30 16:28:18 2018 +0900 Drop leagacy success commit 3785d685eabc10b6597cf3db67bf08385ccf298a Author: Shinya Maeda Date: Tue Oct 30 15:37:28 2018 +0900 Remove unnecessary migration file commit 0d597fa46eeffdbb9a4afb53005a8183e433c6bf Author: Shinya Maeda Date: Tue Oct 30 15:35:53 2018 +0900 Fix schema.rb commit ec3c2abc6944e09f6410468ae5e356865ec7b02b Author: Shinya Maeda Date: Tue Oct 30 15:34:21 2018 +0900 Rename post migration file commit 0e7281885a84656acf95f0f423732680f8fec076 Author: Shinya Maeda Date: Tue Oct 30 15:31:01 2018 +0900 Remove include EnumWithNil commit b3846d59c07e07275126c70361bde7f30810729e Author: Shinya Maeda Date: Tue Oct 30 15:05:50 2018 +0900 Decouple action commit c9f9ba4eae9ca1edc7d8751e1d2e0572cb222d9c Author: Shinya Maeda Date: Tue Oct 30 14:23:29 2018 +0900 Remove status mock commit d95bfea1ca67b3a27a3226a669c2b1266d696682 Author: Shinya Maeda Date: Tue Oct 30 14:17:14 2018 +0900 Add action commit 0cec39e0f76c22a18498f46d65ad7226fb30c3f8 Author: Shinya Maeda Date: Tue Oct 30 13:44:07 2018 +0900 Remove unnecessary line in schema.rb commit 7b4c5f8e1b00dd8e6aa944352f9d8a9f3ae6f1c7 Author: Shinya Maeda Date: Mon Oct 29 19:59:41 2018 +0900 Revert build success worker commit 0c52ffa4a23eea488c187317e8b400369846f399 Author: Shinya Maeda Date: Mon Oct 29 19:11:47 2018 +0900 Use add_column_with_default properly commit ba9bae357da5dfd2f6ec05f7f9db9d0b31224f48 Author: Shinya Maeda Date: Mon Oct 29 18:40:55 2018 +0900 Fix with_status commit 75dffc97b9c5f6fa73d9d09b125c8f849fa2caae Author: Shinya Maeda Date: Mon Oct 29 16:26:56 2018 +0900 Remove unnecessary line in schema.rb commit 25188ccc52fb29ca63b9205c4d95ffc2e0afadee Author: Shinya Maeda Date: Mon Oct 29 16:26:17 2018 +0900 Set default values in regular migration commit 98ea037fbf39c8d9f0db77fb50e2d08382425158 Author: Shinya Maeda Date: Fri Oct 26 17:27:49 2018 +0900 Fix static analysis commit e7d1765f77f9ff9b94a34985a7855bdaab1da675 Author: Shinya Maeda Date: Fri Oct 26 16:37:10 2018 +0900 Remove empty spec commit 0033f521ed1eae8117dba231961aa47c068bbcfb Author: Shinya Maeda Date: Fri Oct 26 16:34:55 2018 +0900 Simplify spec changes commit 0be4c6b3ade6d9a8bf28bcd177c66ebd7bb7d20a Author: Shinya Maeda Date: Fri Oct 26 16:32:45 2018 +0900 Simplify spec changes commit a93d25d79df7e25bdf688fc938c712922f9dc4df Author: Shinya Maeda Date: Fri Oct 26 16:02:31 2018 +0900 Fix flaky spec commit 339ad50cf471ca706b29f008ccd2bb881dd5b776 Author: Shinya Maeda Date: Fri Oct 26 15:06:22 2018 +0900 Rename Deployments Success worker commit bd69c78085adcb9b0f8ff9b7041ae355953ad7ab Author: Shinya Maeda Date: Fri Oct 26 14:43:03 2018 +0900 Fix coding offence commit 004748b2a9c5236ec13eb01289418f3d6571c92c Author: Shinya Maeda Date: Thu Oct 25 20:09:10 2018 +0900 Rename to update deployment service commit b04a85e761de501f030f3844fd485a2b9e46f7f7 Author: Shinya Maeda Date: Thu Oct 25 18:46:52 2018 +0900 Add spec for Project commit 548af23a5a07f0c20b72849d03aa0b98a0b49134 Author: Shinya Maeda Date: Thu Oct 25 18:43:25 2018 +0900 Fix spec commit c977e4d3f17194c46a1bf857b473017ce21ef7e9 Author: Shinya Maeda Date: Thu Oct 25 17:58:07 2018 +0900 Add spec for Environment commit 73feb9010f8d8093bee4b46e56d30cfef3e8e34a Author: Shinya Maeda Date: Thu Oct 25 17:39:24 2018 +0900 Add spec for Deployment model commit 9a3cfbf766f402571588839375cf311bb9807035 Author: Shinya Maeda Date: Thu Oct 25 17:18:02 2018 +0900 Fix statis analysis commit a30d28dbc631a29855883ca89c592a10c012f1d2 Author: Shinya Maeda Date: Thu Oct 25 17:17:32 2018 +0900 Ignore nil instance commit fa6fdd89f380e588a6bcf14b1f9aef0d14d3854b Author: Shinya Maeda Date: Thu Oct 25 16:20:40 2018 +0900 Add spec for deployable concern commit aa91186821dc671df2c7a641e37586dd5dfc1008 Author: Shinya Maeda Date: Thu Oct 25 15:37:23 2018 +0900 Clean up deployable commit 34d3e18731f7906a3db250b105a64d1db83c2fca Author: Shinya Maeda Date: Thu Oct 25 15:13:05 2018 +0900 Fix 17 cycle analytics commit 8dc9e00408f9b390175e7d5ea743eed4fb9e3f79 Author: Shinya Maeda Date: Thu Oct 25 13:56:51 2018 +0900 Fix static analysys commit 5c4175807a537bafc4b889b0a97e8f96f0e483cd Author: Shinya Maeda Date: Wed Oct 24 15:05:05 2018 +0900 Skip unnecessary sidekiq worker commit 9d8b5d423f49cc247c96ce3767d03b4af305809f Author: Shinya Maeda Date: Wed Oct 24 14:53:13 2018 +0900 Add changelog commit c8cabba496722240cadf7c161c80bceb09727cba Author: Shinya Maeda Date: Wed Oct 24 14:44:45 2018 +0900 Squashed commit of the following: commit f7643885ac2329e18d690a4e4f2d7614b732c793 Author: Shinya Maeda Date: Tue Oct 23 19:38:45 2018 +0900 Fix deployment widget specs commit 03bd04b5c98b634dff6a0ab4292c150a9031995c Author: Shinya Maeda Date: Tue Oct 23 17:50:16 2018 +0900 Fix env status spec commit 4a49c6502b161a12f0f62d5ec167dff777047dab Author: Shinya Maeda Date: Tue Oct 23 17:48:59 2018 +0900 Fix environment spec commit 4044822887987e20a703990ff20352a532eeb965 Author: Shinya Maeda Date: Tue Oct 23 17:47:17 2018 +0900 Fix environment spec commit 9939d44b7eb9da371de74c0f04fed1eb3db37ad3 Author: Shinya Maeda Date: Tue Oct 23 15:45:43 2018 +0900 Add a new spec for deployment success worker commit f61c4d3657b5ef13b5da171460da68a6643ad4b5 Author: Shinya Maeda Date: Tue Oct 23 15:38:11 2018 +0900 Fix cycle analytics helper commit b6242615e8298fb7fc047c8df8006c25ad717c70 Author: Shinya Maeda Date: Tue Oct 23 14:41:54 2018 +0900 Fix cycle analysis helper commit 9a001cb4c4ed6f3b87dc612bdffc60a6b2b0a132 Author: Shinya Maeda Date: Tue Oct 23 14:37:08 2018 +0900 Ignore coding offence in build success worker's spec commit 1fb88583025bac8a56172cbd59be04258ea4c5f3 Author: Shinya Maeda Date: Tue Oct 23 14:33:11 2018 +0900 Added more spec for deployments commit 1a6ba97ababbf62e8dd0ae0c56d75ab1268fd0ce Author: Shinya Maeda Date: Mon Oct 22 19:36:50 2018 +0900 Move after create hookd into success worker commit 09de5fed5d6f108423779cf9d9e7f1d21f3c1c91 Author: Shinya Maeda Date: Mon Oct 22 19:30:06 2018 +0900 Fix build spec commit 73a55cbcabbb1e928eca3e53e8ff75dec178bc90 Author: Shinya Maeda Date: Mon Oct 22 19:08:43 2018 +0900 Fix update_deployment_metrics_service_spec.rb commit ee05136a02ae9fa348b4b89b9a69937ebb9697dd Author: Shinya Maeda Date: Mon Oct 22 17:32:05 2018 +0900 Remove unnecessary degelate commit e246ddeebc01a807ccc36fdb484c3e72ad91e680 Author: Shinya Maeda Date: Mon Oct 22 16:07:39 2018 +0900 Remove unnecessary optimistic locking commit dcc225c8237b90e3bc8dcc3dc2e3252e0b0be093 Author: Shinya Maeda Date: Mon Oct 22 16:00:22 2018 +0900 Simplify status replication commit 13a5fd7afb67ba2712fcaecaea5fedf05f9ad177 Author: Shinya Maeda Date: Mon Oct 22 15:29:24 2018 +0900 Fix sidekiq queue names commit dcc796f48d523538e1c91b9cd3e1c7065e5329b1 Author: Shinya Maeda Date: Mon Oct 22 15:23:55 2018 +0900 Revert success check in update_merge_request_metrics commit 129ef083d637d4acb8c97a6d9ab96deb2ff6efcd Author: Shinya Maeda Date: Mon Oct 22 15:18:31 2018 +0900 Fix queue name of deployment success worker commit 10fe5a6484f4f02322ce5bb16844fc7b1d565963 Author: Shinya Maeda Date: Mon Oct 22 15:09:42 2018 +0900 Introduce deployable module commit d91260bbe105bf46f6c06d9e9593c8c4cd5139cf Author: Shinya Maeda Date: Mon Oct 22 14:05:31 2018 +0900 Add database index for successful deployments commit 74274147263de4b60870065a19935498ce662e30 Author: Shinya Maeda Date: Mon Oct 22 13:51:59 2018 +0900 Fix invalid state transition commit ff18463cc847bf3cf5a3e49f3651eedfdf67c7e6 Author: Shinya Maeda Date: Fri Oct 19 20:05:15 2018 +0900 Fix coding style offence commit 0202c0f5b631601edab7b359b087b307f5eb7ba3 Author: Shinya Maeda Date: Fri Oct 19 18:34:07 2018 +0900 Target only successful deployments from other relations commit 1f2758cb030dec1df5dda30f6bc3e25b6d0841c9 Author: Shinya Maeda Date: Fri Oct 19 18:21:28 2018 +0900 Add namespace explicitly commit 3d9227b6e5642cecde88d4edac925125f6474b11 Author: Shinya Maeda Date: Fri Oct 19 17:42:30 2018 +0900 Fix spec in DeleteInconsistentInternalIdRecords commit 3e0cc99ff6c5c7188511618228a6ec027752ce69 Author: Shinya Maeda Date: Fri Oct 19 16:10:16 2018 +0900 Fixed spec commit 8de09b8bb31f7b9f24ecdf9f2dd8ef358a260263 Author: Shinya Maeda Date: Fri Oct 19 14:22:35 2018 +0900 Fix create deployment service commit 31957570b4444492eeb412e765f96a56416c25f3 Author: Shinya Maeda Date: Thu Oct 18 20:21:26 2018 +0900 Move CreateDeploymentService. Fix Cycle analytics spec and fixture. commit d2eb433a1bb9710c0d4778c4f34c12b6b64f60e6 Author: Shinya Maeda Date: Thu Oct 18 20:11:22 2018 +0900 Fix build success worker commit 25e6cd87138bcdb69de8785ca367e479c8dbcc59 Author: Shinya Maeda Date: Thu Oct 18 19:49:13 2018 +0900 Fix create deployment service spec commit d268bf410bf65e86c81eb76d50aa8e145b32d249 Author: Shinya Maeda Date: Thu Oct 18 19:01:23 2018 +0900 Fix cycle analysys spec's deployment commit 525ade8aa1e4394ed8a759bb0437e407fbe74a35 Author: Shinya Maeda Date: Thu Oct 18 18:24:04 2018 +0900 Fix factory to set legacy status by default commit c6a990821ac0a1ffa49e20e2d78d94b8ce075914 Author: Shinya Maeda Date: Thu Oct 18 17:25:40 2018 +0900 Remove unnecessary lib from deployment commit a6107e0e85ac26ee09da3316ebc11de32f067d82 Author: Shinya Maeda Date: Wed Oct 17 17:38:58 2018 +0900 Fix recursive call commit 15c5f3b64061a75af3c3039ca7f49b1cc4ff3068 Author: Shinya Maeda Date: Wed Oct 17 17:30:44 2018 +0900 Add finished_at commit c8d3d70366f694d78acb7e30d342c7697798b922 Author: Shinya Maeda Date: Wed Oct 17 15:55:31 2018 +0900 Fix last_deployment methods as it used to return successful deployment always commit 96bbe8670cece021766fde95fe573cbbe23d1e55 Author: Shinya Maeda Date: Wed Oct 17 15:49:57 2018 +0900 Redefine statuses commit c86a9d0bd2ab3e7a00bf61f094a96ee99b76b289 Author: Shinya Maeda Date: Wed Oct 17 14:50:27 2018 +0900 Fix schema.rb commit 9ff5f0eaafbc08795018c7bb282b19f6327dee21 Author: Shinya Maeda Date: Wed Oct 17 14:18:04 2018 +0900 Default status nil to success commit 5928bd9bb94e1e8908ed1561e01595be84d5f4ec Author: Shinya Maeda Date: Tue Oct 16 15:13:48 2018 +0900 Add status to Deployment --- spec/models/ci/build_spec.rb | 126 ++++++++++++++++++----- spec/models/concerns/deployable_spec.rb | 45 ++++++++ spec/models/deployment_spec.rb | 176 ++++++++++++++++++++++++++++++-- spec/models/environment_spec.rb | 86 ++++++++++++++-- spec/models/environment_status_spec.rb | 4 +- spec/models/merge_request_spec.rb | 8 +- spec/models/project_spec.rb | 34 ++++++ 7 files changed, 431 insertions(+), 48 deletions(-) create mode 100644 spec/models/concerns/deployable_spec.rb (limited to 'spec/models') diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index 4089f099fdf..2e65a6a2a0f 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -17,8 +17,8 @@ describe Ci::Build do it { is_expected.to belong_to(:runner) } it { is_expected.to belong_to(:trigger_request) } it { is_expected.to belong_to(:erased_by) } - it { is_expected.to have_many(:deployments) } it { is_expected.to have_many(:trace_sections)} + it { is_expected.to have_one(:deployment) } it { is_expected.to have_one(:runner_session)} it { is_expected.to validate_presence_of(:ref) } it { is_expected.to respond_to(:has_trace?) } @@ -799,17 +799,100 @@ describe Ci::Build do end end + describe 'state transition as a deployable' do + let!(:build) { create(:ci_build, :start_review_app) } + let(:deployment) { build.deployment } + let(:environment) { deployment.environment } + + it 'has deployments record with created status' do + expect(deployment).to be_created + expect(environment.name).to eq('review/master') + end + + context 'when transits to running' do + before do + build.run! + end + + it 'transits deployment status to running' do + expect(deployment).to be_running + end + end + + context 'when transits to success' do + before do + allow(Deployments::SuccessWorker).to receive(:perform_async) + build.success! + end + + it 'transits deployment status to success' do + expect(deployment).to be_success + end + end + + context 'when transits to failed' do + before do + build.drop! + end + + it 'transits deployment status to failed' do + expect(deployment).to be_failed + end + end + + context 'when transits to skipped' do + before do + build.skip! + end + + it 'transits deployment status to canceled' do + expect(deployment).to be_canceled + end + end + + context 'when transits to canceled' do + before do + build.cancel! + end + + it 'transits deployment status to canceled' do + expect(deployment).to be_canceled + end + end + end + + describe '#on_stop' do + subject { build.on_stop } + + context 'when a job has a specification that it can be stopped from the other job' do + let(:build) { create(:ci_build, :start_review_app) } + + it 'returns the other job name' do + is_expected.to eq('stop_review_app') + end + end + + context 'when a job does not have environment information' do + let(:build) { create(:ci_build) } + + it 'returns nil' do + is_expected.to be_nil + end + end + end + describe 'deployment' do - describe '#last_deployment' do - subject { build.last_deployment } + describe '#has_deployment?' do + subject { build.has_deployment? } + + context 'when build has a deployment' do + let!(:deployment) { create(:deployment, deployable: build) } - context 'when multiple deployments are created' do - let!(:deployment1) { create(:deployment, deployable: build) } - let!(:deployment2) { create(:deployment, deployable: build) } + it { is_expected.to be_truthy } + end - it 'returns the latest one' do - is_expected.to eq(deployment2) - end + context 'when build does not have a deployment' do + it { is_expected.to be_falsy } end end @@ -818,14 +901,14 @@ describe Ci::Build do context 'when build succeeded' do let(:build) { create(:ci_build, :success) } - let!(:deployment) { create(:deployment, deployable: build) } + let!(:deployment) { create(:deployment, :success, deployable: build) } context 'current deployment is latest' do it { is_expected.to be_falsey } end context 'current deployment is not latest on environment' do - let!(:deployment2) { create(:deployment, environment: deployment.environment) } + let!(:deployment2) { create(:deployment, :success, environment: deployment.environment) } it { is_expected.to be_truthy } end @@ -3209,10 +3292,14 @@ describe Ci::Build do end describe '#deployment_status' do + before do + allow_any_instance_of(described_class).to receive(:create_deployment) + end + context 'when build is a last deployment' do let(:build) { create(:ci_build, :success, environment: 'production') } let(:environment) { create(:environment, name: 'production', project: build.project) } - let!(:deployment) { create(:deployment, environment: environment, project: environment.project, deployable: build) } + let!(:deployment) { create(:deployment, :success, environment: environment, project: environment.project, deployable: build) } it { expect(build.deployment_status).to eq(:last) } end @@ -3220,8 +3307,8 @@ describe Ci::Build do context 'when there is a newer build with deployment' do let(:build) { create(:ci_build, :success, environment: 'production') } let(:environment) { create(:environment, name: 'production', project: build.project) } - let!(:deployment) { create(:deployment, environment: environment, project: environment.project, deployable: build) } - let!(:last_deployment) { create(:deployment, environment: environment, project: environment.project) } + let!(:deployment) { create(:deployment, :success, environment: environment, project: environment.project, deployable: build) } + let!(:last_deployment) { create(:deployment, :success, environment: environment, project: environment.project) } it { expect(build.deployment_status).to eq(:out_of_date) } end @@ -3229,7 +3316,7 @@ describe Ci::Build do context 'when build with deployment has failed' do let(:build) { create(:ci_build, :failed, environment: 'production') } let(:environment) { create(:environment, name: 'production', project: build.project) } - let!(:deployment) { create(:deployment, environment: environment, project: environment.project, deployable: build) } + let!(:deployment) { create(:deployment, :success, environment: environment, project: environment.project, deployable: build) } it { expect(build.deployment_status).to eq(:failed) } end @@ -3237,14 +3324,7 @@ describe Ci::Build do context 'when build with deployment is running' do let(:build) { create(:ci_build, environment: 'production') } let(:environment) { create(:environment, name: 'production', project: build.project) } - let!(:deployment) { create(:deployment, environment: environment, project: environment.project, deployable: build) } - - it { expect(build.deployment_status).to eq(:creating) } - end - - context 'when build is successful but deployment is not ready yet' do - let(:build) { create(:ci_build, :success, environment: 'production') } - let(:environment) { create(:environment, name: 'production', project: build.project) } + let!(:deployment) { create(:deployment, :success, environment: environment, project: environment.project, deployable: build) } it { expect(build.deployment_status).to eq(:creating) } end diff --git a/spec/models/concerns/deployable_spec.rb b/spec/models/concerns/deployable_spec.rb new file mode 100644 index 00000000000..e30e9689717 --- /dev/null +++ b/spec/models/concerns/deployable_spec.rb @@ -0,0 +1,45 @@ +require 'rails_helper' + +describe Deployable do + describe '#create_deployment' do + let(:deployment) { job.deployment } + let(:environment) { deployment&.environment } + + before do + job.reload + end + + context 'when the deployable object will deploy to production' do + let!(:job) { create(:ci_build, :start_review_app) } + + it 'creates a deployment and environment record' do + expect(deployment.project).to eq(job.project) + expect(deployment.ref).to eq(job.ref) + expect(deployment.tag).to eq(job.tag) + expect(deployment.sha).to eq(job.sha) + expect(deployment.user).to eq(job.user) + expect(deployment.deployable).to eq(job) + expect(deployment.on_stop).to eq('stop_review_app') + expect(environment.name).to eq('review/master') + end + end + + context 'when the deployable object has already had a deployment' do + let!(:job) { create(:ci_build, :start_review_app, deployment: race_deployment) } + let!(:race_deployment) { create(:deployment, :success) } + + it 'does not create a new deployment' do + expect(deployment).to eq(race_deployment) + end + end + + context 'when the deployable object will not deploy' do + let!(:job) { create(:ci_build) } + + it 'does not create a deployment and environment record' do + expect(deployment).to be_nil + expect(environment).to be_nil + end + end + end +end diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb index 146d35122f7..06c1e9c8c6a 100644 --- a/spec/models/deployment_spec.rb +++ b/spec/models/deployment_spec.rb @@ -42,16 +42,174 @@ describe Deployment do end end - describe 'after_create callbacks' do - let(:environment) { create(:environment) } - let(:store) { Gitlab::EtagCaching::Store.new } + describe '.success' do + subject { described_class.success } - it 'invalidates the environment etag cache' do - old_value = store.get(environment.etag_cache_key) + context 'when deployment status is success' do + let(:deployment) { create(:deployment, :success) } - create(:deployment, environment: environment) + it { is_expected.to eq([deployment]) } + end + + context 'when deployment status is created' do + let(:deployment) { create(:deployment, :created) } + + it { is_expected.to be_empty } + end + + context 'when deployment status is running' do + let(:deployment) { create(:deployment, :running) } + + it { is_expected.to be_empty } + end + end + + describe 'state machine' do + context 'when deployment runs' do + let(:deployment) { create(:deployment) } + + before do + deployment.run! + end + + it 'starts running' do + Timecop.freeze do + expect(deployment).to be_running + expect(deployment.finished_at).to be_nil + end + end + end + + context 'when deployment succeeded' do + let(:deployment) { create(:deployment, :running) } + + it 'has correct status' do + Timecop.freeze do + deployment.succeed! + + expect(deployment).to be_success + expect(deployment.finished_at).to eq(Time.now) + end + end + + it 'executes Deployments::SuccessWorker asynchronously' do + expect(Deployments::SuccessWorker) + .to receive(:perform_async).with(deployment.id) - expect(store.get(environment.etag_cache_key)).not_to eq(old_value) + deployment.succeed! + end + end + + context 'when deployment failed' do + let(:deployment) { create(:deployment, :running) } + + it 'has correct status' do + Timecop.freeze do + deployment.drop! + + expect(deployment).to be_failed + expect(deployment.finished_at).to eq(Time.now) + end + end + end + + context 'when deployment was canceled' do + let(:deployment) { create(:deployment, :running) } + + it 'has correct status' do + Timecop.freeze do + deployment.cancel! + + expect(deployment).to be_canceled + expect(deployment.finished_at).to eq(Time.now) + end + end + end + end + + describe '#success?' do + subject { deployment.success? } + + context 'when deployment status is success' do + let(:deployment) { create(:deployment, :success) } + + it { is_expected.to be_truthy } + end + + context 'when deployment status is failed' do + let(:deployment) { create(:deployment, :failed) } + + it { is_expected.to be_falsy } + end + end + + describe '#status_name' do + subject { deployment.status_name } + + context 'when deployment status is success' do + let(:deployment) { create(:deployment, :success) } + + it { is_expected.to eq(:success) } + end + + context 'when deployment status is failed' do + let(:deployment) { create(:deployment, :failed) } + + it { is_expected.to eq(:failed) } + end + end + + describe '#finished_at' do + subject { deployment.finished_at } + + context 'when deployment status is created' do + let(:deployment) { create(:deployment) } + + it { is_expected.to be_nil } + end + + context 'when deployment status is success' do + let(:deployment) { create(:deployment, :success) } + + it { is_expected.to eq(deployment.read_attribute(:finished_at)) } + end + + context 'when deployment status is success' do + let(:deployment) { create(:deployment, :success, finished_at: nil) } + + before do + deployment.update_column(:finished_at, nil) + end + + it { is_expected.to eq(deployment.read_attribute(:created_at)) } + end + + context 'when deployment status is running' do + let(:deployment) { create(:deployment, :running) } + + it { is_expected.to be_nil } + end + end + + describe '#deployed_at' do + subject { deployment.deployed_at } + + context 'when deployment status is created' do + let(:deployment) { create(:deployment) } + + it { is_expected.to be_nil } + end + + context 'when deployment status is success' do + let(:deployment) { create(:deployment, :success) } + + it { is_expected.to eq(deployment.read_attribute(:finished_at)) } + end + + context 'when deployment status is running' do + let(:deployment) { create(:deployment, :running) } + + it { is_expected.to be_nil } end end @@ -112,7 +270,7 @@ describe Deployment do end describe '#metrics' do - let(:deployment) { create(:deployment) } + let(:deployment) { create(:deployment, :success) } let(:prometheus_adapter) { double('prometheus_adapter', can_query?: true) } subject { deployment.metrics } @@ -141,7 +299,7 @@ describe Deployment do describe '#additional_metrics' do let(:project) { create(:project, :repository) } - let(:deployment) { create(:deployment, project: project) } + let(:deployment) { create(:deployment, :succeed, project: project) } subject { deployment.additional_metrics } diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index 1de95d881a7..e121369f6ac 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -95,7 +95,7 @@ describe Environment do context 'with a last deployment' do let!(:deployment) do - create(:deployment, environment: environment, sha: project.commit('master').id) + create(:deployment, :success, environment: environment, sha: project.commit('master').id) end context 'in the same branch' do @@ -136,8 +136,8 @@ describe Environment do describe '#first_deployment_for' do let(:project) { create(:project, :repository) } - let!(:deployment) { create(:deployment, environment: environment, ref: commit.parent.id) } - let!(:deployment1) { create(:deployment, environment: environment, ref: commit.id) } + let!(:deployment) { create(:deployment, :succeed, environment: environment, ref: commit.parent.id) } + let!(:deployment1) { create(:deployment, :succeed, environment: environment, ref: commit.id) } let(:head_commit) { project.commit } let(:commit) { project.commit.parent } @@ -181,7 +181,8 @@ describe Environment do let(:build) { create(:ci_build) } let!(:deployment) do - create(:deployment, environment: environment, + create(:deployment, :success, + environment: environment, deployable: build, on_stop: 'close_app') end @@ -249,7 +250,8 @@ describe Environment do let(:build) { create(:ci_build, pipeline: pipeline) } let!(:deployment) do - create(:deployment, environment: environment, + create(:deployment, :success, + environment: environment, deployable: build, on_stop: 'close_app') end @@ -304,7 +306,7 @@ describe Environment do context 'when last deployment to environment is the most recent one' do before do - create(:deployment, environment: environment, ref: 'feature') + create(:deployment, :success, environment: environment, ref: 'feature') end it { is_expected.to be true } @@ -312,8 +314,8 @@ describe Environment do context 'when last deployment to environment is not the most recent' do before do - create(:deployment, environment: environment, ref: 'feature') - create(:deployment, environment: environment, ref: 'master') + create(:deployment, :success, environment: environment, ref: 'feature') + create(:deployment, :success, environment: environment, ref: 'master') end it { is_expected.to be false } @@ -321,7 +323,7 @@ describe Environment do end describe '#actions_for' do - let(:deployment) { create(:deployment, environment: environment) } + let(:deployment) { create(:deployment, :success, environment: environment) } let(:pipeline) { deployment.deployable.pipeline } let!(:review_action) { create(:ci_build, :manual, name: 'review-apps', pipeline: pipeline, environment: 'review/$CI_COMMIT_REF_NAME' )} let!(:production_action) { create(:ci_build, :manual, name: 'production', pipeline: pipeline, environment: 'production' )} @@ -331,6 +333,70 @@ describe Environment do end end + describe '.deployments' do + subject { environment.deployments } + + context 'when there is a deployment record with created status' do + let(:deployment) { create(:deployment, :created, environment: environment) } + + it 'does not return the record' do + is_expected.to be_empty + end + end + + context 'when there is a deployment record with running status' do + let(:deployment) { create(:deployment, :running, environment: environment) } + + it 'does not return the record' do + is_expected.to be_empty + end + end + + context 'when there is a deployment record with success status' do + let(:deployment) { create(:deployment, :success, environment: environment) } + + it 'returns the record' do + is_expected.to eq([deployment]) + end + end + end + + describe '.last_deployment' do + subject { environment.last_deployment } + + before do + allow_any_instance_of(Deployment).to receive(:create_ref) + end + + context 'when there is an old deployment record' do + let!(:previous_deployment) { create(:deployment, :success, environment: environment) } + + context 'when there is a deployment record with created status' do + let!(:deployment) { create(:deployment, environment: environment) } + + it 'returns the previous deployment' do + is_expected.to eq(previous_deployment) + end + end + + context 'when there is a deployment record with running status' do + let!(:deployment) { create(:deployment, :running, environment: environment) } + + it 'returns the previous deployment' do + is_expected.to eq(previous_deployment) + end + end + + context 'when there is a deployment record with success status' do + let!(:deployment) { create(:deployment, :success, environment: environment) } + + it 'returns the latest successful deployment' do + is_expected.to eq(deployment) + end + end + end + end + describe '#has_terminals?' do subject { environment.has_terminals? } @@ -338,7 +404,7 @@ describe Environment do context 'with a deployment service' do shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do context 'and a deployment' do - let!(:deployment) { create(:deployment, environment: environment) } + let!(:deployment) { create(:deployment, :success, environment: environment) } it { is_expected.to be_truthy } end diff --git a/spec/models/environment_status_spec.rb b/spec/models/environment_status_spec.rb index e7805d52d75..52b98552184 100644 --- a/spec/models/environment_status_spec.rb +++ b/spec/models/environment_status_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe EnvironmentStatus do - let(:deployment) { create(:deployment, :review_app) } + let(:deployment) { create(:deployment, :succeed, :review_app) } let(:environment) { deployment.environment} let(:project) { deployment.project } let(:merge_request) { create(:merge_request, :deployed_review_app, deployment: deployment) } @@ -12,7 +12,7 @@ describe EnvironmentStatus do it { is_expected.to delegate_method(:id).to(:environment) } it { is_expected.to delegate_method(:name).to(:environment) } it { is_expected.to delegate_method(:project).to(:environment) } - it { is_expected.to delegate_method(:deployed_at).to(:deployment).as(:created_at) } + it { is_expected.to delegate_method(:deployed_at).to(:deployment) } it { is_expected.to delegate_method(:status).to(:deployment) } describe '#project' do diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 2eb5e39ccfd..3a54725c7ec 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -1836,8 +1836,8 @@ describe MergeRequest do let(:environments) { create_list(:environment, 3, project: project) } before do - create(:deployment, environment: environments.first, ref: 'master', sha: project.commit('master').id) - create(:deployment, environment: environments.second, ref: 'feature', sha: project.commit('feature').id) + create(:deployment, :success, environment: environments.first, ref: 'master', sha: project.commit('master').id) + create(:deployment, :success, environment: environments.second, ref: 'feature', sha: project.commit('feature').id) end it 'selects deployed environments' do @@ -1857,7 +1857,7 @@ describe MergeRequest do let(:source_environment) { create(:environment, project: source_project) } before do - create(:deployment, environment: source_environment, ref: 'feature', sha: merge_request.diff_head_sha) + create(:deployment, :success, environment: source_environment, ref: 'feature', sha: merge_request.diff_head_sha) end it 'selects deployed environments' do @@ -1868,7 +1868,7 @@ describe MergeRequest do let(:target_environment) { create(:environment, project: project) } before do - create(:deployment, environment: target_environment, tag: true, sha: merge_request.diff_head_sha) + create(:deployment, :success, environment: target_environment, tag: true, sha: merge_request.diff_head_sha) end it 'selects deployed environments' do diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 84326724118..f020557e4af 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -3976,6 +3976,40 @@ describe Project do end end + describe '.deployments' do + subject { project.deployments } + + let(:project) { create(:project) } + + before do + allow_any_instance_of(Deployment).to receive(:create_ref) + end + + context 'when there is a deployment record with created status' do + let(:deployment) { create(:deployment, :created, project: project) } + + it 'does not return the record' do + is_expected.to be_empty + end + end + + context 'when there is a deployment record with running status' do + let(:deployment) { create(:deployment, :running, project: project) } + + it 'does not return the record' do + is_expected.to be_empty + end + end + + context 'when there is a deployment record with success status' do + let(:deployment) { create(:deployment, :success, project: project) } + + it 'returns the record' do + is_expected.to eq([deployment]) + end + end + end + def rugged_config rugged_repo(project.repository).config end -- cgit v1.2.1 From 5f47ebaa6c8e675637459649e541c3a48f174cb5 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Tue, 6 Nov 2018 10:52:55 +0900 Subject: Create deployments only if action: start --- spec/models/concerns/deployable_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'spec/models') diff --git a/spec/models/concerns/deployable_spec.rb b/spec/models/concerns/deployable_spec.rb index e30e9689717..ac79c75a55e 100644 --- a/spec/models/concerns/deployable_spec.rb +++ b/spec/models/concerns/deployable_spec.rb @@ -24,6 +24,14 @@ describe Deployable do end end + context 'when the deployable object will stop an environment' do + let!(:job) { create(:ci_build, :stop_review_app) } + + it 'does not create a deployment record' do + expect(deployment).to be_nil + end + end + context 'when the deployable object has already had a deployment' do let!(:job) { create(:ci_build, :start_review_app, deployment: race_deployment) } let!(:race_deployment) { create(:deployment, :success) } -- cgit v1.2.1 From ef68b8737f49b119f2350fc8a3502afb4f46d210 Mon Sep 17 00:00:00 2001 From: Toon Claes Date: Tue, 6 Nov 2018 07:02:01 +0100 Subject: Don't care about order when getting awarded issues Fixing failing master: https://gitlab.com/gitlab-org/gitlab-ce/-/jobs/116776474 --- spec/models/concerns/awardable_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'spec/models') diff --git a/spec/models/concerns/awardable_spec.rb b/spec/models/concerns/awardable_spec.rb index debc02fa51f..5713106418d 100644 --- a/spec/models/concerns/awardable_spec.rb +++ b/spec/models/concerns/awardable_spec.rb @@ -37,8 +37,8 @@ describe Awardable do create(:award_emoji, awardable: issue3, name: "star", user: award_emoji.user) create(:award_emoji, awardable: issue3, name: "star", user: award_emoji2.user) - expect(Issue.awarded(award_emoji.user)).to eq [issue, issue3] - expect(Issue.awarded(award_emoji2.user)).to eq [issue2, issue3] + expect(Issue.awarded(award_emoji.user)).to contain_exactly(issue, issue3) + expect(Issue.awarded(award_emoji2.user)).to contain_exactly(issue2, issue3) end end -- cgit v1.2.1 From 202df2fbbcbcaaf4e4136863256dc068d045178b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Trzci=C5=84ski?= Date: Mon, 5 Nov 2018 23:52:15 +0100 Subject: Backport support project security dashboard changes --- spec/models/ci/pipeline_spec.rb | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'spec/models') diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 153244b2159..b5154ab8579 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -1043,6 +1043,11 @@ describe Ci::Pipeline, :mailer do expect(described_class.newest_first.pluck(:status)) .to eq(%w[skipped failed success canceled]) end + + it 'searches limited backlog' do + expect(described_class.newest_first(limit: 1).pluck(:status)) + .to eq(%w[skipped]) + end end describe '.latest_status' do -- cgit v1.2.1 From 0206c6aa4189d9c1bc9967c22b120c26b6441c72 Mon Sep 17 00:00:00 2001 From: Jasper Maes Date: Tue, 6 Nov 2018 21:11:34 +0100 Subject: Rails5: fix mysql milliseconds issue in deployment model specs --- spec/models/deployment_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'spec/models') diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb index 06c1e9c8c6a..270b2767c68 100644 --- a/spec/models/deployment_spec.rb +++ b/spec/models/deployment_spec.rb @@ -88,7 +88,7 @@ describe Deployment do deployment.succeed! expect(deployment).to be_success - expect(deployment.finished_at).to eq(Time.now) + expect(deployment.finished_at).to be_like_time(Time.now) end end @@ -108,7 +108,7 @@ describe Deployment do deployment.drop! expect(deployment).to be_failed - expect(deployment.finished_at).to eq(Time.now) + expect(deployment.finished_at).to be_like_time(Time.now) end end end @@ -121,7 +121,7 @@ describe Deployment do deployment.cancel! expect(deployment).to be_canceled - expect(deployment.finished_at).to eq(Time.now) + expect(deployment.finished_at).to be_like_time(Time.now) end end end -- cgit v1.2.1