shipit-engine 0.38.0 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +48 -4
- data/Rakefile +2 -1
- data/app/assets/javascripts/shipit/continuous_delivery_schedule.js.coffee +15 -0
- data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +1 -0
- data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
- data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
- data/app/controllers/concerns/shipit/api/rendering.rb +1 -0
- data/app/controllers/concerns/shipit/authentication.rb +1 -0
- data/app/controllers/concerns/shipit/pagination.rb +3 -2
- data/app/controllers/shipit/api/base_controller.rb +12 -10
- data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
- data/app/controllers/shipit/api/commits_controller.rb +2 -3
- data/app/controllers/shipit/api/deploys_controller.rb +6 -1
- data/app/controllers/shipit/api/hooks_controller.rb +4 -3
- data/app/controllers/shipit/api/locks_controller.rb +1 -0
- data/app/controllers/shipit/api/merge_requests_controller.rb +6 -5
- data/app/controllers/shipit/api/outputs_controller.rb +1 -0
- data/app/controllers/shipit/api/release_statuses_controller.rb +2 -1
- data/app/controllers/shipit/api/rollbacks_controller.rb +1 -0
- data/app/controllers/shipit/api/stacks_controller.rb +15 -14
- data/app/controllers/shipit/api/tasks_controller.rb +6 -5
- data/app/controllers/shipit/api_clients_controller.rb +6 -7
- data/app/controllers/shipit/ccmenu_url_controller.rb +3 -2
- data/app/controllers/shipit/commit_checks_controller.rb +2 -1
- data/app/controllers/shipit/commits_controller.rb +1 -0
- data/app/controllers/shipit/continuous_delivery_schedules_controller.rb +42 -0
- data/app/controllers/shipit/deploys_controller.rb +6 -5
- data/app/controllers/shipit/github_authentication_controller.rb +6 -0
- data/app/controllers/shipit/merge_requests_controller.rb +1 -0
- data/app/controllers/shipit/merge_status_controller.rb +30 -26
- data/app/controllers/shipit/release_statuses_controller.rb +1 -0
- data/app/controllers/shipit/repositories_controller.rb +4 -7
- data/app/controllers/shipit/rollbacks_controller.rb +2 -1
- data/app/controllers/shipit/shipit_controller.rb +1 -0
- data/app/controllers/shipit/stacks_controller.rb +27 -31
- data/app/controllers/shipit/status_controller.rb +1 -0
- data/app/controllers/shipit/tasks_controller.rb +3 -1
- data/app/controllers/shipit/webhooks_controller.rb +2 -1
- data/app/helpers/shipit/api_clients_helper.rb +1 -0
- data/app/helpers/shipit/chunks_helper.rb +3 -1
- data/app/helpers/shipit/deploys_helper.rb +7 -3
- data/app/helpers/shipit/github_url_helper.rb +5 -4
- data/app/helpers/shipit/merge_status_helper.rb +1 -0
- data/app/helpers/shipit/shipit_helper.rb +11 -10
- data/app/helpers/shipit/stacks_helper.rb +10 -11
- data/app/helpers/shipit/tasks_helper.rb +2 -1
- data/app/jobs/shipit/background_job/unique.rb +3 -2
- data/app/jobs/shipit/background_job.rb +9 -1
- data/app/jobs/shipit/cache_deploy_spec_job.rb +2 -1
- data/app/jobs/shipit/chunk_rollup_job.rb +1 -0
- data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
- data/app/jobs/shipit/continuous_delivery_job.rb +5 -0
- data/app/jobs/shipit/create_on_github_job.rb +1 -0
- data/app/jobs/shipit/create_release_statuses_job.rb +2 -0
- data/app/jobs/shipit/deferred_touch_job.rb +1 -0
- data/app/jobs/shipit/deliver_hook_job.rb +1 -0
- data/app/jobs/shipit/destroy_job.rb +1 -0
- data/app/jobs/shipit/destroy_repository_job.rb +1 -0
- data/app/jobs/shipit/destroy_stack_job.rb +36 -15
- data/app/jobs/shipit/emit_event_job.rb +1 -0
- data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
- data/app/jobs/shipit/fetch_deployed_revision_job.rb +1 -0
- data/app/jobs/shipit/github_sync_job.rb +4 -2
- data/app/jobs/shipit/mark_deploy_healthy_job.rb +1 -0
- data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
- data/app/jobs/shipit/perform_task_job.rb +1 -0
- data/app/jobs/shipit/process_merge_requests_job.rb +2 -0
- data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
- data/app/jobs/shipit/reap_dead_tasks_job.rb +1 -0
- data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
- data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
- data/app/jobs/shipit/refresh_merge_request_job.rb +1 -0
- data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
- data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
- data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
- data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +6 -7
- data/app/models/concerns/shipit/deferred_touch.rb +5 -2
- data/app/models/shipit/anonymous_user.rb +4 -5
- data/app/models/shipit/api_client.rb +5 -3
- data/app/models/shipit/application_record.rb +1 -0
- data/app/models/shipit/check_run.rb +7 -6
- data/app/models/shipit/command_line_user.rb +4 -5
- data/app/models/shipit/commit.rb +46 -32
- data/app/models/shipit/commit_checks.rb +4 -2
- data/app/models/shipit/commit_deployment.rb +7 -5
- data/app/models/shipit/commit_deployment_status.rb +5 -3
- data/app/models/shipit/commit_message.rb +2 -0
- data/app/models/shipit/continuous_delivery_schedule.rb +84 -0
- data/app/models/shipit/delivery.rb +5 -4
- data/app/models/shipit/deploy.rb +46 -26
- data/app/models/shipit/deploy_spec/bundler_discovery.rb +3 -1
- data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec/file_system.rb +48 -17
- data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +4 -3
- data/app/models/shipit/deploy_spec/lerna_discovery.rb +32 -31
- data/app/models/shipit/deploy_spec/npm_discovery.rb +18 -13
- data/app/models/shipit/deploy_spec/pypi_discovery.rb +5 -4
- data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec.rb +25 -30
- data/app/models/shipit/deploy_stats.rb +6 -1
- data/app/models/shipit/duration.rb +5 -3
- data/app/models/shipit/ephemeral_commit_checks.rb +8 -7
- data/app/models/shipit/github_hook.rb +1 -0
- data/app/models/shipit/github_status.rb +1 -0
- data/app/models/shipit/hook.rb +9 -7
- data/app/models/shipit/membership.rb +1 -0
- data/app/models/shipit/merge_request.rb +26 -16
- data/app/models/shipit/output_chunk.rb +1 -0
- data/app/models/shipit/provisioning_handler.rb +1 -0
- data/app/models/shipit/pull_request.rb +2 -2
- data/app/models/shipit/record.rb +1 -0
- data/app/models/shipit/release_status.rb +4 -3
- data/app/models/shipit/repository.rb +12 -11
- data/app/models/shipit/review_stack.rb +3 -1
- data/app/models/shipit/review_stack_provisioning_queue.rb +2 -2
- data/app/models/shipit/rollback.rb +2 -0
- data/app/models/shipit/stack.rb +71 -60
- data/app/models/shipit/status/common.rb +1 -0
- data/app/models/shipit/status/group.rb +5 -3
- data/app/models/shipit/status/missing.rb +2 -1
- data/app/models/shipit/status/unknown.rb +1 -0
- data/app/models/shipit/status.rb +5 -4
- data/app/models/shipit/task.rb +40 -31
- data/app/models/shipit/task_definition.rb +10 -7
- data/app/models/shipit/task_execution_strategy/default.rb +13 -13
- data/app/models/shipit/team.rb +13 -12
- data/app/models/shipit/undeployed_commit.rb +8 -3
- data/app/models/shipit/unlimited_api_client.rb +2 -2
- data/app/models/shipit/user.rb +23 -16
- data/app/models/shipit/variable_definition.rb +2 -1
- data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +1 -0
- data/app/models/shipit/webhooks/handlers/handler.rb +1 -0
- data/app/models/shipit/webhooks/handlers/membership_handler.rb +1 -0
- data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +10 -10
- data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +1 -1
- data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +10 -10
- data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +2 -2
- data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +2 -2
- data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +1 -1
- data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +3 -3
- data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +1 -1
- data/app/models/shipit/webhooks/handlers/push_handler.rb +2 -1
- data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -0
- data/app/models/shipit/webhooks.rb +3 -2
- data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
- data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
- data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
- data/app/serializers/shipit/commit_serializer.rb +2 -1
- data/app/serializers/shipit/deploy_serializer.rb +1 -0
- data/app/serializers/shipit/hook_serializer.rb +1 -0
- data/app/serializers/shipit/merge_request_serializer.rb +2 -1
- data/app/serializers/shipit/rollback_serializer.rb +1 -0
- data/app/serializers/shipit/short_commit_serializer.rb +1 -0
- data/app/serializers/shipit/stack_serializer.rb +4 -3
- data/app/serializers/shipit/tail_task_serializer.rb +4 -1
- data/app/serializers/shipit/task_serializer.rb +1 -0
- data/app/serializers/shipit/user_serializer.rb +1 -0
- data/app/validators/ascii_only_validator.rb +4 -3
- data/app/validators/subset_validator.rb +1 -0
- data/app/views/shipit/_variables.html.erb +1 -1
- data/app/views/shipit/ccmenu/project.xml.builder +2 -1
- data/app/views/shipit/continuous_delivery_schedules/show.html.erb +59 -0
- data/app/views/shipit/merge_status/failure.html.erb +1 -1
- data/app/views/shipit/missing_settings.html.erb +1 -1
- data/app/views/shipit/stacks/_settings_form.erb +1 -0
- data/config/initializers/inflections.rb +1 -0
- data/config/locales/en.yml +1 -0
- data/config/routes.rb +21 -18
- data/config/secrets.development.example.yml +1 -1
- data/config/secrets.development.shopify.yml +1 -1
- data/db/migrate/20240821003007_add_continuous_delivery_schedules.rb +13 -0
- data/db/migrate/20250207203053_embiggen_github_ids.rb +8 -0
- data/lib/shipit/cast_value.rb +1 -0
- data/lib/shipit/command.rb +29 -9
- data/lib/shipit/commands.rb +4 -2
- data/lib/shipit/csv_serializer.rb +3 -0
- data/lib/shipit/deploy_commands.rb +2 -1
- data/lib/shipit/engine.rb +6 -5
- data/lib/shipit/environment_variables.rb +2 -0
- data/lib/shipit/first_parent_commits_iterator.rb +2 -3
- data/lib/shipit/flock.rb +11 -9
- data/lib/shipit/github_app.rb +14 -16
- data/lib/shipit/github_http_cache_middleware.rb +1 -0
- data/lib/shipit/null_serializer.rb +1 -0
- data/lib/shipit/octokit_check_runs.rb +2 -3
- data/lib/shipit/octokit_iterator.rb +2 -0
- data/lib/shipit/paginator.rb +1 -0
- data/lib/shipit/rollback_commands.rb +2 -1
- data/lib/shipit/same_site_cookie_middleware.rb +1 -0
- data/lib/shipit/simple_message_verifier.rb +1 -0
- data/lib/shipit/stack_commands.rb +35 -27
- data/lib/shipit/stat.rb +1 -0
- data/lib/shipit/task_commands.rb +7 -6
- data/lib/shipit/version.rb +2 -1
- data/lib/shipit.rb +30 -17
- data/lib/tasks/cron.rake +2 -1
- data/lib/tasks/dev.rake +3 -2
- data/lib/tasks/shipit.rake +3 -2
- data/lib/tasks/teams.rake +3 -2
- data/test/controllers/api/base_controller_test.rb +1 -0
- data/test/controllers/api/ccmenu_controller_test.rb +4 -3
- data/test/controllers/api/commits_controller_test.rb +1 -0
- data/test/controllers/api/deploys_controller_test.rb +26 -1
- data/test/controllers/api/hooks_controller_test.rb +6 -5
- data/test/controllers/api/locks_controller_test.rb +1 -0
- data/test/controllers/api/merge_requests_controller_test.rb +1 -0
- data/test/controllers/api/outputs_controller_test.rb +1 -0
- data/test/controllers/api/release_statuses_controller_test.rb +4 -3
- data/test/controllers/api/rollback_controller_test.rb +3 -2
- data/test/controllers/api/stacks_controller_test.rb +13 -12
- data/test/controllers/api/tasks_controller_test.rb +7 -6
- data/test/controllers/api_clients_controller_test.rb +10 -10
- data/test/controllers/ccmenu_controller_test.rb +1 -0
- data/test/controllers/commit_checks_controller_test.rb +1 -0
- data/test/controllers/commits_controller_test.rb +9 -8
- data/test/controllers/continuous_delivery_schedules_controller_test.rb +66 -0
- data/test/controllers/deploys_controller_test.rb +4 -2
- data/test/controllers/github_authentication_controller_test.rb +6 -4
- data/test/controllers/merge_requests_controller_test.rb +1 -0
- data/test/controllers/merge_status_controller_test.rb +5 -4
- data/test/controllers/release_statuses_controller_test.rb +1 -0
- data/test/controllers/repositories_controller_test.rb +6 -5
- data/test/controllers/rollbacks_controller_test.rb +3 -2
- data/test/controllers/stacks_controller_test.rb +8 -6
- data/test/controllers/status_controller_test.rb +1 -0
- data/test/controllers/tasks_controller_test.rb +13 -5
- data/test/controllers/webhooks_controller_test.rb +10 -9
- data/test/dummy/config/application.rb +2 -1
- data/test/dummy/config/initializers/0_load_development_secrets.rb +2 -2
- data/test/dummy/config/secrets.development.json +3 -0
- data/test/dummy/config/secrets.test.json +21 -0
- data/test/dummy/db/schema.rb +33 -6
- data/test/fixtures/shipit/commits.yml +7 -7
- data/test/fixtures/shipit/stacks.yml +4 -10
- data/test/fixtures/shipit/tasks.yml +3 -3
- data/test/helpers/api_helper.rb +2 -3
- data/test/helpers/fixture_aliases_helper.rb +1 -0
- data/test/helpers/hooks_helper.rb +1 -0
- data/test/helpers/json_helper.rb +4 -3
- data/test/helpers/links_helper.rb +2 -1
- data/test/helpers/payloads_helper.rb +1 -0
- data/test/helpers/queries_helper.rb +4 -3
- data/test/jobs/cache_deploy_spec_job_test.rb +3 -2
- data/test/jobs/chunk_rollup_job_test.rb +3 -2
- data/test/jobs/deliver_hook_job_test.rb +1 -0
- data/test/jobs/destroy_repository_job_test.rb +1 -0
- data/test/jobs/destroy_stack_job_test.rb +12 -0
- data/test/jobs/emit_event_job_test.rb +1 -0
- data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
- data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
- data/test/jobs/github_sync_job_test.rb +22 -21
- data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
- data/test/jobs/perform_task_job_test.rb +3 -3
- data/test/jobs/process_merge_requests_job_test.rb +7 -6
- data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
- data/test/jobs/reap_dead_tasks_job_test.rb +1 -0
- data/test/jobs/refresh_github_user_job_test.rb +1 -0
- data/test/jobs/refresh_status_job_test.rb +1 -0
- data/test/jobs/shipit/background_job_test.rb +35 -0
- data/test/jobs/shipit/continuous_delivery_job_test.rb +31 -0
- data/test/jobs/unique_job_test.rb +3 -1
- data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
- data/test/middleware/same_site_cookie_middleware_test.rb +2 -2
- data/test/models/api_client_test.rb +1 -0
- data/test/models/commit_checks_test.rb +2 -1
- data/test/models/commit_deployment_status_test.rb +2 -2
- data/test/models/commit_deployment_test.rb +4 -3
- data/test/models/commits_test.rb +72 -70
- data/test/models/delivery_test.rb +3 -2
- data/test/models/deploy_spec_test.rb +113 -109
- data/test/models/deploy_stats_test.rb +1 -0
- data/test/models/deploys_test.rb +65 -56
- data/test/models/duration_test.rb +1 -1
- data/test/models/github_hook_test.rb +1 -0
- data/test/models/hook_test.rb +7 -4
- data/test/models/membership_test.rb +1 -0
- data/test/models/merge_request_test.rb +26 -20
- data/test/models/release_statuses_test.rb +2 -1
- data/test/models/rollbacks_test.rb +4 -3
- data/test/models/shipit/check_run_test.rb +16 -15
- data/test/models/shipit/continuous_delivery_schedule_test.rb +109 -0
- data/test/models/shipit/deploy_spec/file_system_test.rb +54 -10
- data/test/models/shipit/pull_request_test.rb +9 -9
- data/test/models/shipit/repository_test.rb +3 -2
- data/test/models/shipit/review_stack_provisioning_queue_test.rb +2 -2
- data/test/models/shipit/{stacks_test.rb → stack_test.rb} +48 -34
- data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +36 -34
- data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +28 -28
- data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +42 -42
- data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +33 -33
- data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +37 -37
- data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +1 -1
- data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +44 -42
- data/test/models/shipit/webhooks/handlers_test.rb +1 -0
- data/test/models/status/group_test.rb +3 -2
- data/test/models/status/missing_test.rb +1 -0
- data/test/models/status_test.rb +2 -1
- data/test/models/task_definitions_test.rb +7 -6
- data/test/models/tasks_test.rb +5 -4
- data/test/models/team_test.rb +5 -4
- data/test/models/undeployed_commits_test.rb +10 -9
- data/test/models/users_test.rb +29 -20
- data/test/test_command_integration.rb +1 -1
- data/test/test_helper.rb +12 -10
- data/test/unit/anonymous_user_serializer_test.rb +1 -0
- data/test/unit/command_test.rb +10 -1
- data/test/unit/commands_test.rb +1 -0
- data/test/unit/commit_serializer_test.rb +1 -0
- data/test/unit/csv_serializer_test.rb +3 -2
- data/test/unit/deploy_commands_test.rb +33 -23
- data/test/unit/deploy_serializer_test.rb +1 -0
- data/test/unit/environment_variables_test.rb +2 -1
- data/test/unit/github_app_test.rb +11 -10
- data/test/unit/github_apps_test.rb +19 -18
- data/test/unit/github_url_helper_test.rb +1 -0
- data/test/unit/line_buffer_test.rb +1 -1
- data/test/unit/rollback_commands_test.rb +2 -1
- data/test/unit/shipit_helper_test.rb +1 -0
- data/test/unit/shipit_test.rb +47 -1
- data/test/unit/user_serializer_test.rb +1 -0
- data/test/unit/variable_definition_test.rb +4 -3
- metadata +61 -47
data/app/models/shipit/hook.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class Hook < Record
|
4
5
|
class DeliverySigner
|
@@ -46,7 +47,7 @@ module Shipit
|
|
46
47
|
'Content-Type' => content_type,
|
47
48
|
'X-Shipit-Event' => event,
|
48
49
|
'X-Shipit-Signature' => signature,
|
49
|
-
'Accept' => '*/*'
|
50
|
+
'Accept' => '*/*'
|
50
51
|
}
|
51
52
|
end
|
52
53
|
|
@@ -63,10 +64,10 @@ module Shipit
|
|
63
64
|
|
64
65
|
CONTENT_TYPES = {
|
65
66
|
'json' => 'application/json',
|
66
|
-
'form' => 'application/x-www-form-urlencoded'
|
67
|
+
'form' => 'application/x-www-form-urlencoded'
|
67
68
|
}.freeze
|
68
69
|
|
69
|
-
EVENTS = %w
|
70
|
+
EVENTS = %w[
|
70
71
|
stack
|
71
72
|
review_stack
|
72
73
|
task
|
@@ -78,7 +79,7 @@ module Shipit
|
|
78
79
|
merge_status
|
79
80
|
merge
|
80
81
|
pull_request
|
81
|
-
|
82
|
+
].freeze
|
82
83
|
|
83
84
|
belongs_to :stack, required: false
|
84
85
|
has_many :deliveries
|
@@ -87,7 +88,7 @@ module Shipit
|
|
87
88
|
validates :content_type, presence: true, inclusion: { in: CONTENT_TYPES.keys }
|
88
89
|
validates :events, presence: true, subset: { of: EVENTS }
|
89
90
|
|
90
|
-
serialize :events, Shipit::CSVSerializer
|
91
|
+
serialize :events, coder: Shipit::CSVSerializer
|
91
92
|
|
92
93
|
scope :global, -> { where(stack_id: nil) }
|
93
94
|
scope :scoped_to, ->(stack) { where(stack_id: stack.id) }
|
@@ -96,10 +97,11 @@ module Shipit
|
|
96
97
|
class << self
|
97
98
|
def emit(event, stack, payload)
|
98
99
|
raise "#{event} is not declared in Shipit::Hook::EVENTS" unless EVENTS.include?(event.to_s)
|
100
|
+
|
99
101
|
Shipit::EmitEventJob.perform_later(
|
100
102
|
event: event.to_s,
|
101
103
|
stack_id: stack&.id,
|
102
|
-
payload: coerce_payload(payload)
|
104
|
+
payload: coerce_payload(payload)
|
103
105
|
)
|
104
106
|
deliver_internal_hooks(event, stack, payload)
|
105
107
|
end
|
@@ -142,7 +144,7 @@ module Shipit
|
|
142
144
|
url: delivery_url,
|
143
145
|
content_type: CONTENT_TYPES[content_type],
|
144
146
|
payload: serialize_payload(payload),
|
145
|
-
secret:
|
147
|
+
secret:
|
146
148
|
)
|
147
149
|
end
|
148
150
|
|
@@ -1,13 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class MergeRequest < ApplicationRecord
|
4
5
|
include DeferredTouch
|
5
6
|
|
6
7
|
MERGE_REQUEST_FIELD = 'Merge-Requested-By'
|
7
8
|
|
8
|
-
WAITING_STATUSES = %w
|
9
|
-
QUEUED_STATUSES = %w
|
10
|
-
REJECTION_REASONS = %w
|
9
|
+
WAITING_STATUSES = %w[fetching pending].freeze
|
10
|
+
QUEUED_STATUSES = %w[pending revalidating].freeze
|
11
|
+
REJECTION_REASONS = %w[ci_missing ci_failing merge_conflict requires_rebase].freeze
|
11
12
|
InvalidTransition = Class.new(StandardError)
|
12
13
|
NotReady = Class.new(StandardError)
|
13
14
|
|
@@ -85,14 +86,14 @@ module Shipit
|
|
85
86
|
end
|
86
87
|
|
87
88
|
event :retry do
|
88
|
-
transition %i
|
89
|
+
transition %i[rejected canceled revalidating] => :pending
|
89
90
|
end
|
90
91
|
|
91
92
|
before_transition rejected: any do |pr|
|
92
93
|
pr.rejection_reason = nil
|
93
94
|
end
|
94
95
|
|
95
|
-
before_transition %i
|
96
|
+
before_transition %i[fetching rejected canceled] => :pending do |pr|
|
96
97
|
pr.merge_requested_at = Time.now.utc
|
97
98
|
end
|
98
99
|
|
@@ -100,7 +101,7 @@ module Shipit
|
|
100
101
|
pr.revalidated_at = Time.now.utc
|
101
102
|
end
|
102
103
|
|
103
|
-
before_transition %i
|
104
|
+
before_transition %i[pending] => :merged do |pr|
|
104
105
|
Stack.increment_counter(:undeployed_commits_count, pr.stack_id)
|
105
106
|
end
|
106
107
|
end
|
@@ -117,6 +118,7 @@ module Shipit
|
|
117
118
|
when %r{\Ahttps://#{Regexp.escape(Shipit.github(organization: org).domain)}/([^/]+)/([^/]+)/pull/(\d+)}
|
118
119
|
return unless $1.downcase == stack.repo_owner.downcase
|
119
120
|
return unless $2.downcase == stack.repo_name.downcase
|
121
|
+
|
120
122
|
$3.to_i
|
121
123
|
end
|
122
124
|
end
|
@@ -126,10 +128,10 @@ module Shipit
|
|
126
128
|
merge_request = begin
|
127
129
|
create_with(
|
128
130
|
merge_requested_at: now,
|
129
|
-
merge_requested_by: user.presence
|
131
|
+
merge_requested_by: user.presence
|
130
132
|
).find_or_create_by!(
|
131
|
-
stack
|
132
|
-
number:
|
133
|
+
stack:,
|
134
|
+
number:
|
133
135
|
)
|
134
136
|
rescue ActiveRecord::RecordNotUnique
|
135
137
|
retry
|
@@ -144,6 +146,7 @@ module Shipit
|
|
144
146
|
unless REJECTION_REASONS.include?(reason)
|
145
147
|
raise ArgumentError, "invalid reason: #{reason.inspect}, must be one of: #{REJECTION_REASONS.inspect}"
|
146
148
|
end
|
149
|
+
|
147
150
|
self.rejection_reason = reason.presence
|
148
151
|
super()
|
149
152
|
true
|
@@ -154,6 +157,7 @@ module Shipit
|
|
154
157
|
return reject!('ci_missing') if any_status_checks_missing?
|
155
158
|
return reject!('ci_failing') if any_status_checks_failed?
|
156
159
|
return reject!('requires_rebase') if stale?
|
160
|
+
|
157
161
|
false
|
158
162
|
end
|
159
163
|
|
@@ -168,7 +172,7 @@ module Shipit
|
|
168
172
|
merge_message,
|
169
173
|
sha: head.sha,
|
170
174
|
commit_message: 'Merged by Shipit',
|
171
|
-
merge_method: stack.merge_method
|
175
|
+
merge_method: stack.merge_method
|
172
176
|
)
|
173
177
|
begin
|
174
178
|
if stack.github_api.pull_requests(stack.github_repo_name, base: branch).empty?
|
@@ -188,6 +192,7 @@ module Shipit
|
|
188
192
|
|
189
193
|
def all_status_checks_passed?
|
190
194
|
return false unless head
|
195
|
+
|
191
196
|
StatusChecker.new(head, head.statuses_and_check_runs, stack.cached_deploy_spec).success?
|
192
197
|
end
|
193
198
|
|
@@ -207,6 +212,7 @@ module Shipit
|
|
207
212
|
def need_revalidation?
|
208
213
|
timeout = stack.cached_deploy_spec&.revalidate_merge_requests_after
|
209
214
|
return false unless timeout
|
215
|
+
|
210
216
|
(revalidated_at + timeout).past?
|
211
217
|
end
|
212
218
|
|
@@ -255,18 +261,21 @@ module Shipit
|
|
255
261
|
|
256
262
|
def merge_message
|
257
263
|
return title unless merge_requested_by
|
264
|
+
|
258
265
|
"#{title}\n\n#{MERGE_REQUEST_FIELD}: #{merge_requested_by.login}\n"
|
259
266
|
end
|
260
267
|
|
261
268
|
def stale?
|
262
269
|
return false unless base_commit
|
270
|
+
|
263
271
|
spec = stack.cached_deploy_spec
|
264
|
-
if max_branch_age = spec.max_divergence_age
|
265
|
-
return true
|
272
|
+
if (max_branch_age = spec.max_divergence_age) && (Time.now.utc - head.committed_at > max_branch_age)
|
273
|
+
return true
|
266
274
|
end
|
267
|
-
if commit_count_limit = spec.max_divergence_commits
|
268
|
-
return true
|
275
|
+
if (commit_count_limit = spec.max_divergence_commits) && (comparison.behind_by > commit_count_limit)
|
276
|
+
return true
|
269
277
|
end
|
278
|
+
|
270
279
|
false
|
271
280
|
end
|
272
281
|
|
@@ -274,7 +283,7 @@ module Shipit
|
|
274
283
|
@comparison ||= stack.github_api.compare(
|
275
284
|
stack.github_repo_name,
|
276
285
|
base_ref,
|
277
|
-
head.sha
|
286
|
+
head.sha
|
278
287
|
)
|
279
288
|
end
|
280
289
|
|
@@ -286,8 +295,9 @@ module Shipit
|
|
286
295
|
|
287
296
|
def emit_hooks
|
288
297
|
return unless @merge_status_changed
|
298
|
+
|
289
299
|
@merge_status_changed = nil
|
290
|
-
Hook.emit('merge', stack, merge_request: self, status: merge_status, stack:
|
300
|
+
Hook.emit('merge', stack, merge_request: self, status: merge_status, stack:)
|
291
301
|
end
|
292
302
|
|
293
303
|
def find_or_create_commit_from_github_by_sha!(sha, attributes)
|
@@ -11,7 +11,7 @@ module Shipit
|
|
11
11
|
has_many :pull_request_assignments
|
12
12
|
has_many :assignees, class_name: :User, through: :pull_request_assignments, source: :user
|
13
13
|
|
14
|
-
serialize :labels, Shipit.serialized_column(:labels, type: Array)
|
14
|
+
serialize :labels, coder: Shipit.serialized_column(:labels, type: Array)
|
15
15
|
|
16
16
|
after_create_commit :emit_create_hooks
|
17
17
|
after_update_commit :emit_update_hooks
|
@@ -30,7 +30,7 @@ module Shipit
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def emit_hooks(reason)
|
33
|
-
Hook.emit('pull_request', stack, action: reason, pull_request: self, stack:
|
33
|
+
Hook.emit('pull_request', stack, action: reason, pull_request: self, stack:)
|
34
34
|
end
|
35
35
|
|
36
36
|
def github_pull_request=(github_pull_request)
|
data/app/models/shipit/record.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class ReleaseStatus < Record
|
4
5
|
MAX_DESCRIPTION_LENGTH = 140
|
@@ -13,7 +14,7 @@ module Shipit
|
|
13
14
|
|
14
15
|
scope :to_be_created, -> { where(github_id: nil).order(id: :asc) }
|
15
16
|
|
16
|
-
STATES = %w
|
17
|
+
STATES = %w[pending success failure error].freeze
|
17
18
|
validates :state, presence: true, inclusion: { in: STATES }
|
18
19
|
|
19
20
|
def create_status_on_github!
|
@@ -30,8 +31,8 @@ module Shipit
|
|
30
31
|
commit.sha,
|
31
32
|
state,
|
32
33
|
context: stack.release_status_context,
|
33
|
-
target_url
|
34
|
-
description: description&.truncate(MAX_DESCRIPTION_LENGTH)
|
34
|
+
target_url:,
|
35
|
+
description: description&.truncate(MAX_DESCRIPTION_LENGTH)
|
35
36
|
)
|
36
37
|
end
|
37
38
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class NullRepository
|
4
5
|
def id
|
@@ -37,29 +38,29 @@ module Shipit
|
|
37
38
|
NAME_MAX_SIZE = 100
|
38
39
|
private_constant :NAME_MAX_SIZE
|
39
40
|
|
40
|
-
validates :name, uniqueness: { scope: %i
|
41
|
-
message: 'cannot be used more than once'
|
41
|
+
validates :name, uniqueness: { scope: %i[owner], case_sensitive: false,
|
42
|
+
message: 'cannot be used more than once' }
|
42
43
|
validates :owner, :name, presence: true, ascii_only: true
|
43
|
-
validates :owner, format: { with: /\A[a-z0-9_
|
44
|
-
validates :name, format: { with: /\A[a-z0-9_
|
44
|
+
validates :owner, format: { with: /\A[a-z0-9_\-.]+\z/ }, length: { maximum: OWNER_MAX_SIZE }
|
45
|
+
validates :name, format: { with: /\A[a-z0-9_\-.]+\z/ }, length: { maximum: NAME_MAX_SIZE }
|
45
46
|
|
46
47
|
has_many :stacks, dependent: :destroy
|
47
48
|
has_many :review_stacks, dependent: :destroy
|
48
49
|
|
49
|
-
PROVISIONING_BEHAVIORS = %w
|
50
|
-
enum provisioning_behavior
|
50
|
+
PROVISIONING_BEHAVIORS = %w[allow_all allow_with_label prevent_with_label].freeze
|
51
|
+
enum :provisioning_behavior, PROVISIONING_BEHAVIORS.zip(PROVISIONING_BEHAVIORS).to_h, prefix: :provisioning_behavior
|
51
52
|
|
52
53
|
def self.from_github_repo_name(github_repo_name)
|
53
54
|
repo_owner, repo_name = github_repo_name.downcase.split('/')
|
54
55
|
find_by(owner: repo_owner, name: repo_name)
|
55
56
|
end
|
56
57
|
|
57
|
-
def name=(
|
58
|
-
super(
|
58
|
+
def name=(name_value)
|
59
|
+
super(name_value&.downcase)
|
59
60
|
end
|
60
61
|
|
61
|
-
def owner=(
|
62
|
-
super(
|
62
|
+
def owner=(owner_value)
|
63
|
+
super(owner_value&.downcase)
|
63
64
|
end
|
64
65
|
|
65
66
|
def github_repo_name
|
@@ -90,7 +91,7 @@ module Shipit
|
|
90
91
|
repo_owner, repo_name = param.split('/')
|
91
92
|
where(
|
92
93
|
owner: repo_owner.downcase,
|
93
|
-
name: repo_name.downcase
|
94
|
+
name: repo_name.downcase
|
94
95
|
).first!
|
95
96
|
end
|
96
97
|
|
@@ -102,11 +102,13 @@ module Shipit
|
|
102
102
|
|
103
103
|
def enqueue_for_provisioning
|
104
104
|
return if awaiting_provision
|
105
|
+
|
105
106
|
update!(awaiting_provision: true)
|
106
107
|
end
|
107
108
|
|
108
109
|
def remove_from_provisioning_queue
|
109
110
|
return unless awaiting_provision
|
111
|
+
|
110
112
|
update!(awaiting_provision: false)
|
111
113
|
end
|
112
114
|
|
@@ -119,7 +121,7 @@ module Shipit
|
|
119
121
|
end
|
120
122
|
|
121
123
|
def emit_updated_hooks
|
122
|
-
changed = !(previous_changes.keys - %w
|
124
|
+
changed = !(previous_changes.keys - %w[updated_at]).empty?
|
123
125
|
Hook.emit(:review_stack, self, action: :updated, review_stack: self) if changed
|
124
126
|
end
|
125
127
|
|
@@ -20,8 +20,8 @@ module Shipit
|
|
20
20
|
|
21
21
|
def queued_stacks
|
22
22
|
@queued_stacks ||= Shipit::ReviewStack
|
23
|
-
|
24
|
-
|
23
|
+
.with_provision_status(:deprovisioned)
|
24
|
+
.where(awaiting_provision: true)
|
25
25
|
end
|
26
26
|
|
27
27
|
private
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class Rollback < Deploy
|
4
5
|
belongs_to :deploy, foreign_key: :parent_id, inverse_of: false
|
@@ -45,6 +46,7 @@ module Shipit
|
|
45
46
|
# When we rollback to a certain revision, assume that all later deploys were faulty
|
46
47
|
stack.deploys.newer_than(deploy.id).until(stack.last_completed_deploy.id).to_a.each do |deploy|
|
47
48
|
next if deploy.id == id
|
49
|
+
|
48
50
|
deploy.report_faulty!(description: "A rollback of #{stack.to_param} was triggered")
|
49
51
|
end
|
50
52
|
end
|