Commit b3020aaf authored by Shinya Maeda's avatar Shinya Maeda

Squashed commit of the following:

commit 931d6ab0e025b0268d94e455f736b09a025e0578
Merge: b34d165320d 93846eb1
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Mon Nov 5 09:36:58 2018 +0900

    Merge branch 'master-ce' into stateful_deployments

commit b34d165320d6f3298c8b776ba66270a59c217412
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Fri Nov 2 18:07:08 2018 +0900

    Fix flaky spec

commit b5e0527c5d4fe8f18b2fdda5916bae9b8cd859a4
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Fri Nov 2 15:32:03 2018 +0900

    Fix spec

commit f78a5e96e66fe2d25086df495e339b470a274df8
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Fri Nov 2 14:59:29 2018 +0900

    Remove unnecessary line in schema.rb

commit 6ce7c483e0591b5d6f9588a99853834327b80031
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Fri Nov 2 14:55:48 2018 +0900

    Add partial index for filling deployment at migration

commit aecccfb5118c8982db3ba502fdf37b5e639fbfc6
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Fri Nov 2 14:42:24 2018 +0900

    Fix fill empty finished at migration

commit 0199e1761ad1b391ae87a53a9a113d3256529e0e
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Fri Nov 2 14:19:44 2018 +0900

    Fix flaky spec

commit 56ac84cd8095afab5b909119445537b7da06a2ff
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Fri Nov 2 10:06:49 2018 +0900

    Fix guard clause to prevent multiple deployments to a job

commit 521561b6b303b54635c30cb23d78e49d14cec53d
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Thu Nov 1 20:19:24 2018 +0900

    Fix spec

commit 2878da0d29b9bd2dde69a1b216203df118dd59a1
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Thu Nov 1 19:38:59 2018 +0900

    Simplify the factory

commit 22fd7df02133f3a21828554965fd5619905eac2c
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Thu Nov 1 19:33:50 2018 +0900

    Simplify the Deployable and BuildSuccessWorker

commit 41108959677ed614f4548443a2f4303c4c04925a
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Thu Nov 1 18:34:20 2018 +0900

    Fix spec

commit ae75fe7461ac72f621498797f478d42331342b84
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Thu Nov 1 17:19:12 2018 +0900

    Fix weird virtual deployment status

commit 380fee7494d06407dccc292c3cbedbcee7b6e235
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Thu Nov 1 15:59:31 2018 +0900

    Fix spec

commit 29889fcbaadb3bbfd2f11c10bfbf5dceb3e3ddba
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Thu Nov 1 15:07:10 2018 +0900

    Fix coding offence

