From 060c56870a16d5a17e4c21926110228970665aaa Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Tue, 6 Nov 2018 22:08:33 +0900 Subject: [PATCH] Squashed commit of the following: commit 5aa6032526c7270b8793f62b9a5e66c0ce79c3b9 Merge: cfb05ed27a3 1cf4aa02397 Author: Shinya Maeda Date: Tue Nov 6 22:07:12 2018 +0900 Merge branch 'master-ce' into fix-environment-status-in-merge-request-widget commit cfb05ed27a37f815721372731882af8c6a6efd54 Author: Shinya Maeda Date: Tue Nov 6 20:59:15 2018 +0900 Add proxy status for frontend commit e6b3d65c53d97285b4f1575146b44a540e3fc4bf Author: Shinya Maeda Date: Tue Nov 6 20:47:23 2018 +0900 Prevent nil exception in environment status commit 23d4e37ebd83615326e749cce43178208e5ff76c Author: Shinya Maeda Date: Tue Nov 6 18:36:06 2018 +0900 Fix typo in spec commit 963b0fcedeaf22b949d9f3cef4b662146c9c003d Author: Shinya Maeda Date: Tue Nov 6 18:22:20 2018 +0900 Add feature spec commit 9cff0225cc8da1b787207b06858ef6a63ad7513f Author: Shinya Maeda Date: Tue Nov 6 17:19:55 2018 +0900 Fix 19 environments fixtures commit 7c8eaf7b1fc95fea4f0ae4cf21d291ce7009fb05 Author: Shinya Maeda Date: Tue Nov 6 16:18:08 2018 +0900 Remove spec for first_deployment_for commit d42cc1e0894a8132a4c543f7ff133e37a4670a2b Author: Shinya Maeda Date: Tue Nov 6 16:16:52 2018 +0900 Fix 14_pipelines fixture commit ef12bdcb4e82f8347f6b8ced253e98c804f3ad4f Author: Shinya Maeda Date: Tue Nov 6 15:31:38 2018 +0900 Save environment object in Start Environment Service commit 55e12a55b86a783f9d470573288f3a94d8bb0a88 Author: Shinya Maeda Date: Tue Nov 6 14:49:55 2018 +0900 Fix spec and add spec for deployed? and stopped? commit 64d9527e824e5a7af60db05881f095c24f0c60c9 Author: Shinya Maeda Date: Tue Nov 6 14:26:36 2018 +0900 Fix flaky spec commit 4c623409d8b53ec8904d790f5137adc8a0ce1f2e Author: Shinya Maeda Date: Tue Nov 6 14:21:46 2018 +0900 Optimize queries commit 4ab4364e868927873fb39a406a9d74f7c89761c6 Author: Shinya Maeda Date: Tue Nov 6 13:44:08 2018 +0900 Dry up the implementation commit 53ba2f8a54bd78b0cad03b7f83fdf0837ccb1d74 Merge: 3aa2fe502ee 65a7a6e5a26 Author: Shinya Maeda Date: Tue Nov 6 13:39:15 2018 +0900 Merge branch 'stateful_deployments' into fix-environment-status-in-merge-request-widget commit 3aa2fe502eee00e42894e4bac13f50a76c67e816 Author: Shinya Maeda Date: Tue Nov 6 13:25:56 2018 +0900 Create scope for deployed and stopped commit 3a9c59a6ee1a2e225b916b9485851d50163f5fae Author: Shinya Maeda Date: Tue Nov 6 12:55:44 2018 +0900 Add spec for stop environmet service commit 1a982dda6939debeb994aff799a86c9f480d977d Merge: f716f4ff670 56226498bf7 Author: Shinya Maeda Date: Tue Nov 6 11:47:11 2018 +0900 Merge branch 'stateful_deployments' into fix-environment-status-in-merge-request-widget commit f716f4ff6705aae279b07c6c93d4dafd6ce925e6 Author: Shinya Maeda Date: Tue Nov 6 11:44:26 2018 +0900 Define environmet services explicitly commit 774d236f3851731f8650534a5ce19a950274497c Author: Shinya Maeda Date: Tue Nov 6 11:10:23 2018 +0900 Fix conflicts commit 320544b042c08e9e2f190d95ab5d988c37b3b7e7 Merge: 826fc250814 5f47ebaa6c8 Author: Shinya Maeda Date: Tue Nov 6 11:07:06 2018 +0900 Merge branch 'stateful_deployments' into fix-environment-status-in-merge-request-widget commit 826fc25081489ea646ddcdc626fc7cd120ed39a2 Author: Shinya Maeda Date: Mon Nov 5 22:44:59 2018 +0900 Fix typo commit dd21e9a21fffcce6b1ffcb2ff389bb8f018bbd33 Author: Shinya Maeda Date: Mon Nov 5 22:35:12 2018 +0900 Add spec commit f131e3bc36b995b70befc7556b2aa5ca287e3313 Author: Shinya Maeda Date: Mon Nov 5 20:09:59 2018 +0900 Update changelog commit a2f93fcc40e6ad4c0aa54a3e597869e594cab730 Author: Shinya Maeda Date: Mon Nov 5 20:01:12 2018 +0900 Fix fork project problem in first_deployment_for commit aa778934069559eaf10d8fa2c107d0b7550e6ff6 Author: Shinya Maeda Date: Mon Nov 5 19:06:46 2018 +0900 Remove unnecessary changes commit 93c4b58e4d78558ff02ef09be1214683343c505b Author: Shinya Maeda Date: Mon Nov 5 15:56:26 2018 +0900 Efficient way to search deployment commit 99653d025ea431f00c6fa09cbf0b91f39f9f6e34 Author: Shinya Maeda Date: Mon Nov 5 15:23:41 2018 +0900 Fix environment status commit 5dda167e394a008008d2829763adea0c1488b850 Author: Shinya Maeda Date: Mon Nov 5 10:09:49 2018 +0900 Add tests for action column commit 52f7b09127d19f956c289c72d15ca8ab817b8d70 Author: Shinya Maeda Date: Mon Nov 5 10:05:05 2018 +0900 Fix conflicts commit c63626c3b5ec1aecb45f7766cb6438e9c6229a0c Author: Shinya Maeda Date: Mon Nov 5 10:03:56 2018 +0900 Fix unnecessary changes commit 8077e1237a56befdfb3211165b7ef888e00f9712 Merge: 06946cbec9e d1b59cf6fb0 Author: Shinya Maeda Date: Mon Nov 5 10:01:51 2018 +0900 Merge branch 'stateful_deployments' into add-action-to-deployment commit d1b59cf6fb089d954334ce28a61c122846cea491 Author: Shinya Maeda Date: Mon Nov 5 09:37:40 2018 +0900 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 commit 06946cbec9e76398cdf2c590fd13e3f71c04595f Merge: 1ac4a7fed37 20b59da2ea3 Author: Shinya Maeda Date: Fri Nov 2 10:14:22 2018 +0900 Merge branch 'stateful_deployments' into add-action-to-deployment commit 20b59da2ea3ae850e8b2e823013536c2c7275156 Author: Shinya Maeda Date: Fri Nov 2 10:06:49 2018 +0900 Fix guard clause to prevent multiple deployments to a job commit 1ac4a7fed376ba8dd1e692af0e197d55cc1cb900 Merge: 34bd4866c16 7aade362361 Author: Shinya Maeda Date: Thu Nov 1 20:21:25 2018 +0900 Merge branch 'stateful_deployments' into add-action-to-deployment commit 7aade362361af7eedf1db50dc46369187fce21cc Author: Shinya Maeda Date: Thu Nov 1 20:19:24 2018 +0900 Fix spec commit 90d05b1c0cb09658f02739ad8a53ef74238aa8cf Author: Shinya Maeda Date: Thu Nov 1 19:38:59 2018 +0900 Simplify the factory commit 1fbdd07c48821ea8a138932dd3c401eb85ae5ca3 Author: Shinya Maeda Date: Thu Nov 1 19:33:50 2018 +0900 Simplify the Deployable and BuildSuccessWorker commit 519765699b90dd92ddef6d1f5cde5123c7d4b473 Author: Shinya Maeda Date: Thu Nov 1 18:34:20 2018 +0900 Fix spec commit e88f464d275e743af590b4dac6f8a636023ed9b7 Author: Shinya Maeda Date: Thu Nov 1 17:19:12 2018 +0900 Fix weird virtual deployment status commit 2f493a948bdedc54d8d06e802090795a146b7085 Author: Shinya Maeda Date: Thu Nov 1 15:59:31 2018 +0900 Fix spec commit 34bd4866c161bc02333b0e9e7a710110885e8bd0 Author: Shinya Maeda Date: Thu Nov 1 15:34:10 2018 +0900 Revert unnecessary changes commit bbdc18d4e697d953f4f3320815eae2767049a922 Author: Shinya Maeda Date: Thu Nov 1 15:32:27 2018 +0900 Simplify the implementation commit 3bd7996919613adbe517c633e30f4f06555df7dc Author: Shinya Maeda Date: Thu Nov 1 15:27:11 2018 +0900 Add changelog commit 210631ac3ecc01361238a1ff296949da36ea4773 Author: Shinya Maeda Date: Thu Nov 1 15:22:44 2018 +0900 Add action to deployment commit 9bd4b2e8b1b86dda98b8cad6886a8075f75f28d4 Author: Shinya Maeda Date: Thu Nov 1 15:07:10 2018 +0900 Fix coding offence commit c5c6871699f880689621d776564b8e0bb7729eda 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 --- .../projects/deployments_controller.rb | 4 +- .../projects/environments_controller.rb | 2 +- app/finders/environments_finder.rb | 2 +- app/models/concerns/deployable.rb | 5 +- app/models/deployment.rb | 17 ++- app/models/environment.rb | 16 +- app/models/environment_status.rb | 42 ++--- app/models/project.rb | 2 +- ...ervice.rb => start_environment_service.rb} | 11 +- app/services/stop_environment_service.rb | 18 +++ app/workers/build_success_worker.rb | 7 - app/workers/deployments/success_worker.rb | 8 +- .../unreleased/add-action-to-deployment.yml | 5 + db/fixtures/development/14_pipelines.rb | 8 +- db/fixtures/development/19_environments.rb | 20 ++- ...0181030150739_add_action_to_deployments.rb | 24 +++ ...20181106135939_add_index_to_deployments.rb | 23 +++ db/schema.rb | 7 +- lib/api/deployments.rb | 4 +- lib/gitlab/cycle_analytics/summary/deploy.rb | 2 +- spec/factories/deployments.rb | 8 + .../user_sees_deployment_widget_spec.rb | 114 ++++++++++++-- .../projects/environments/environment_spec.rb | 52 +++++++ .../environments/environments_spec.rb | 35 ++++- spec/models/concerns/deployable_spec.rb | 10 +- spec/models/deployment_spec.rb | 144 ++++++++++++++++++ spec/models/environment_spec.rb | 79 +++++++--- spec/models/environment_status_spec.rb | 81 +++++++++- .../environment_status_entity_spec.rb | 1 + ...c.rb => start_environment_service_spec.rb} | 6 +- .../services/stop_environment_service_spec.rb | 43 ++++++ spec/workers/build_success_worker_spec.rb | 13 -- .../deployments/success_worker_spec.rb | 51 ++++--- 33 files changed, 720 insertions(+), 144 deletions(-) rename app/services/{update_deployment_service.rb => start_environment_service.rb} (85%) create mode 100644 app/services/stop_environment_service.rb create mode 100644 changelogs/unreleased/add-action-to-deployment.yml create mode 100644 db/migrate/20181030150739_add_action_to_deployments.rb create mode 100644 db/migrate/20181106135939_add_index_to_deployments.rb rename spec/services/{update_deployment_service_spec.rb => start_environment_service_spec.rb} (97%) create mode 100644 spec/services/stop_environment_service_spec.rb diff --git a/app/controllers/projects/deployments_controller.rb b/app/controllers/projects/deployments_controller.rb index 0a009477d61..bd4102d4531 100644 --- a/app/controllers/projects/deployments_controller.rb +++ b/app/controllers/projects/deployments_controller.rb @@ -6,7 +6,7 @@ class Projects::DeploymentsController < Projects::ApplicationController # rubocop: disable CodeReuse/ActiveRecord def index - deployments = environment.deployments.reorder(created_at: :desc) + deployments = environment.deployments.deployed.reorder(created_at: :desc) deployments = deployments.where('created_at > ?', params[:after].to_time) if params[:after]&.to_time render json: { deployments: DeploymentSerializer.new(project: project) @@ -47,7 +47,7 @@ class Projects::DeploymentsController < Projects::ApplicationController # rubocop: disable CodeReuse/ActiveRecord def deployment - @deployment ||= environment.deployments.find_by(iid: params[:id]) + @deployment ||= environment.deployments.deployed.find_by(iid: params[:id]) end # rubocop: enable CodeReuse/ActiveRecord diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index de10783df1a..ab3ad9bf090 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -58,7 +58,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController # rubocop: disable CodeReuse/ActiveRecord def show - @deployments = environment.deployments.order(id: :desc).page(params[:page]) + @deployments = environment.deployments.deployed.order(id: :desc).page(params[:page]) end # rubocop: enable CodeReuse/ActiveRecord diff --git a/app/finders/environments_finder.rb b/app/finders/environments_finder.rb index 419be46fafe..156d49745c9 100644 --- a/app/finders/environments_finder.rb +++ b/app/finders/environments_finder.rb @@ -9,7 +9,7 @@ class EnvironmentsFinder # rubocop: disable CodeReuse/ActiveRecord def execute - deployments = project.deployments + deployments = project.deployments.deployed deployments = if ref deployments_query = params[:with_tags] ? 'ref = :ref OR tag IS TRUE' : 'ref = :ref' diff --git a/app/models/concerns/deployable.rb b/app/models/concerns/deployable.rb index f4f1989f0a9..d85d624fff3 100644 --- a/app/models/concerns/deployable.rb +++ b/app/models/concerns/deployable.rb @@ -7,7 +7,7 @@ module Deployable after_create :create_deployment def create_deployment - return unless starts_environment? && !has_deployment? + return unless has_environment? && !has_deployment? environment = project.environments.find_or_create_by( name: expanded_environment_name @@ -21,7 +21,8 @@ module Deployable sha: sha, user: user, deployable: self, - on_stop: on_stop).tap do |_| + on_stop: on_stop, + action: environment_action).tap do |_| self.reload # Reload relationships end end diff --git a/app/models/deployment.rb b/app/models/deployment.rb index 54a900a3b85..322b3139759 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -18,6 +18,8 @@ class Deployment < ActiveRecord::Base delegate :name, to: :environment, prefix: true scope :for_environment, -> (environment) { where(environment_id: environment) } + scope :deployed, -> { success.start } + scope :stopped, -> { success.stop } state_machine :status, initial: :created do event :run do @@ -55,6 +57,11 @@ class Deployment < ActiveRecord::Base canceled: 4 } + enum action: { + start: 1, + stop: 2 + } + def self.last_for_environment(environment) ids = self .for_environment(environment) @@ -130,7 +137,7 @@ class Deployment < ActiveRecord::Base def previous_deployment @previous_deployment ||= - project.deployments.joins(:environment) + project.deployments.deployed.joins(:environment) .where(environments: { name: self.environment.name }, ref: self.ref) .where.not(id: self.id) .take @@ -175,6 +182,14 @@ class Deployment < ActiveRecord::Base metrics&.merge(deployment_time: finished_at.to_i) || {} end + def deployed? + success? && start? + end + + def stopped? + success? && stop? + end + private def prometheus_adapter diff --git a/app/models/environment.rb b/app/models/environment.rb index 7d104bb0c25..1a535ba6b18 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -8,9 +8,9 @@ class Environment < ActiveRecord::Base belongs_to :project, required: true - has_many :deployments, -> { success }, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent + has_many :deployments, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent - has_one :last_deployment, -> { success.order('deployments.id DESC') }, class_name: 'Deployment' + has_one :last_deployment, -> { deployed.order('deployments.id DESC') }, class_name: 'Deployment' before_validation :nullify_external_url before_validation :generate_slug, if: ->(env) { env.slug.blank? } @@ -50,6 +50,7 @@ class Environment < ActiveRecord::Base scope :in_review_folder, -> { where(environment_type: "review") } scope :for_name, -> (name) { where(name: name) } scope :for_project, -> (project) { where(project_id: project) } + scope :with_deployment, -> (sha) { where('EXISTS (?)', Deployment.select(1).start.where('deployments.environment_id = environments.id').where(sha: sha)) } state_machine :state, initial: :available do event :start do @@ -95,22 +96,13 @@ class Environment < ActiveRecord::Base end def last_deployed_at - last_deployment.try(:created_at) + last_deployment.try(:finished_at) end def update_merge_request_metrics? folder_name == "production" end - def first_deployment_for(commit_sha) - ref = project.repository.ref_name_for_sha(ref_path, commit_sha) - - return nil unless ref - - deployment_iid = ref.split('/').last - deployments.find_by(iid: deployment_iid) - end - def ref_path "refs/#{Repository::REF_ENVIRONMENTS}/#{slug}" end diff --git a/app/models/environment_status.rb b/app/models/environment_status.rb index 7efc8da09ad..b33c4f2738d 100644 --- a/app/models/environment_status.rb +++ b/app/models/environment_status.rb @@ -8,17 +8,16 @@ class EnvironmentStatus delegate :id, to: :environment delegate :name, to: :environment delegate :project, to: :environment - delegate :status, to: :deployment, allow_nil: true delegate :deployed_at, to: :deployment, allow_nil: true def self.for_merge_request(mr, user) - build_environments_status(mr, user, mr.head_pipeline) + build_environments_status(mr, user, mr.diff_head_sha) end def self.after_merge_request(mr, user) return [] unless mr.merged? - build_environments_status(mr, user, mr.merge_pipeline) + build_environments_status(mr, user, mr.merge_commit_sha) end def initialize(environment, merge_request, sha) @@ -29,7 +28,7 @@ class EnvironmentStatus def deployment strong_memoize(:deployment) do - environment.first_deployment_for(sha) + environment.deployments.start.find_by_sha(sha) end end @@ -44,6 +43,20 @@ class EnvironmentStatus .merge_request_diff_files.where(deleted_file: false) end + ## + # Since frontend has not supported all statuses yet, BE has to + # proxy some status to a supported status. + def status + case deployment.status + when 'created' + 'running' + when 'canceled' + 'failed' + else + deployment.status + end + end + private PAGE_EXTENSIONS = /\A\.(s?html?|php|asp|cgi|pl)\z/i.freeze @@ -61,21 +74,14 @@ class EnvironmentStatus } end - def self.build_environments_status(mr, user, pipeline) - return [] unless pipeline.present? + def self.build_environments_status(mr, user, sha) + Environment.where(project_id: [mr.source_project_id, mr.target_project_id]) + .available + .with_deployment(sha).map do |environment| + next unless Ability.allowed?(user, :read_environment, environment) - find_environments(user, pipeline).map do |environment| - EnvironmentStatus.new(environment, mr, pipeline.sha) - end + EnvironmentStatus.new(environment, mr, sha) + end.compact end private_class_method :build_environments_status - - def self.find_environments(user, pipeline) - env_ids = Deployment.where(deployable: pipeline.builds).select(:environment_id) - - Environment.available.where(id: env_ids).select do |environment| - Ability.allowed?(user, :read_environment, environment) - end - end - private_class_method :find_environments end diff --git a/app/models/project.rb b/app/models/project.rb index d5a4ae79c47..d3b148d0ac0 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -254,7 +254,7 @@ class Project < ActiveRecord::Base has_many :variables, class_name: 'Ci::Variable' has_many :triggers, class_name: 'Ci::Trigger' has_many :environments - has_many :deployments, -> { success } + has_many :deployments has_many :pipeline_schedules, class_name: 'Ci::PipelineSchedule' has_many :project_deploy_tokens has_many :deploy_tokens, through: :project_deploy_tokens diff --git a/app/services/update_deployment_service.rb b/app/services/start_environment_service.rb similarity index 85% rename from app/services/update_deployment_service.rb rename to app/services/start_environment_service.rb index aa7fcca1e2a..138ee55f6dc 100644 --- a/app/services/update_deployment_service.rb +++ b/app/services/start_environment_service.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class UpdateDeploymentService +class StartEnvironmentService attr_reader :deployment attr_reader :deployable @@ -13,6 +13,8 @@ class UpdateDeploymentService end def execute + return unless deployment.deployed? + deployment.create_ref deployment.invalidate_cache @@ -20,10 +22,9 @@ class UpdateDeploymentService environment.external_url = expanded_environment_url if expanded_environment_url - environment.fire_state_event(action) + environment.fire_state_event(:start) break unless environment.save - break if environment.stopped? deployment.tap(&:update_merge_request_metrics!) end @@ -46,8 +47,4 @@ class UpdateDeploymentService def environment_url environment_options[:url] end - - def action - environment_options[:action] || 'start' - end end diff --git a/app/services/stop_environment_service.rb b/app/services/stop_environment_service.rb new file mode 100644 index 00000000000..79dbf292123 --- /dev/null +++ b/app/services/stop_environment_service.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class StopEnvironmentService + attr_reader :deployment + + delegate :environment, to: :deployment + + def initialize(deployment) + @deployment = deployment + end + + def execute + return unless deployment.stopped? + + environment.fire_state_event(:stop) + environment.expire_etag_cache + end +end diff --git a/app/workers/build_success_worker.rb b/app/workers/build_success_worker.rb index 9a865fea621..f3530317090 100644 --- a/app/workers/build_success_worker.rb +++ b/app/workers/build_success_worker.rb @@ -10,7 +10,6 @@ class BuildSuccessWorker def perform(build_id) Ci::Build.find_by(id: build_id).try do |build| create_deployment(build) if build.has_environment? - stop_environment(build) if build.stops_environment? end end # rubocop: enable CodeReuse/ActiveRecord @@ -27,10 +26,4 @@ class BuildSuccessWorker deployment.succeed end end - - ## - # TODO: This should be processed in DeploymentSuccessWorker once we started storing `action` value in `deployments` records - def stop_environment(build) - build.persisted_environment.fire_state_event(:stop) - end end diff --git a/app/workers/deployments/success_worker.rb b/app/workers/deployments/success_worker.rb index da517f3fb26..68fe8997f12 100644 --- a/app/workers/deployments/success_worker.rb +++ b/app/workers/deployments/success_worker.rb @@ -8,9 +8,11 @@ module Deployments def perform(deployment_id) Deployment.find_by_id(deployment_id).try do |deployment| - break unless deployment.success? - - UpdateDeploymentService.new(deployment).execute + if deployment.deployed? + StartEnvironmentService.new(deployment).execute + elsif deployment.stopped? + StopEnvironmentService.new(deployment).execute + end end end end diff --git a/changelogs/unreleased/add-action-to-deployment.yml b/changelogs/unreleased/add-action-to-deployment.yml new file mode 100644 index 00000000000..4629f762ae8 --- /dev/null +++ b/changelogs/unreleased/add-action-to-deployment.yml @@ -0,0 +1,5 @@ +--- +title: Fix environment status in merge request widget +merge_request: 22799 +author: +type: changed diff --git a/db/fixtures/development/14_pipelines.rb b/db/fixtures/development/14_pipelines.rb index 5af77c49913..e4272cbee33 100644 --- a/db/fixtures/development/14_pipelines.rb +++ b/db/fixtures/development/14_pipelines.rb @@ -43,12 +43,14 @@ class Gitlab::Seeder::Pipelines # deploy stage { name: 'staging', stage: 'deploy', environment: 'staging', status_event: :success, - options: { environment: { action: 'start', on_stop: 'stop staging' } }, + options: { environment: { name: 'staging', action: 'start', on_stop: 'stop staging' } }, queued_at: 7.hour.ago, started_at: 6.hour.ago, finished_at: 4.hour.ago }, { name: 'stop staging', stage: 'deploy', environment: 'staging', - when: 'manual', status: :skipped }, + when: 'manual', status: :skipped, + options: { environment: { name: 'staging', action: 'stop' } } }, { name: 'production', stage: 'deploy', environment: 'production', - when: 'manual', status: :skipped }, + when: 'manual', status: :skipped, + options: { environment: { name: 'production' } } }, # notify stage { name: 'slack', stage: 'notify', when: 'manual', status: :success }, diff --git a/db/fixtures/development/19_environments.rb b/db/fixtures/development/19_environments.rb index 3e227928a29..031a04ac76b 100644 --- a/db/fixtures/development/19_environments.rb +++ b/db/fixtures/development/19_environments.rb @@ -45,14 +45,18 @@ class Gitlab::Seeder::Environments end def create_deployment!(project, name, ref, sha) - environment = find_or_create_environment!(project, name) - environment.deployments.create!( - project: project, - ref: ref, - sha: sha, - tag: false, - deployable: find_deployable(project, name) - ) + find_deployable(project, name).try do |deployable| + environment = find_or_create_environment!(project, name) + environment.deployments.create!( + project: project, + ref: ref, + sha: sha, + tag: false, + deployable: deployable + ).tap do |deployment| + deployment.succeed! + end + end end def find_or_create_environment!(project, name) diff --git a/db/migrate/20181030150739_add_action_to_deployments.rb b/db/migrate/20181030150739_add_action_to_deployments.rb new file mode 100644 index 00000000000..a8c3a8ee69c --- /dev/null +++ b/db/migrate/20181030150739_add_action_to_deployments.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class AddActionToDeployments < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DEPLOYMENT_ACTION_START = 1 # Equivalent to Deployment.actions['start'] + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_column_with_default(:deployments, + :action, + :integer, + limit: 2, + default: DEPLOYMENT_ACTION_START, + allow_null: false) + end + + def down + remove_column(:deployments, :action) + end +end diff --git a/db/migrate/20181106135939_add_index_to_deployments.rb b/db/migrate/20181106135939_add_index_to_deployments.rb new file mode 100644 index 00000000000..b29c6766b11 --- /dev/null +++ b/db/migrate/20181106135939_add_index_to_deployments.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +class AddIndexToDeployments < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_concurrent_index :deployments, [:project_id, :action, :status] + add_concurrent_index :deployments, [:environment_id, :action, :status] + add_concurrent_index :deployments, [:environment_id, :action, :sha] + add_concurrent_index :deployments, [:finished_at] + end + + def down + remove_concurrent_index :deployments, [:project_id, :action, :status] + remove_concurrent_index :deployments, [:environment_id, :action, :status] + remove_concurrent_index :deployments, [:environment_id, :action, :sha] + remove_concurrent_index :deployments, [:finished_at] + end +end diff --git a/db/schema.rb b/db/schema.rb index fe30c5375f4..40fc0b24501 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20181101144347) do +ActiveRecord::Schema.define(version: 20181106135939) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -827,14 +827,19 @@ ActiveRecord::Schema.define(version: 20181101144347) do t.string "on_stop" t.integer "status", limit: 2, default: 2, null: false t.datetime_with_timezone "finished_at" + t.integer "action", limit: 2, default: 1, null: false end add_index "deployments", ["created_at"], name: "index_deployments_on_created_at", using: :btree add_index "deployments", ["deployable_type", "deployable_id"], name: "index_deployments_on_deployable_type_and_deployable_id", using: :btree + add_index "deployments", ["environment_id", "action", "sha"], name: "index_deployments_on_environment_id_and_action_and_sha", using: :btree + add_index "deployments", ["environment_id", "action", "status"], name: "index_deployments_on_environment_id_and_action_and_status", using: :btree add_index "deployments", ["environment_id", "id"], name: "index_deployments_on_environment_id_and_id", using: :btree add_index "deployments", ["environment_id", "iid", "project_id"], name: "index_deployments_on_environment_id_and_iid_and_project_id", using: :btree add_index "deployments", ["environment_id", "status"], name: "index_deployments_on_environment_id_and_status", using: :btree + add_index "deployments", ["finished_at"], name: "index_deployments_on_finished_at", using: :btree add_index "deployments", ["id"], name: "partial_index_deployments_for_legacy_successful_deployments", where: "((finished_at IS NULL) AND (status = 2))", using: :btree + add_index "deployments", ["project_id", "action", "status"], name: "index_deployments_on_project_id_and_action_and_status", using: :btree add_index "deployments", ["project_id", "iid"], name: "index_deployments_on_project_id_and_iid", unique: true, using: :btree add_index "deployments", ["project_id", "status"], name: "index_deployments_on_project_id_and_status", using: :btree diff --git a/lib/api/deployments.rb b/lib/api/deployments.rb index 6747e2e5005..2fb8551543a 100644 --- a/lib/api/deployments.rb +++ b/lib/api/deployments.rb @@ -24,7 +24,7 @@ module API get ':id/deployments' do authorize! :read_deployment, user_project - present paginate(user_project.deployments.order(params[:order_by] => params[:sort])), with: Entities::Deployment + present paginate(user_project.deployments.deployed.order(params[:order_by] => params[:sort])), with: Entities::Deployment end # rubocop: enable CodeReuse/ActiveRecord @@ -38,7 +38,7 @@ module API get ':id/deployments/:deployment_id' do authorize! :read_deployment, user_project - deployment = user_project.deployments.find(params[:deployment_id]) + deployment = user_project.deployments.deployed.find(params[:deployment_id]) present deployment, with: Entities::Deployment end diff --git a/lib/gitlab/cycle_analytics/summary/deploy.rb b/lib/gitlab/cycle_analytics/summary/deploy.rb index 099d798aac6..b1c644f77f3 100644 --- a/lib/gitlab/cycle_analytics/summary/deploy.rb +++ b/lib/gitlab/cycle_analytics/summary/deploy.rb @@ -7,7 +7,7 @@ module Gitlab end def value - @value ||= @project.deployments.where("created_at > ?", @from).count + @value ||= @project.deployments.deployed.where("finished_at > ?", @from).count end end end diff --git a/spec/factories/deployments.rb b/spec/factories/deployments.rb index 011c98599a3..483a906e31f 100644 --- a/spec/factories/deployments.rb +++ b/spec/factories/deployments.rb @@ -47,5 +47,13 @@ FactoryBot.define do deployment.succeed! end end + + trait :start do + action :start + end + + trait :stop do + action :stop + end end end diff --git a/spec/features/merge_request/user_sees_deployment_widget_spec.rb b/spec/features/merge_request/user_sees_deployment_widget_spec.rb index 0e439c8cb2d..53598b10fb1 100644 --- a/spec/features/merge_request/user_sees_deployment_widget_spec.rb +++ b/spec/features/merge_request/user_sees_deployment_widget_spec.rb @@ -1,7 +1,7 @@ require 'rails_helper' describe 'Merge request > User sees deployment widget', :js do - describe 'when deployed to an environment' do + describe 'when merge request has associated environments' do let(:user) { create(:user) } let(:project) { create(:project, :repository) } let(:merge_request) { create(:merge_request, :merged, source_project: project) } @@ -10,30 +10,126 @@ describe 'Merge request > User sees deployment widget', :js do let(:ref) { merge_request.target_branch } let(:sha) { project.commit(ref).id } let(:pipeline) { create(:ci_pipeline_without_jobs, sha: sha, project: project, ref: ref) } - let(:build) { create(:ci_build, :success, pipeline: pipeline) } - let!(:deployment) { create(:deployment, :succeed, environment: environment, sha: sha, ref: ref, deployable: build) } let!(:manual) { } before do merge_request.update!(merge_commit_sha: sha) project.add_user(user, role) sign_in(user) - visit project_merge_request_path(project, merge_request) - wait_for_requests end - it 'displays that the environment is deployed' do - wait_for_requests + context 'when deployment is to start an environment' do + context 'when deployment succeeded' do + let(:build) { create(:ci_build, :success, pipeline: pipeline) } + let!(:deployment) { create(:deployment, :succeed, environment: environment, sha: sha, ref: ref, deployable: build) } - expect(page).to have_content("Deployed to #{environment.name}") - expect(find('.js-deploy-time')['data-original-title']).to eq(deployment.created_at.to_time.in_time_zone.to_s(:medium)) + it 'displays that the environment is deployed' do + visit project_merge_request_path(project, merge_request) + wait_for_requests + + expect(page).to have_content("Deployed to #{environment.name}") + expect(find('.js-deploy-time')['data-original-title']).to eq(deployment.created_at.to_time.in_time_zone.to_s(:medium)) + end + end + + context 'when deployment failed' do + let(:build) { create(:ci_build, :failed, pipeline: pipeline) } + let!(:deployment) { create(:deployment, :failed, environment: environment, sha: sha, ref: ref, deployable: build) } + + it 'displays that the deployment failed' do + visit project_merge_request_path(project, merge_request) + wait_for_requests + + expect(page).to have_content("Failed to deploy to #{environment.name}") + expect(page).not_to have_css('.js-deploy-time') + end + end + + context 'when deployment running' do + let(:build) { create(:ci_build, :running, pipeline: pipeline) } + let!(:deployment) { create(:deployment, :running, environment: environment, sha: sha, ref: ref, deployable: build) } + + it 'displays that the running deployment' do + visit project_merge_request_path(project, merge_request) + wait_for_requests + + expect(page).to have_content("Deploying to #{environment.name}") + expect(page).not_to have_css('.js-deploy-time') + end + end + + context 'when deployment will happen' do + let(:build) { create(:ci_build, :created, pipeline: pipeline) } + let!(:deployment) { create(:deployment, environment: environment, sha: sha, ref: ref, deployable: build) } + + it 'displays that the environment name' do + visit project_merge_request_path(project, merge_request) + wait_for_requests + + expect(page).to have_content("Deploying to #{environment.name}") + expect(page).not_to have_css('.js-deploy-time') + end + end + end + + context 'when deployment is to stop an environment' do + context 'when the stop action succeeded' do + let(:build) { create(:ci_build, :success, pipeline: pipeline) } + let!(:deployment) { create(:deployment, :succeed, :stop, environment: environment, sha: sha, ref: ref, deployable: build) } + + it 'does not display deployment info' do + visit project_merge_request_path(project, merge_request) + wait_for_requests + + expect(page).not_to have_css('.deployment-info') + end + end + + context 'when the stop action failed' do + let(:build) { create(:ci_build, :failed, pipeline: pipeline) } + let!(:deployment) { create(:deployment, :failed, :stop, environment: environment, sha: sha, ref: ref, deployable: build) } + + it 'does not display deployment info' do + visit project_merge_request_path(project, merge_request) + wait_for_requests + + expect(page).not_to have_css('.deployment-info') + end + end + + context 'when the stop action is running' do + let(:build) { create(:ci_build, :running, pipeline: pipeline) } + let!(:deployment) { create(:deployment, :running, :stop, environment: environment, sha: sha, ref: ref, deployable: build) } + + it 'does not display deployment info' do + visit project_merge_request_path(project, merge_request) + wait_for_requests + + expect(page).not_to have_css('.deployment-info') + end + end + + context 'when the stop action will happen' do + let(:build) { create(:ci_build, :created, pipeline: pipeline) } + let!(:deployment) { create(:deployment, :stop, environment: environment, sha: sha, ref: ref, deployable: build) } + + it 'does not display deployment info' do + visit project_merge_request_path(project, merge_request) + wait_for_requests + + expect(page).not_to have_css('.deployment-info') + end + end end context 'with stop action' do + let(:build) { create(:ci_build, :success, pipeline: pipeline) } + let!(:deployment) { create(:deployment, :succeed, environment: environment, sha: sha, ref: ref, deployable: build) } let(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'close_app') } before do deployment.update!(on_stop: manual.name) + visit project_merge_request_path(project, merge_request) wait_for_requests end diff --git a/spec/features/projects/environments/environment_spec.rb b/spec/features/projects/environments/environment_spec.rb index 056f4ee2e22..d12fe24714b 100644 --- a/spec/features/projects/environments/environment_spec.rb +++ b/spec/features/projects/environments/environment_spec.rb @@ -43,6 +43,58 @@ describe 'Environment' do end end + context 'when there is a successful deployment' do + let(:pipeline) { create(:ci_pipeline, project: project) } + let(:build) { create(:ci_build, :success, pipeline: pipeline) } + + let(:deployment) do + create(:deployment, :success, environment: environment, deployable: build) + end + + it 'does show deployments' do + expect(page).to have_link("#{build.name} (##{build.id})") + end + end + + context 'when there is a running deployment' do + let(:pipeline) { create(:ci_pipeline, project: project) } + let(:build) { create(:ci_build, pipeline: pipeline) } + + let(:deployment) do + create(:deployment, :running, environment: environment, deployable: build) + end + + it 'does show no deployments' do + expect(page).to have_content('You don\'t have any deployments right now.') + end + end + + context 'when there is a failed deployment' do + let(:pipeline) { create(:ci_pipeline, project: project) } + let(:build) { create(:ci_build, pipeline: pipeline) } + + let(:deployment) do + create(:deployment, :failed, environment: environment, deployable: build) + end + + it 'does show no deployments' do + expect(page).to have_content('You don\'t have any deployments right now.') + end + end + + context 'when there is a successful stop action' do + let(:pipeline) { create(:ci_pipeline, project: project) } + let(:build) { create(:ci_build, :success, pipeline: pipeline) } + + let(:deployment) do + create(:deployment, :success, :stop, environment: environment, deployable: build) + end + + it 'does show no deployments' do + expect(page).to have_content('You don\'t have any deployments right now.') + end + end + context 'with related deployable present' do let(:pipeline) { create(:ci_pipeline, project: project) } let(:build) { create(:ci_build, pipeline: pipeline) } diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb index d0ddf69d574..b3eabcb7903 100644 --- a/spec/features/projects/environments/environments_spec.rb +++ b/spec/features/projects/environments/environments_spec.rb @@ -128,7 +128,7 @@ describe 'Environments page', :js do end end - context 'when there are deployments' do + context 'when there are successful deployments' do let(:project) { create(:project, :repository) } let!(:deployment) do @@ -328,6 +328,39 @@ describe 'Environments page', :js do end end end + + context 'when there is a failed deployment' do + let(:project) { create(:project, :repository) } + + let!(:deployment) do + create(:deployment, :failed, + environment: environment, + sha: project.commit.id) + end + + it 'does not show deployments' do + visit_environments(project) + + expect(page).to have_content('No deployments yet') + end + end + + context 'when there is a successful stop action' do + let(:project) { create(:project, :repository) } + + let!(:deployment) do + create(:deployment, :success, + :stop, + environment: environment, + sha: project.commit.id) + end + + it 'does not show deployments' do + visit_environments(project) + + expect(page).to have_content('No deployments yet') + end + end end it 'does have a new environment button' do diff --git a/spec/models/concerns/deployable_spec.rb b/spec/models/concerns/deployable_spec.rb index ac79c75a55e..9551ff4b13b 100644 --- a/spec/models/concerns/deployable_spec.rb +++ b/spec/models/concerns/deployable_spec.rb @@ -22,13 +22,17 @@ describe Deployable do expect(deployment.on_stop).to eq('stop_review_app') expect(environment.name).to eq('review/master') end + + it 'updates action column to start' do + expect(deployment).to be_start + end end - context 'when the deployable object will stop an environment' do + context 'when the deployable object will stop the review app' do let!(:job) { create(:ci_build, :stop_review_app) } - it 'does not create a deployment record' do - expect(deployment).to be_nil + it 'updates action column to stop' do + expect(deployment).to be_stop end end diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb index 270b2767c68..b5696c73339 100644 --- a/spec/models/deployment_spec.rb +++ b/spec/models/deployment_spec.rb @@ -191,6 +191,150 @@ describe Deployment do end end + describe '.deployed' do + subject { described_class.deployed } + + context 'when deployment starts an environment' do + context 'when the action was successful' do + let!(:deployment) { create(:deployment, :start, :success) } + + it 'returns the deployment' do + is_expected.to eq([deployment]) + end + end + + context 'when the action failed' do + let!(:deployment) { create(:deployment, :start, :failed) } + + it 'returns nothing' do + is_expected.to be_empty + end + end + end + + context 'when deployment stops an environment' do + context 'when the action was successful' do + let!(:deployment) { create(:deployment, :stop, :success) } + + it 'returns nothing' do + is_expected.to be_empty + end + end + + context 'when the action failed' do + let!(:deployment) { create(:deployment, :stop, :failed) } + + it 'returns nothing' do + is_expected.to be_empty + end + end + end + end + + describe '.stopped' do + subject { described_class.stopped } + + context 'when deployment starts an environment' do + context 'when the action was successful' do + let!(:deployment) { create(:deployment, :start, :success) } + + it 'returns nothing' do + is_expected.to be_empty + end + end + + context 'when the action failed' do + let!(:deployment) { create(:deployment, :start, :failed) } + + it 'returns nothing' do + is_expected.to be_empty + end + end + end + + context 'when deployment stops an environment' do + context 'when the action was successful' do + let!(:deployment) { create(:deployment, :stop, :success) } + + it 'returns the deployment' do + is_expected.to eq([deployment]) + end + end + + context 'when the action failed' do + let!(:deployment) { create(:deployment, :stop, :failed) } + + it 'returns nothing' do + is_expected.to be_empty + end + end + end + end + + describe '#deployed?' do + subject { deployment.deployed? } + + context 'when deployment starts an environment' do + context 'when the action was successful' do + let!(:deployment) { create(:deployment, :start, :success) } + + it { is_expected.to be_truthy } + end + + context 'when the action failed' do + let!(:deployment) { create(:deployment, :start, :failed) } + + it { is_expected.to be_falsy } + end + end + + context 'when deployment stops an environment' do + context 'when the action was successful' do + let!(:deployment) { create(:deployment, :stop, :success) } + + it { is_expected.to be_falsy } + end + + context 'when the action failed' do + let!(:deployment) { create(:deployment, :stop, :failed) } + + it { is_expected.to be_falsy } + end + end + end + + describe '#stopped?' do + subject { deployment.stopped? } + + context 'when deployment starts an environment' do + context 'when the action was successful' do + let!(:deployment) { create(:deployment, :start, :success) } + + it { is_expected.to be_falsy } + end + + context 'when the action failed' do + let!(:deployment) { create(:deployment, :start, :failed) } + + it { is_expected.to be_falsy } + end + end + + context 'when deployment stops an environment' do + context 'when the action was successful' do + let!(:deployment) { create(:deployment, :stop, :success) } + + it { is_expected.to be_truthy } + end + + context 'when the action failed' do + let!(:deployment) { create(:deployment, :stop, :failed) } + + it { is_expected.to be_falsy } + end + end + end + describe '#deployed_at' do subject { deployment.deployed_at } diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index e121369f6ac..0dfdf105905 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -53,6 +53,65 @@ describe Environment do end end + describe '.with_deployment' do + subject { described_class.with_deployment(sha) } + + let(:environment) { create(:environment) } + let(:sha) { RepoHelpers.sample_commit.id } + + context 'when deployment starts environment' do + context 'when deployment has the specified sha' do + let!(:deployment) { create(:deployment, :start, environment: environment, sha: sha) } + + it { is_expected.to eq([environment]) } + end + + context 'when deployment does not have the specified sha' do + let!(:deployment) { create(:deployment, :start, environment: environment, sha: 'abc') } + + it { is_expected.to be_empty } + end + end + + context 'when deployment stops environment' do + let!(:deployment) { create(:deployment, :stop, environment: environment) } + + it { is_expected.to be_empty } + end + end + + describe '#last_deployed_at' do + subject { environment.last_deployed_at } + + let(:environment) { create(:environment) } + + context 'when the latest deployment is for starting an environment' do + context 'when the latest deployment is successful' do + let!(:deployment) { create(:deployment, :start, :success, environment: environment) } + + it { expect(subject.to_i).to eq(deployment.finished_at.to_i) } + end + + context 'when the latest deployment failed' do + let!(:deployment) { create(:deployment, :start, :failed, environment: environment) } + + it { is_expected.to be_nil } + end + + context 'when the latest deployment is running' do + let!(:deployment) { create(:deployment, :start, :running, environment: environment) } + + it { is_expected.to be_nil } + end + end + + context 'when the latest deployment is for stopping environment' do + let!(:deployment) { create(:deployment, :stop, :success, environment: environment) } + + it { is_expected.to be_nil } + end + end + describe '#folder_name' do context 'when it is inside a folder' do subject(:environment) do @@ -134,26 +193,6 @@ describe Environment do end end - describe '#first_deployment_for' do - let(:project) { create(:project, :repository) } - 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 } - - it 'returns deployment id for the environment' do - expect(environment.first_deployment_for(commit.id)).to eq deployment1 - end - - it 'return nil when no deployment is found' do - expect(environment.first_deployment_for(head_commit.id)).to eq nil - end - - it 'returns a UTF-8 ref' do - expect(environment.first_deployment_for(commit.id).ref).to be_utf8 - end - end - describe '#environment_type' do subject { environment.environment_type } diff --git a/spec/models/environment_status_spec.rb b/spec/models/environment_status_spec.rb index 52b98552184..f9578da5032 100644 --- a/spec/models/environment_status_spec.rb +++ b/spec/models/environment_status_spec.rb @@ -1,8 +1,10 @@ require 'spec_helper' describe EnvironmentStatus do - let(:deployment) { create(:deployment, :succeed, :review_app) } - let(:environment) { deployment.environment} + include ProjectForksHelper + + let(:deployment) { create(:deployment, :succeed, :start, :review_app) } + let(:environment) { deployment.environment } let(:project) { deployment.project } let(:merge_request) { create(:merge_request, :deployed_review_app, deployment: deployment) } let(:sha) { deployment.sha } @@ -65,9 +67,9 @@ describe EnvironmentStatus do let(:admin) { create(:admin) } let(:pipeline) { create(:ci_pipeline, sha: sha) } - it 'is based on merge_request.head_pipeline' do - expect(merge_request).to receive(:head_pipeline).and_return(pipeline) - expect(merge_request).not_to receive(:merge_pipeline) + it 'is based on merge_request.diff_head_sha' do + expect(merge_request).to receive(:diff_head_sha) + expect(merge_request).not_to receive(:merge_commit_sha) described_class.for_merge_request(merge_request, admin) end @@ -81,11 +83,74 @@ describe EnvironmentStatus do merge_request.mark_as_merged! end - it 'is based on merge_request.merge_pipeline' do - expect(merge_request).to receive(:merge_pipeline).and_return(pipeline) - expect(merge_request).not_to receive(:head_pipeline) + it 'is based on merge_request.merge_commit_sha' do + expect(merge_request).to receive(:merge_commit_sha) + expect(merge_request).not_to receive(:diff_head_sha) described_class.after_merge_request(merge_request, admin) end end + + describe '.build_environments_status' do + subject { described_class.send(:build_environments_status, merge_request, user, sha) } + + let!(:build) { create(:ci_build, :deploy_to_production, pipeline: pipeline) } + let(:environment) { build.deployment.environment } + let(:user) { project.owner } + + before do + build.deployment.update(sha: sha) + end + + context 'when environment is created on a forked project' do + let(:project) { create(:project, :repository) } + let(:forked) { fork_project(project, user, repository: true) } + let(:sha) { forked.commit.sha } + let(:pipeline) { create(:ci_pipeline, sha: sha, project: forked) } + + let(:merge_request) do + create(:merge_request, source_project: forked, target_project: project, target_branch: 'master', head_pipeline: pipeline) + end + + it 'returns environment status' do + expect(subject.count).to eq(1) + expect(subject[0].environment).to eq(environment) + expect(subject[0].merge_request).to eq(merge_request) + expect(subject[0].sha).to eq(sha) + end + end + + context 'when environment is created on a target project' do + let(:project) { create(:project, :repository) } + let(:sha) { project.commit.sha } + let(:pipeline) { create(:ci_pipeline, sha: sha, project: project) } + + let(:merge_request) do + create(:merge_request, source_project: project, source_branch: 'feature', target_project: project, target_branch: 'master', head_pipeline: pipeline) + end + + it 'returns environment status' do + expect(subject.count).to eq(1) + expect(subject[0].environment).to eq(environment) + expect(subject[0].merge_request).to eq(merge_request) + expect(subject[0].sha).to eq(sha) + end + + context 'when the build stops an environment' do + let!(:build) { create(:ci_build, :stop_review_app, pipeline: pipeline) } + + it 'does not return environment status' do + expect(subject.count).to eq(0) + end + end + + context 'when user does not have a permission to see the environment' do + let(:user) { create(:user) } + + it 'does not return environment status' do + expect(subject.count).to eq(0) + end + end + end + end end diff --git a/spec/serializers/environment_status_entity_spec.rb b/spec/serializers/environment_status_entity_spec.rb index 962ec919092..52bd40ecb5e 100644 --- a/spec/serializers/environment_status_entity_spec.rb +++ b/spec/serializers/environment_status_entity_spec.rb @@ -15,6 +15,7 @@ describe EnvironmentStatusEntity do subject { entity.as_json } before do + deployment.update(sha: merge_request.diff_head_sha) allow(request).to receive(:current_user).and_return(user) end diff --git a/spec/services/update_deployment_service_spec.rb b/spec/services/start_environment_service_spec.rb similarity index 97% rename from spec/services/update_deployment_service_spec.rb rename to spec/services/start_environment_service_spec.rb index 3c55dd9659a..105d69c6b8e 100644 --- a/spec/services/update_deployment_service_spec.rb +++ b/spec/services/start_environment_service_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe UpdateDeploymentService do +describe StartEnvironmentService do let(:user) { create(:user) } let(:options) { { name: 'production' } } @@ -84,8 +84,8 @@ describe UpdateDeploymentService do it 'updates external url' do subject - expect(subject.environment.name).to eq('review-apps/master') - expect(subject.environment.external_url).to eq('http://master.review-apps.gitlab.com') + expect(environment.reload.name).to eq('review-apps/master') + expect(environment.reload.external_url).to eq('http://master.review-apps.gitlab.com') end end end diff --git a/spec/services/stop_environment_service_spec.rb b/spec/services/stop_environment_service_spec.rb new file mode 100644 index 00000000000..c41e010d717 --- /dev/null +++ b/spec/services/stop_environment_service_spec.rb @@ -0,0 +1,43 @@ +require 'spec_helper' + +describe StopEnvironmentService do + let(:service) { described_class.new(deployment) } + + describe '#execute' do + subject { service.execute } + + context 'when environment is available' do + let(:environment) { create(:environment, state: :available) } + + context 'when deployment was successful' do + let(:deployment) { create(:deployment, :success, :stop, environment: environment) } + + it 'stops the environment' do + subject + + expect(environment.reload).to be_stopped + end + end + + context 'when deployment failed' do + let(:deployment) { create(:deployment, :failed, :stop, environment: environment) } + + it 'does not stop the environment' do + subject + + expect(environment.reload).to be_available + end + end + end + + context 'when environment is stopped' do + let(:deployment) { create(:deployment, :success, :stop, environment: environment) } + let(:environment) { create(:environment, state: :stopped) } + + it 'does not raise an error' do + expect { subject }.not_to raise_error + expect(environment.reload).to be_stopped + end + end + end +end diff --git a/spec/workers/build_success_worker_spec.rb b/spec/workers/build_success_worker_spec.rb index 5eb9709ded9..8e9b178728e 100644 --- a/spec/workers/build_success_worker_spec.rb +++ b/spec/workers/build_success_worker_spec.rb @@ -47,19 +47,6 @@ describe BuildSuccessWorker do expect(build.reload).not_to be_has_deployment end end - - context 'when the build will stop an environment' do - let!(:build) { create(:ci_build, :stop_review_app, environment: environment.name, project: environment.project) } - let(:environment) { create(:environment, state: :available) } - - it 'stops the environment' do - expect(environment).to be_available - - subject - - expect(environment.reload).to be_stopped - end - end end context 'when build does not exist' do diff --git a/spec/workers/deployments/success_worker_spec.rb b/spec/workers/deployments/success_worker_spec.rb index ba7d45eca01..57aaa929a37 100644 --- a/spec/workers/deployments/success_worker_spec.rb +++ b/spec/workers/deployments/success_worker_spec.rb @@ -3,34 +3,51 @@ require 'spec_helper' describe Deployments::SuccessWorker do subject { described_class.new.perform(deployment&.id) } - context 'when successful deployment' do - let(:deployment) { create(:deployment, :success) } + context 'when deployment starts environment' do + context 'when deployment was successful' do + let(:deployment) { create(:deployment, :start, :success) } - it 'executes UpdateDeploymentService' do - expect(UpdateDeploymentService) - .to receive(:new).with(deployment).and_call_original + it 'executes StartEnvironmentService' do + expect(StartEnvironmentService) + .to receive(:new).with(deployment).and_call_original - subject + subject + end end - end - context 'when canceled deployment' do - let(:deployment) { create(:deployment, :canceled) } + context 'when deployment failed' do + let(:deployment) { create(:deployment, :start, :failed) } - it 'does not execute UpdateDeploymentService' do - expect(UpdateDeploymentService).not_to receive(:new) + it 'does not execute StartEnvironmentService' do + expect(StartEnvironmentService) + .not_to receive(:new).with(deployment).and_call_original - subject + subject + end end end - context 'when deploy record does not exist' do - let(:deployment) { nil } + context 'when deployment stops environment' do + context 'when deployment was successful' do + let(:deployment) { create(:deployment, :stop, :success) } + + it 'executes StopEnvironmentService' do + expect(StopEnvironmentService) + .to receive(:new).with(deployment).and_call_original + + subject + end + end + + context 'when deployment failed' do + let(:deployment) { create(:deployment, :stop, :failed) } - it 'does not execute UpdateDeploymentService' do - expect(UpdateDeploymentService).not_to receive(:new) + it 'does not execute StopEnvironmentService' do + expect(StopEnvironmentService) + .not_to receive(:new).with(deployment).and_call_original - subject + subject + end end end end -- GitLab