commit 36ac13f345f5ef25725c2236a791a40a3a9e6126
Author: Shinya Maeda <shinya@gitlab.com>
Date:   Thu Nov 1 14:22:17 2018 +0900

    Squashed commit of the following:

    commit ba9aede922e1643db3f06c56736d46d6d86d356b
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Nov 1 14:21:33 2018 +0900

        Fix ambiguious factory specification in update deployment service spec

    commit 013afb5668cb30dc4ca5b21945c17b341e7ea7f9
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Nov 1 14:10:24 2018 +0900

        Fix spec

    commit 78793670d049e2dfb5fc98177eb4d10f20b9310b
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Wed Oct 31 18:26:12 2018 +0900

        Fix spec

    commit 73d27e87c66698f2e3a817bb8728f02475b7ba4f
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Wed Oct 31 16:22:14 2018 +0900

        Fix index

    commit 8580a226ea68bf5e49b35bfb5f404968bbfaf8e9
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Wed Oct 31 15:34:57 2018 +0900

        Fix deployment relationships in Ci::Build

    commit d6d28b55afd1179200b4f5188e0b53079ff3c1a7
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Wed Oct 31 15:27:53 2018 +0900

        Fix spec

    commit 94eb754e2e1bb9a1fe627f86823f571a8298d27b
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Wed Oct 31 14:07:11 2018 +0900

        Fix spec

    commit 0b30f80bcd08a7a06bdde3378ec1733f865284be
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 20:15:31 2018 +0900

        Fix spec

    commit 466bdcdb6af8cdb475c9fa16bd7d1dff23b11e40
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 19:28:51 2018 +0900

        Fix spec

    commit a7c3caac99139e70fe3f1f3d14856939fa25c527
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 17:33:47 2018 +0900

        Fix factory

    commit cea28ae100532e6711ce1d22676719a94e2da8a0
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 16:28:18 2018 +0900

        Drop leagacy success

    commit 3785d685eabc10b6597cf3db67bf08385ccf298a
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 15:37:28 2018 +0900

        Remove unnecessary migration file

    commit 0d597fa46eeffdbb9a4afb53005a8183e433c6bf
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 15:35:53 2018 +0900

        Fix schema.rb

    commit ec3c2abc6944e09f6410468ae5e356865ec7b02b
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 15:34:21 2018 +0900

        Rename post migration file

    commit 0e7281885a84656acf95f0f423732680f8fec076
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 15:31:01 2018 +0900

        Remove include EnumWithNil

    commit b3846d59c07e07275126c70361bde7f30810729e
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 15:05:50 2018 +0900

        Decouple action

    commit c9f9ba4eae9ca1edc7d8751e1d2e0572cb222d9c
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 14:23:29 2018 +0900

        Remove status mock

    commit d95bfea1ca67b3a27a3226a669c2b1266d696682
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 14:17:14 2018 +0900

        Add action

    commit 0cec39e0f76c22a18498f46d65ad7226fb30c3f8
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Tue Oct 30 13:44:07 2018 +0900

        Remove unnecessary line in schema.rb

    commit 7b4c5f8e1b00dd8e6aa944352f9d8a9f3ae6f1c7
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Mon Oct 29 19:59:41 2018 +0900

        Revert build success worker

    commit 0c52ffa4a23eea488c187317e8b400369846f399
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Mon Oct 29 19:11:47 2018 +0900

        Use add_column_with_default properly

    commit ba9bae357da5dfd2f6ec05f7f9db9d0b31224f48
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Mon Oct 29 18:40:55 2018 +0900

        Fix with_status

    commit 75dffc97b9c5f6fa73d9d09b125c8f849fa2caae
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Mon Oct 29 16:26:56 2018 +0900

        Remove unnecessary line in schema.rb

    commit 25188ccc52fb29ca63b9205c4d95ffc2e0afadee
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Mon Oct 29 16:26:17 2018 +0900

        Set default values in regular migration

    commit 98ea037fbf39c8d9f0db77fb50e2d08382425158
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Fri Oct 26 17:27:49 2018 +0900

        Fix static analysis

    commit e7d1765f77f9ff9b94a34985a7855bdaab1da675
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Fri Oct 26 16:37:10 2018 +0900

        Remove empty spec

    commit 0033f521ed1eae8117dba231961aa47c068bbcfb
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Fri Oct 26 16:34:55 2018 +0900

        Simplify spec changes

    commit 0be4c6b3ade6d9a8bf28bcd177c66ebd7bb7d20a
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Fri Oct 26 16:32:45 2018 +0900

        Simplify spec changes

    commit a93d25d79df7e25bdf688fc938c712922f9dc4df
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Fri Oct 26 16:02:31 2018 +0900

        Fix flaky spec

    commit 339ad50cf471ca706b29f008ccd2bb881dd5b776
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Fri Oct 26 15:06:22 2018 +0900

        Rename Deployments Success worker

    commit bd69c78085adcb9b0f8ff9b7041ae355953ad7ab
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Fri Oct 26 14:43:03 2018 +0900

        Fix coding offence

    commit 004748b2a9c5236ec13eb01289418f3d6571c92c
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 20:09:10 2018 +0900

        Rename to update deployment service

    commit b04a85e761de501f030f3844fd485a2b9e46f7f7
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 18:46:52 2018 +0900

        Add spec for Project

    commit 548af23a5a07f0c20b72849d03aa0b98a0b49134
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 18:43:25 2018 +0900

        Fix spec

    commit c977e4d3f17194c46a1bf857b473017ce21ef7e9
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 17:58:07 2018 +0900

        Add spec for Environment

    commit 73feb9010f8d8093bee4b46e56d30cfef3e8e34a
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 17:39:24 2018 +0900

        Add spec for Deployment model

    commit 9a3cfbf766f402571588839375cf311bb9807035
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 17:18:02 2018 +0900

        Fix statis analysis

    commit a30d28dbc631a29855883ca89c592a10c012f1d2
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 17:17:32 2018 +0900

        Ignore nil instance

    commit fa6fdd89f380e588a6bcf14b1f9aef0d14d3854b
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 16:20:40 2018 +0900

        Add spec for deployable concern

    commit aa91186821dc671df2c7a641e37586dd5dfc1008
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 15:37:23 2018 +0900

        Clean up deployable

    commit 34d3e18731f7906a3db250b105a64d1db83c2fca
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 15:13:05 2018 +0900

        Fix 17 cycle analytics

    commit 8dc9e00408f9b390175e7d5ea743eed4fb9e3f79
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Thu Oct 25 13:56:51 2018 +0900

        Fix static analysys

    commit 5c4175807a537bafc4b889b0a97e8f96f0e483cd
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Wed Oct 24 15:05:05 2018 +0900

        Skip unnecessary sidekiq worker

    commit 9d8b5d423f49cc247c96ce3767d03b4af305809f
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Wed Oct 24 14:53:13 2018 +0900

        Add changelog

    commit c8cabba496722240cadf7c161c80bceb09727cba
    Author: Shinya Maeda <shinya@gitlab.com>
    Date:   Wed Oct 24 14:44:45 2018 +0900

        Squashed commit of the following:

        commit f7643885ac2329e18d690a4e4f2d7614b732c793
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Tue Oct 23 19:38:45 2018 +0900

            Fix deployment widget specs

        commit 03bd04b5c98b634dff6a0ab4292c150a9031995c
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Tue Oct 23 17:50:16 2018 +0900

            Fix env status spec

        commit 4a49c6502b161a12f0f62d5ec167dff777047dab
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Tue Oct 23 17:48:59 2018 +0900

            Fix environment spec

        commit 4044822887987e20a703990ff20352a532eeb965
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Tue Oct 23 17:47:17 2018 +0900

            Fix environment spec

        commit 9939d44b7eb9da371de74c0f04fed1eb3db37ad3
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Tue Oct 23 15:45:43 2018 +0900

            Add a new spec for deployment success worker

        commit f61c4d3657b5ef13b5da171460da68a6643ad4b5
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Tue Oct 23 15:38:11 2018 +0900

            Fix cycle analytics helper

        commit b6242615e8298fb7fc047c8df8006c25ad717c70
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Tue Oct 23 14:41:54 2018 +0900

            Fix cycle analysis helper

        commit 9a001cb4c4ed6f3b87dc612bdffc60a6b2b0a132
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Tue Oct 23 14:37:08 2018 +0900

            Ignore coding offence in build success worker's spec

        commit 1fb88583025bac8a56172cbd59be04258ea4c5f3
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Tue Oct 23 14:33:11 2018 +0900

            Added more spec for deployments

        commit 1a6ba97ababbf62e8dd0ae0c56d75ab1268fd0ce
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 19:36:50 2018 +0900

            Move after create hookd into success worker

        commit 09de5fed5d6f108423779cf9d9e7f1d21f3c1c91
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 19:30:06 2018 +0900

            Fix build spec

        commit 73a55cbcabbb1e928eca3e53e8ff75dec178bc90
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 19:08:43 2018 +0900

            Fix update_deployment_metrics_service_spec.rb

        commit ee05136a02ae9fa348b4b89b9a69937ebb9697dd
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 17:32:05 2018 +0900

            Remove unnecessary degelate

        commit e246ddeebc01a807ccc36fdb484c3e72ad91e680
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 16:07:39 2018 +0900

            Remove unnecessary optimistic locking

        commit dcc225c8237b90e3bc8dcc3dc2e3252e0b0be093
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 16:00:22 2018 +0900

            Simplify status replication

        commit 13a5fd7afb67ba2712fcaecaea5fedf05f9ad177
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 15:29:24 2018 +0900

            Fix sidekiq queue names

        commit dcc796f48d523538e1c91b9cd3e1c7065e5329b1
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 15:23:55 2018 +0900

            Revert success check in update_merge_request_metrics

        commit 129ef083d637d4acb8c97a6d9ab96deb2ff6efcd
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 15:18:31 2018 +0900

            Fix queue name of deployment success worker

        commit 10fe5a6484f4f02322ce5bb16844fc7b1d565963
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 15:09:42 2018 +0900

            Introduce deployable module

        commit d91260bbe105bf46f6c06d9e9593c8c4cd5139cf
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 14:05:31 2018 +0900

            Add database index for successful deployments

        commit 74274147263de4b60870065a19935498ce662e30
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Mon Oct 22 13:51:59 2018 +0900

            Fix invalid state transition

        commit ff18463cc847bf3cf5a3e49f3651eedfdf67c7e6
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Fri Oct 19 20:05:15 2018 +0900

            Fix coding style offence

        commit 0202c0f5b631601edab7b359b087b307f5eb7ba3
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Fri Oct 19 18:34:07 2018 +0900

            Target only successful deployments from other relations

        commit 1f2758cb030dec1df5dda30f6bc3e25b6d0841c9
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Fri Oct 19 18:21:28 2018 +0900

            Add namespace explicitly

        commit 3d9227b6e5642cecde88d4edac925125f6474b11
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Fri Oct 19 17:42:30 2018 +0900

            Fix spec in DeleteInconsistentInternalIdRecords

        commit 3e0cc99ff6c5c7188511618228a6ec027752ce69
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Fri Oct 19 16:10:16 2018 +0900

            Fixed spec

        commit 8de09b8bb31f7b9f24ecdf9f2dd8ef358a260263
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Fri Oct 19 14:22:35 2018 +0900

            Fix create deployment service

        commit 31957570b4444492eeb412e765f96a56416c25f3
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Thu Oct 18 20:21:26 2018 +0900

            Move CreateDeploymentService. Fix Cycle analytics spec and fixture.

        commit d2eb433a1bb9710c0d4778c4f34c12b6b64f60e6
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Thu Oct 18 20:11:22 2018 +0900

            Fix build success worker

        commit 25e6cd87138bcdb69de8785ca367e479c8dbcc59
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Thu Oct 18 19:49:13 2018 +0900

            Fix create deployment service spec

        commit d268bf410bf65e86c81eb76d50aa8e145b32d249
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Thu Oct 18 19:01:23 2018 +0900

            Fix cycle analysys spec's deployment

        commit 525ade8aa1e4394ed8a759bb0437e407fbe74a35
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Thu Oct 18 18:24:04 2018 +0900

            Fix factory to set legacy status by default

        commit c6a990821ac0a1ffa49e20e2d78d94b8ce075914
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Thu Oct 18 17:25:40 2018 +0900

            Remove unnecessary lib from deployment

        commit a6107e0e85ac26ee09da3316ebc11de32f067d82
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Wed Oct 17 17:38:58 2018 +0900

            Fix recursive call

        commit 15c5f3b64061a75af3c3039ca7f49b1cc4ff3068
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Wed Oct 17 17:30:44 2018 +0900

            Add finished_at

        commit c8d3d70366f694d78acb7e30d342c7697798b922
        Author: Shinya Maeda <shinya@gitlab.com>
        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 <shinya@gitlab.com>
        Date:   Wed Oct 17 15:49:57 2018 +0900

            Redefine statuses

        commit c86a9d0bd2ab3e7a00bf61f094a96ee99b76b289
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Wed Oct 17 14:50:27 2018 +0900

            Fix schema.rb

        commit 9ff5f0eaafbc08795018c7bb282b19f6327dee21
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Wed Oct 17 14:18:04 2018 +0900

            Default status nil to success

        commit 5928bd9bb94e1e8908ed1561e01595be84d5f4ec
        Author: Shinya Maeda <shinya@gitlab.com>
        Date:   Tue Oct 16 15:13:48 2018 +0900

            Add status to Deployment
parent 57bc28e7
......@@ -9,19 +9,18 @@ module Ci
include Presentable
include Importable
include Gitlab::Utils::StrongMemoize
include Deployable
belongs_to :project, inverse_of: :builds
belongs_to :runner
belongs_to :trigger_request
belongs_to :erased_by, class_name: 'User'
has_many :deployments, as: :deployable
RUNNER_FEATURES = {
upload_multiple_artifacts: -> (build) { build.publishes_artifacts_reports? }
}.freeze
has_one :last_deployment, -> { order('deployments.id DESC') }, as: :deployable, class_name: 'Deployment'
has_one :deployment, as: :deployable, class_name: 'Deployment'
has_many :trace_sections, class_name: 'Ci::BuildTraceSection'
has_many :trace_chunks, class_name: 'Ci::BuildTraceChunk', foreign_key: :build_id
......@@ -195,6 +194,8 @@ module Ci
end
after_transition pending: :running do |build|
build.deployment&.run
build.run_after_commit do
BuildHooksWorker.perform_async(id)
end
......@@ -207,14 +208,18 @@ module Ci
end
after_transition any => [:success] do |build|
build.deployment&.succeed
build.run_after_commit do
BuildSuccessWorker.perform_async(id)
PagesWorker.perform_async(:deploy, id) if build.pages_generator?
end
end
before_transition any => [:failed] do |build|
next unless build.project
build.deployment&.drop
next if build.retries_max.zero?
if build.retries_count < build.retries_max
......@@ -233,6 +238,10 @@ module Ci
after_transition running: any do |build|
Ci::BuildRunnerSession.where(build: build).delete_all
end
after_transition any => [:skipped, :canceled] do |build|
build.deployment&.cancel
end
end
def ensure_metadata
......@@ -342,8 +351,12 @@ module Ci
self.options.fetch(:environment, {}).fetch(:action, 'start') if self.options
end
def has_deployment?
!!self.deployment
end
def outdated_deployment?
success? && !last_deployment.try(:last?)
success? && !deployment.try(:last?)
end
def depends_on_builds
......@@ -358,6 +371,10 @@ module Ci
user == current_user
end
def on_stop
options&.dig(:environment, :on_stop)
end
# A slugified version of the build ref, suitable for inclusion in URLs and
# domain names. Rules:
#
......@@ -725,7 +742,7 @@ module Ci
if success?
return successful_deployment_status
elsif complete? && !success?
elsif failed?
return :failed
end
......@@ -742,13 +759,11 @@ module Ci
end
def successful_deployment_status
if success? && last_deployment&.last?
return :last
elsif success? && last_deployment.present?
return :out_of_date
if deployment&.last?
:last
else
:out_of_date
end
:creating
end
def each_report(report_types)
......
# frozen_string_literal: true
module Deployable
extend ActiveSupport::Concern
included do
after_create :create_deployment
def create_deployment
return unless has_environment? && !has_deployment?
environment = project.environments.find_or_create_by(
name: expanded_environment_name
)
environment.deployments.create!(
project_id: environment.project_id,
environment: environment,
ref: ref,
tag: tag,
sha: sha,
user: user,
deployable: self,
on_stop: on_stop).tap do |_|
self.reload # Reload relationships
end
end
end
end
......@@ -3,6 +3,7 @@
class Deployment < ActiveRecord::Base
include AtomicInternalId
include IidRoutes
include AfterCommitQueue
belongs_to :project, required: true
belongs_to :environment, required: true
......@@ -16,11 +17,44 @@ class Deployment < ActiveRecord::Base
delegate :name, to: :environment, prefix: true
after_create :create_ref
after_create :invalidate_cache
scope :for_environment, -> (environment) { where(environment_id: environment) }
state_machine :status, initial: :created do
event :run do
transition created: :running
end
event :succeed do
transition any - [:success] => :success
end
event :drop do
transition any - [:failed] => :failed
end
event :cancel do
transition any - [:canceled] => :canceled
end
before_transition any => [:success, :failed, :canceled] do |deployment|
deployment.finished_at = Time.now
end
after_transition any => :success do |deployment|
deployment.run_after_commit do
Deployments::SuccessWorker.perform_async(id)
end
end
end
enum status: {
created: 0,
running: 1,
success: 2,
failed: 3,
canceled: 4
}
def self.last_for_environment(environment)
ids = self
.for_environment(environment)
......@@ -69,15 +103,15 @@ class Deployment < ActiveRecord::Base
end
def update_merge_request_metrics!
return unless environment.update_merge_request_metrics?
return unless environment.update_merge_request_metrics? && success?
merge_requests = project.merge_requests
.joins(:metrics)
.where(target_branch: self.ref, merge_request_metrics: { first_deployed_to_production_at: nil })
.where("merge_request_metrics.merged_at <= ?", self.created_at)
.where("merge_request_metrics.merged_at <= ?", finished_at)
if previous_deployment
merge_requests = merge_requests.where("merge_request_metrics.merged_at >= ?", previous_deployment.created_at)
merge_requests = merge_requests.where("merge_request_metrics.merged_at >= ?", previous_deployment.finished_at)
end
# Need to use `map` instead of `select` because MySQL doesn't allow `SELECT`ing from the same table
......@@ -91,7 +125,7 @@ class Deployment < ActiveRecord::Base
MergeRequest::Metrics
.where(merge_request_id: merge_request_ids, first_deployed_to_production_at: nil)
.update_all(first_deployed_to_production_at: self.created_at)
.update_all(first_deployed_to_production_at: finished_at)
end
def previous_deployment
......@@ -109,8 +143,18 @@ class Deployment < ActiveRecord::Base
@stop_action ||= manual_actions.find_by(name: on_stop)
end
def finished_at
read_attribute(:finished_at) || legacy_finished_at
end
def deployed_at
return unless success?
finished_at
end
def formatted_deployment_time
created_at.to_time.in_time_zone.to_s(:medium)
deployed_at&.to_time&.in_time_zone&.to_s(:medium)
end
def has_metrics?
......@@ -118,21 +162,17 @@ class Deployment < ActiveRecord::Base
end
def metrics
return {} unless has_metrics?
return {} unless has_metrics? && success?
metrics = prometheus_adapter.query(:deployment, self)
metrics&.merge(deployment_time: created_at.to_i) || {}
metrics&.merge(deployment_time: finished_at.to_i) || {}
end
def additional_metrics
return {} unless has_metrics?
return {} unless has_metrics? && success?
metrics = prometheus_adapter.query(:additional_metrics_deployment, self)
metrics&.merge(deployment_time: created_at.to_i) || {}
end
def status
'success'
metrics&.merge(deployment_time: finished_at.to_i) || {}
end
private
......@@ -144,4 +184,8 @@ class Deployment < ActiveRecord::Base
def ref_path
File.join(environment.ref_path, 'deployments', iid.to_s)
end
def legacy_finished_at
self.created_at if success? && !read_attribute(:finished_at)
end
end
......@@ -8,9 +8,9 @@ class Environment < ActiveRecord::Base
belongs_to :project, required: true
has_many :deployments, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :deployments, -> { success }, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_one :last_deployment, -> { order('deployments.id DESC') }, class_name: 'Deployment'
has_one :last_deployment, -> { success.order('deployments.id DESC') }, class_name: 'Deployment'
before_validation :nullify_external_url
before_validation :generate_slug, if: ->(env) { env.slug.blank? }
......
......@@ -8,8 +8,8 @@ class EnvironmentStatus
delegate :id, to: :environment
delegate :name, to: :environment
delegate :project, to: :environment
delegate :deployed_at, to: :deployment, allow_nil: true
delegate :status, to: :deployment
delegate :deployed_at, to: :deployment
def self.for_merge_request(mr, user)
build_environments_status(mr, user, mr.head_pipeline)
......@@ -33,10 +33,6 @@ class EnvironmentStatus
end
end
def deployed_at
deployment&.created_at
end
def changes
return [] if project.route_map_for(sha).nil?
......
......@@ -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
has_many :deployments, -> { success }
has_many :pipeline_schedules, class_name: 'Ci::PipelineSchedule'
has_many :project_deploy_tokens
has_many :deploy_tokens, through: :project_deploy_tokens
......
# frozen_string_literal: true
class CreateDeploymentService
attr_reader :job
class UpdateDeploymentService
attr_reader :deployment
attr_reader :deployable
delegate :expanded_environment_name,
:variables,
:project,
to: :job
delegate :environment, to: :deployment
delegate :variables, to: :deployable
def initialize(job)
@job = job
def initialize(deployment)
@deployment = deployment
@deployable = deployment.deployable
end
def execute
return unless executable?
deployment.create_ref
deployment.invalidate_cache
ActiveRecord::Base.transaction do
environment.external_url = expanded_environment_url if
......@@ -24,50 +25,28 @@ class CreateDeploymentService
break unless environment.save
break if environment.stopped?
deploy.tap(&:update_merge_request_metrics!)
deployment.tap(&:update_merge_request_metrics!)
end
end
private
def executable?
project && job.environment.present? && environment
end
def deploy
project.deployments.create(
environment: environment,
ref: job.ref,
tag: job.tag,
sha: job.sha,
user: job.user,
deployable: job,
on_stop: on_stop)
end
def environment
@environment ||= job.persisted_environment
end
def environment_options
@environment_options ||= job.options&.dig(:environment) || {}
@environment_options ||= deployable.options&.dig(:environment) || {}
end
def expanded_environment_url
return @expanded_environment_url if defined?(@expanded_environment_url)
return unless environment_url
@expanded_environment_url =
ExpandVariables.expand(environment_url, variables) if environment_url
ExpandVariables.expand(environment_url, variables)
end
def environment_url
environment_options[:url]
end
def on_stop
environment_options[:on_stop]
end
def action
environment_options[:action] || 'start'
end
......
......@@ -73,6 +73,8 @@
- pipeline_processing:update_head_pipeline_for_merge_request
- pipeline_processing:ci_build_schedule
- deployment:deployments_success
- repository_check:repository_check_clear
- repository_check:repository_check_batch
- repository_check:repository_check_single_repository
......
......@@ -16,7 +16,14 @@ class BuildSuccessWorker
private
##
# Deprecated:
# As of 11.5, we started creating a deployment record when ci_builds record is created.
# Therefore we no longer need to create a deployment, after a build succeeded.
# We're leaving this code for the transition period, but we can remove this code in 11.6.
def create_deployment(build)
CreateDeploymentService.new(build).execute
build.create_deployment.try do |deployment|
deployment.succeed
end
end
end
# frozen_string_literal: true
module Deployments
class SuccessWorker
include ApplicationWorker
queue_namespace :deployment
def perform(deployment_id)
Deployment.find_by_id(deployment_id).try do |deployment|
break unless deployment.success?
UpdateDeploymentService.new(deployment).execute
end
end
end
end
---
title: Add status to Deployment
merge_request: 22380
author:
type: changed
......@@ -29,6 +29,7 @@
- [pipeline_creation, 4]
- [pipeline_default, 3]
- [pipeline_cache, 3]
- [deployment, 3]
- [pipeline_hooks, 2]
- [gitlab_shell, 2]
- [email_receiver, 2]
......
......@@ -180,11 +180,8 @@ class Gitlab::Seeder::CycleAnalytics
ref: "refs/heads/#{merge_request.source_branch}")
pipeline = service.execute(:push, ignore_skip_ci: true, save_on_errors: false)
pipeline.run!
Timecop.travel rand(1..6).hours.from_now
pipeline.succeed!
PipelineMetricsWorker.new.perform(pipeline.id)
pipeline.builds.map(&:run!)
pipeline.update_status
end
end
......@@ -204,7 +201,8 @@ class Gitlab::Seeder::CycleAnalytics
job = merge_request.head_pipeline.builds.where.not(environment: nil).last
CreateDeploymentService.new(job).execute
job.success!
pipeline.update_status
end
end
end
......
# frozen_string_literal: true
class AddFinishedAtToDeployments < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
def up
add_column :deployments, :finished_at, :datetime_with_timezone
end
def down
remove_column :deployments, :finished_at, :datetime_with_timezone
end
end
# frozen_string_literal: true
class AddStatusToDeployments < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DEPLOYMENT_STATUS_SUCCESS = 2 # Equivalent to Deployment.state_machine.states['success'].value
DOWNTIME = false
disable_ddl_transaction!
##
# NOTE:
# Ideally, `status` column should not have default value because it should be leveraged by state machine (i.e. application level).
# However, we have to use the default value for avoiding `NOT NULL` violation during the transition period.
# The default value should be removed in the future release.
def up
add_column_with_default(:deployments,
:status,
:integer,
limit: 2,
default: DEPLOYMENT_STATUS_SUCCESS,
allow_null: false)
end
def down
remove_column(:deployments, :status)
end
end
# frozen_string_literal: true
class AddIndexOnStatusToDeployments < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
add_concurrent_index :deployments, [:project_id, :status]
add_concurrent_index :deployments, [:environment_id, :status]
end
def down
remove_concurrent_index :deployments, [:project_id, :status]
remove_concurrent_index :deployments, [:environment_id, :status]
end
end
# frozen_string_literal: true
class AddPartialIndexForLegacySuccessfulDeployments < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
INDEX_NAME = 'partial_index_deployments_for_legacy_successful_deployments'.freeze
disable_ddl_transaction!
def up
add_concurrent_index(:deployments, :id, where: "finished_at IS NULL AND status = 2", name: INDEX_NAME)
end
def down
remove_concurrent_index_by_name(:deployments, INDEX_NAME)
end
end
# frozen_string_literal: true
class FillEmptyFinishedAtInDeployments < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
DEPLOYMENT_STATUS_SUCCESS = 2 # Equivalent to Deployment.statuses[:success]
class Deployments < ActiveRecord::Base
self.table_name = 'deployments'
include EachBatch
end
def up
FillEmptyFinishedAtInDeployments::Deployments
.where('finished_at IS NULL')
.where('status = ?', DEPLOYMENT_STATUS_SUCCESS)
.each_batch(of: 10_000) do |relation|
relation.update_all('finished_at=created_at')
end
end
def down
# no-op
end
end
......@@ -825,13 +825,18 @@ ActiveRecord::Schema.define(version: 20181101144347) do
t.datetime "created_at"
t.datetime "updated_at"
t.string "on_stop"
t.integer "status", limit: 2, default: 2, null: false
t.datetime_with_timezone "finished_at"
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", "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", ["id"], name: "partial_index_deployments_for_legacy_successful_deployments", where: "((finished_at IS NULL) AND (status = 2))", 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
create_table "emails", force: :cascade do |t|
t.integer "user_id", null: false
......
......@@ -7,26 +7,11 @@ module Gitlab
class Create < Chain::Base
include Chain::Helpers
# rubocop: disable CodeReuse/ActiveRecord
def perform!
::Ci::Pipeline.transaction do
pipeline.save!
##
# Create environments before the pipeline starts.
#
pipeline.builds.each do |build|
if build.has_environment?
project.environments.find_or_create_by(
name: build.expanded_environment_name
)
end
end
end
pipeline.save!
rescue ActiveRecord::RecordInvalid => e
error("Failed to persist the pipeline: #{e}")
end
# rubocop: enable CodeReuse/ActiveRecord
def break?
!pipeline.persisted?
......
......@@ -15,9 +15,9 @@ describe Projects::DeploymentsController do
describe 'GET #index' do
it 'returns list of deployments from last 8 hours' do
create(:deployment, environment: environment, created_at: 9.hours.ago)
create(:deployment, environment: environment, created_at: 7.hours.ago)
create(:deployment, environment: environment)
create(:deployment, :success, environment: environment, created_at: 9.hours.ago)
create(:deployment, :success, environment: environment, created_at: 7.hours.ago)
create(:deployment, :success, environment: environment)
get :index, deployment_params(after: 8.hours.ago)
......@@ -27,7 +27,7 @@ describe Projects::DeploymentsController do
end
it 'returns a list with deployments information' do
create(:deployment, environment: environment)
create(:deployment, :success, environment: environment)
get :index, deployment_params
......@@ -37,7 +37,7 @@ describe Projects::DeploymentsController do
end
describe 'GET #metrics' do
let(:deployment) { create(:deployment, project: project, environment: environment) }
let(:deployment) { create(:deployment, :success, project: project, environment: environment) }
before do
allow(controller).to receive(:deployment).and_return(deployment)
......@@ -110,7 +110,7 @@ describe Projects::DeploymentsController do
end
describe 'GET #additional_metrics' do
let(:deployment) { create(:deployment, project: project, environment: environment) }
let(:deployment) { create(:deployment, :success, project: project, environment: environment) }
before do
allow(controller).to receive(:deployment).and_return(deployment)
......
......@@ -231,7 +231,7 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do
context 'with deployment' do
let(:merge_request) { create(:merge_request, source_project: project) }
let(:environment) { create(:environment, project: project, name: 'staging', state: :available) }
let(:job) { create(:ci_build, :success, environment: environment.name, pipeline: pipeline) }
let(:job) { create(:ci_build, :running, environment: environment.name, pipeline: pipeline) }