shipit-engine 0.30.0 → 0.34.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 +19 -4
- data/Rakefile +4 -2
- data/app/assets/images/magic-solid.svg +1 -0
- data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
- data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
- data/app/assets/stylesheets/_pages/_deploy.scss +0 -2
- data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
- data/app/assets/stylesheets/_pages/_stacks.scss +19 -3
- data/app/assets/stylesheets/merge_status.scss +0 -3
- data/app/assets/stylesheets/shipit.scss +1 -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 +5 -4
- data/app/controllers/concerns/shipit/authentication.rb +3 -2
- data/app/controllers/concerns/shipit/pagination.rb +2 -1
- data/app/controllers/shipit/api/base_controller.rb +11 -6
- data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
- data/app/controllers/shipit/api/commits_controller.rb +2 -1
- data/app/controllers/shipit/api/deploys_controller.rb +6 -3
- data/app/controllers/shipit/api/hooks_controller.rb +6 -5
- data/app/controllers/shipit/api/locks_controller.rb +5 -4
- data/app/controllers/shipit/api/merge_requests_controller.rb +37 -0
- data/app/controllers/shipit/api/outputs_controller.rb +2 -1
- data/app/controllers/shipit/api/release_statuses_controller.rb +3 -2
- data/app/controllers/shipit/api/rollbacks_controller.rb +34 -0
- data/app/controllers/shipit/api/stacks_controller.rb +32 -5
- data/app/controllers/shipit/api/tasks_controller.rb +6 -5
- data/app/controllers/shipit/api_clients_controller.rb +4 -3
- data/app/controllers/shipit/ccmenu_url_controller.rb +4 -3
- data/app/controllers/shipit/commit_checks_controller.rb +2 -1
- data/app/controllers/shipit/commits_controller.rb +2 -1
- data/app/controllers/shipit/deploys_controller.rb +4 -3
- data/app/controllers/shipit/github_authentication_controller.rb +4 -3
- data/app/controllers/shipit/merge_requests_controller.rb +31 -0
- data/app/controllers/shipit/merge_status_controller.rb +31 -30
- data/app/controllers/shipit/release_statuses_controller.rb +3 -2
- data/app/controllers/shipit/repositories_controller.rb +74 -0
- data/app/controllers/shipit/rollbacks_controller.rb +3 -2
- data/app/controllers/shipit/shipit_controller.rb +2 -1
- data/app/controllers/shipit/stacks_controller.rb +24 -9
- data/app/controllers/shipit/status_controller.rb +2 -1
- data/app/controllers/shipit/tasks_controller.rb +7 -6
- data/app/controllers/shipit/webhooks_controller.rb +26 -6
- data/app/helpers/shipit/chunks_helper.rb +3 -2
- data/app/helpers/shipit/deploys_helper.rb +4 -3
- data/app/helpers/shipit/github_url_helper.rb +9 -0
- data/app/helpers/shipit/merge_status_helper.rb +1 -0
- data/app/helpers/shipit/shipit_helper.rb +1 -1
- data/app/helpers/shipit/stacks_helper.rb +5 -0
- data/app/helpers/shipit/tasks_helper.rb +1 -0
- data/app/jobs/shipit/background_job.rb +4 -0
- data/app/jobs/shipit/background_job/unique.rb +1 -0
- data/app/jobs/shipit/cache_deploy_spec_job.rb +1 -0
- data/app/jobs/shipit/chunk_rollup_job.rb +4 -0
- data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
- data/app/jobs/shipit/continuous_delivery_job.rb +2 -1
- data/app/jobs/shipit/create_on_github_job.rb +7 -1
- data/app/jobs/shipit/create_release_statuses_job.rb +1 -0
- data/app/jobs/shipit/deferred_touch_job.rb +4 -0
- data/app/jobs/shipit/deliver_hook_job.rb +2 -1
- data/app/jobs/shipit/destroy_job.rb +1 -0
- data/app/jobs/shipit/destroy_repository_job.rb +24 -0
- data/app/jobs/shipit/destroy_stack_job.rb +3 -2
- data/app/jobs/shipit/emit_event_job.rb +2 -1
- 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 +15 -10
- 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 +5 -92
- data/app/jobs/shipit/process_merge_requests_job.rb +32 -0
- data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
- data/app/jobs/shipit/reap_dead_tasks_job.rb +21 -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 +11 -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 +5 -4
- data/app/models/concerns/shipit/deferred_touch.rb +4 -3
- data/app/models/shipit/anonymous_user.rb +15 -2
- data/app/models/shipit/api_client.rb +3 -2
- data/app/models/shipit/application_record.rb +2 -1
- data/app/models/shipit/check_run.rb +41 -4
- data/app/models/shipit/command_line_user.rb +5 -0
- data/app/models/shipit/commit.rb +42 -24
- data/app/models/shipit/commit_checks.rb +15 -13
- data/app/models/shipit/commit_deployment.rb +6 -5
- data/app/models/shipit/commit_deployment_status.rb +5 -4
- data/app/models/shipit/commit_message.rb +1 -0
- data/app/models/shipit/delivery.rb +4 -3
- data/app/models/shipit/deploy.rb +23 -28
- data/app/models/shipit/deploy_spec.rb +38 -7
- data/app/models/shipit/deploy_spec/bundler_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec/file_system.rb +20 -7
- data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec/lerna_discovery.rb +13 -4
- data/app/models/shipit/deploy_spec/npm_discovery.rb +5 -4
- data/app/models/shipit/deploy_spec/pypi_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
- data/app/models/shipit/deploy_stats.rb +2 -1
- data/app/models/shipit/duration.rb +5 -2
- data/app/models/shipit/ephemeral_commit_checks.rb +1 -0
- data/app/models/shipit/github_hook.rb +2 -1
- data/app/models/shipit/github_status.rb +2 -1
- data/app/models/shipit/hook.rb +34 -7
- data/app/models/shipit/membership.rb +3 -2
- data/app/models/shipit/merge_request.rb +304 -0
- data/app/models/shipit/output_chunk.rb +7 -2
- data/app/models/shipit/provisioning_handler.rb +32 -0
- data/app/models/shipit/provisioning_handler/base.rb +30 -0
- data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
- data/app/models/shipit/pull_request.rb +28 -266
- data/app/models/shipit/pull_request_assignment.rb +10 -0
- data/app/models/shipit/record.rb +18 -0
- data/app/models/shipit/release_status.rb +4 -3
- data/app/models/shipit/repository.rb +71 -6
- data/app/models/shipit/review_stack.rb +130 -0
- data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
- data/app/models/shipit/rollback.rb +1 -0
- data/app/models/shipit/stack.rb +144 -44
- data/app/models/shipit/status.rb +3 -2
- data/app/models/shipit/status/common.rb +7 -6
- data/app/models/shipit/status/group.rb +2 -1
- data/app/models/shipit/status/missing.rb +2 -1
- data/app/models/shipit/status/unknown.rb +2 -1
- data/app/models/shipit/task.rb +98 -12
- data/app/models/shipit/task_definition.rb +1 -0
- data/app/models/shipit/task_execution_strategy/base.rb +20 -0
- data/app/models/shipit/task_execution_strategy/default.rb +109 -0
- data/app/models/shipit/team.rb +6 -3
- data/app/models/shipit/undeployed_commit.rb +1 -0
- data/app/models/shipit/unlimited_api_client.rb +1 -0
- data/app/models/shipit/user.rb +19 -8
- data/app/models/shipit/variable_definition.rb +1 -0
- data/app/models/shipit/webhooks.rb +11 -0
- 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 +74 -0
- data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +68 -0
- data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +74 -0
- data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +127 -0
- data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +106 -0
- data/app/models/shipit/webhooks/handlers/pull_request/opened_handler.rb +83 -0
- data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +88 -0
- data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +103 -0
- data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +107 -0
- data/app/models/shipit/webhooks/handlers/push_handler.rb +5 -1
- data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -0
- 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 +1 -0
- data/app/serializers/shipit/deploy_serializer.rb +8 -1
- data/app/serializers/shipit/hook_serializer.rb +1 -0
- data/app/serializers/shipit/merge_request_serializer.rb +21 -0
- data/app/serializers/shipit/pull_request_serializer.rb +6 -8
- data/app/serializers/shipit/review_stack_serializer.rb +7 -0
- 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 +8 -6
- data/app/serializers/shipit/tail_task_serializer.rb +11 -2
- data/app/serializers/shipit/task_serializer.rb +2 -17
- data/app/serializers/shipit/user_serializer.rb +6 -1
- data/app/validators/ascii_only_validator.rb +1 -0
- data/app/validators/subset_validator.rb +2 -1
- data/app/views/layouts/merge_status.html.erb +1 -1
- data/app/views/layouts/shipit.html.erb +1 -1
- data/app/views/shipit/_variables.html.erb +1 -1
- data/app/views/shipit/ccmenu/project.xml.builder +2 -1
- data/app/views/shipit/deploys/show.html.erb +2 -2
- data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
- data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
- data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
- data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
- data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
- data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
- data/app/views/shipit/merge_status/failure.html.erb +1 -1
- data/app/views/shipit/merge_status/locked.html.erb +1 -1
- data/app/views/shipit/merge_status/success.html.erb +2 -2
- data/app/views/shipit/repositories/_header.html.erb +19 -0
- data/app/views/shipit/repositories/index.html.erb +31 -0
- data/app/views/shipit/repositories/new.html.erb +23 -0
- data/app/views/shipit/repositories/settings.html.erb +53 -0
- data/app/views/shipit/repositories/show.html.erb +30 -0
- data/app/views/shipit/stacks/_banners.html.erb +15 -1
- data/app/views/shipit/stacks/_header.html.erb +20 -7
- data/app/views/shipit/stacks/_stack.html.erb +8 -0
- data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
- data/app/views/shipit/stacks/index.html.erb +3 -2
- data/app/views/shipit/stacks/new.html.erb +1 -1
- data/app/views/shipit/stacks/settings.html.erb +5 -5
- data/app/views/shipit/stacks/show.html.erb +1 -1
- data/app/views/shipit/tasks/_task_output.html.erb +1 -1
- data/app/views/shipit/tasks/show.html.erb +1 -1
- data/config/initializers/inflections.rb +2 -1
- data/config/locales/en.yml +4 -3
- data/config/routes.rb +25 -7
- data/config/secrets.development.example.yml +24 -0
- data/config/secrets.development.shopify.yml +20 -9
- data/db/migrate/20200226211925_add_index_to_tasks_status.rb +5 -0
- data/db/migrate/20200427135152_add_pull_request_head_sha_to_commit.rb +5 -0
- data/db/migrate/20200615181558_add_rollback_once_aborted_to.rb +5 -0
- data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
- data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
- data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
- data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
- data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
- data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
- data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
- data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
- data/db/migrate/20210325194053_remove_stacks_branch_default.rb +5 -0
- data/db/migrate/20210504200438_add_github_updated_at_to_check_runs.rb +5 -0
- data/lib/shipit.rb +61 -17
- data/lib/shipit/cast_value.rb +1 -0
- data/lib/shipit/command.rb +20 -21
- data/lib/shipit/commands.rb +14 -6
- data/lib/shipit/csv_serializer.rb +1 -0
- data/lib/shipit/deploy_commands.rb +1 -0
- data/lib/shipit/engine.rb +9 -2
- data/lib/shipit/environment_variables.rb +11 -1
- data/lib/shipit/first_parent_commits_iterator.rb +1 -0
- data/lib/shipit/flock.rb +9 -1
- data/lib/shipit/github_app.rb +15 -12
- 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 +3 -2
- data/lib/shipit/octokit_iterator.rb +4 -3
- data/lib/shipit/paginator.rb +3 -2
- data/lib/shipit/review_stack_commands.rb +8 -0
- data/lib/shipit/rollback_commands.rb +1 -0
- data/lib/shipit/same_site_cookie_middleware.rb +29 -0
- data/lib/shipit/simple_message_verifier.rb +3 -2
- data/lib/shipit/stack_commands.rb +37 -7
- data/lib/shipit/stat.rb +1 -0
- data/lib/shipit/task_commands.rb +23 -16
- data/lib/shipit/version.rb +2 -1
- data/lib/snippets/publish-lerna-independent-packages +35 -34
- data/lib/snippets/publish-lerna-independent-packages-legacy +39 -0
- data/lib/snippets/release-gem +5 -1
- data/lib/tasks/cron.rake +13 -2
- data/lib/tasks/dev.rake +3 -2
- data/lib/tasks/shipit.rake +15 -14
- data/lib/tasks/teams.rake +1 -0
- data/test/controllers/api/base_controller_test.rb +3 -2
- data/test/controllers/api/ccmenu_controller_test.rb +9 -8
- data/test/controllers/api/commits_controller_test.rb +3 -2
- data/test/controllers/api/deploys_controller_test.rb +32 -14
- data/test/controllers/api/hooks_controller_test.rb +8 -7
- data/test/controllers/api/locks_controller_test.rb +7 -6
- data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +17 -16
- data/test/controllers/api/outputs_controller_test.rb +3 -1
- data/test/controllers/api/release_statuses_controller_test.rb +2 -1
- data/test/controllers/api/rollback_controller_test.rb +113 -0
- data/test/controllers/api/stacks_controller_test.rb +71 -16
- data/test/controllers/api/tasks_controller_test.rb +13 -12
- data/test/controllers/api_clients_controller_test.rb +5 -4
- data/test/controllers/ccmenu_controller_test.rb +4 -3
- data/test/controllers/commit_checks_controller_test.rb +4 -3
- data/test/controllers/commits_controller_test.rb +3 -2
- data/test/controllers/deploys_controller_test.rb +32 -21
- data/test/controllers/github_authentication_controller_test.rb +1 -0
- data/test/controllers/merge_requests_controller_test.rb +32 -0
- data/test/controllers/merge_status_controller_test.rb +7 -6
- data/test/controllers/release_statuses_controller_test.rb +3 -2
- data/test/controllers/repositories_controller_test.rb +71 -0
- data/test/controllers/rollbacks_controller_test.rb +9 -8
- data/test/controllers/stacks_controller_test.rb +41 -19
- data/test/controllers/status_controller_test.rb +1 -0
- data/test/controllers/tasks_controller_test.rb +32 -19
- data/test/controllers/webhooks_controller_test.rb +33 -17
- data/test/dummy/app/assets/config/manifest.js +3 -0
- data/test/dummy/config/application.rb +7 -2
- data/test/dummy/config/database.yml +9 -0
- data/test/dummy/config/environments/development.rb +3 -4
- data/test/dummy/config/environments/test.rb +2 -5
- data/test/dummy/config/secrets_double_github_app.yml +79 -0
- data/test/dummy/db/schema.rb +59 -17
- data/test/dummy/db/seeds.rb +2 -1
- data/test/fixtures/payloads/check_suite_master.json +4 -32
- data/test/fixtures/payloads/invalid_pull_request.json +117 -0
- data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
- data/test/fixtures/payloads/pull_request_assigned.json +480 -0
- data/test/fixtures/payloads/pull_request_closed.json +454 -0
- data/test/fixtures/payloads/pull_request_labeled.json +461 -0
- data/test/fixtures/payloads/pull_request_opened.json +454 -0
- data/test/fixtures/payloads/pull_request_reopened.json +454 -0
- data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
- data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
- data/test/fixtures/payloads/push_master.json +1 -1
- data/test/fixtures/payloads/push_not_master.json +1 -1
- data/test/fixtures/shipit/commits.yml +31 -3
- data/test/fixtures/shipit/hooks.yml +1 -0
- data/test/fixtures/shipit/merge_requests.yml +141 -0
- data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
- data/test/fixtures/shipit/pull_requests.yml +10 -131
- data/test/fixtures/shipit/repositories.yml +5 -0
- data/test/fixtures/shipit/stacks.yml +235 -14
- data/test/fixtures/shipit/statuses.yml +9 -0
- data/test/fixtures/shipit/tasks.yml +4 -1
- data/test/fixtures/shipit/users.yml +7 -0
- data/test/fixtures/timeout +2 -1
- data/test/helpers/api_helper.rb +1 -0
- data/test/helpers/fixture_aliases_helper.rb +1 -0
- data/test/helpers/hooks_helper.rb +2 -1
- data/test/helpers/json_helper.rb +20 -12
- data/test/helpers/links_helper.rb +4 -3
- data/test/helpers/payloads_helper.rb +5 -0
- data/test/helpers/queries_helper.rb +3 -2
- data/test/jobs/cache_deploy_spec_job_test.rb +2 -1
- data/test/jobs/chunk_rollup_job_test.rb +16 -1
- data/test/jobs/deliver_hook_job_test.rb +1 -0
- data/test/jobs/destroy_repository_job_test.rb +27 -0
- data/test/jobs/destroy_stack_job_test.rb +1 -0
- data/test/jobs/emit_event_job_test.rb +2 -1
- 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 +3 -1
- data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
- data/test/jobs/perform_task_job_test.rb +12 -11
- data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +19 -18
- data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
- data/test/jobs/reap_dead_tasks_job_test.rb +68 -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/unique_job_test.rb +1 -0
- data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
- data/test/lib/shipit/deploy_commands_test.rb +16 -0
- data/test/lib/shipit/task_commands_test.rb +17 -0
- data/test/middleware/same_site_cookie_middleware_test.rb +52 -0
- data/test/models/api_client_test.rb +1 -0
- data/test/models/commit_checks_test.rb +1 -0
- data/test/models/commit_deployment_status_test.rb +4 -3
- data/test/models/commit_deployment_test.rb +2 -1
- data/test/models/commits_test.rb +96 -19
- data/test/models/delivery_test.rb +2 -1
- data/test/models/deploy_spec_test.rb +110 -65
- data/test/models/deploy_stats_test.rb +1 -0
- data/test/models/deploys_test.rb +197 -36
- data/test/models/duration_test.rb +1 -0
- data/test/models/github_hook_test.rb +1 -0
- data/test/models/hook_test.rb +47 -10
- data/test/models/membership_test.rb +1 -0
- data/test/models/{pull_request_test.rb → merge_request_test.rb} +53 -37
- data/test/models/pull_request_assignment_test.rb +16 -0
- data/test/models/release_statuses_test.rb +1 -0
- data/test/models/rollbacks_test.rb +1 -0
- data/test/models/shipit/check_run_test.rb +125 -5
- data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
- data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
- data/test/models/shipit/provisioning_handler_test.rb +64 -0
- data/test/models/shipit/pull_request_test.rb +52 -0
- data/test/models/shipit/repository_test.rb +6 -1
- data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
- data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
- data/test/models/shipit/review_stack_test.rb +91 -0
- data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +121 -16
- data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
- data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
- data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
- data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
- data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
- data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
- data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
- data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +107 -0
- data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
- data/test/models/shipit/{wehbooks → webhooks}/handlers_test.rb +1 -0
- data/test/models/status/group_test.rb +1 -0
- data/test/models/status/missing_test.rb +1 -0
- data/test/models/status_test.rb +1 -0
- data/test/models/task_definitions_test.rb +9 -8
- data/test/models/tasks_test.rb +81 -1
- data/test/models/team_test.rb +4 -2
- data/test/models/undeployed_commits_test.rb +1 -0
- data/test/models/users_test.rb +13 -5
- data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
- data/test/test_command_integration.rb +3 -2
- data/test/test_helper.rb +49 -31
- data/test/unit/anonymous_user_serializer_test.rb +14 -0
- data/test/unit/command_test.rb +16 -10
- data/test/unit/commands_test.rb +1 -0
- data/test/unit/commit_serializer_test.rb +16 -0
- data/test/unit/csv_serializer_test.rb +3 -2
- data/test/unit/deploy_commands_test.rb +75 -18
- data/test/unit/deploy_serializer_test.rb +17 -0
- data/test/unit/environment_variables_test.rb +5 -4
- data/test/unit/github_app_test.rb +3 -3
- data/test/unit/github_apps_test.rb +416 -0
- data/test/unit/github_url_helper_test.rb +6 -0
- data/test/unit/rollback_commands_test.rb +2 -1
- data/test/unit/shipit_deployment_checks_test.rb +77 -0
- data/test/unit/shipit_helper_test.rb +17 -0
- data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
- data/test/unit/shipit_test.rb +15 -0
- data/test/unit/user_serializer_test.rb +14 -0
- data/test/unit/variable_definition_test.rb +1 -0
- metadata +320 -178
- data/app/controllers/shipit/api/pull_requests_controller.rb +0 -36
- data/app/controllers/shipit/pull_requests_controller.rb +0 -30
- data/app/jobs/shipit/merge_pull_requests_job.rb +0 -31
- data/app/jobs/shipit/refresh_pull_request_job.rb +0 -10
- data/app/views/shipit/pull_requests/_pull_request.html.erb +0 -29
- data/test/controllers/pull_requests_controller_test.rb +0 -31
- data/test/fixtures/shipit/output_chunks.yml +0 -47
- data/test/models/output_chunk_test.rb +0 -20
data/app/models/shipit/commit.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Shipit
|
|
2
|
-
class Commit <
|
|
3
|
+
class Commit < Record
|
|
3
4
|
include DeferredTouch
|
|
4
5
|
|
|
5
6
|
RECENT_COMMIT_THRESHOLD = 10.seconds
|
|
@@ -7,42 +8,53 @@ module Shipit
|
|
|
7
8
|
AmbiguousRevision = Class.new(StandardError)
|
|
8
9
|
|
|
9
10
|
belongs_to :stack
|
|
10
|
-
has_many :deploys
|
|
11
11
|
has_many :statuses, -> { order(created_at: :desc) }, dependent: :destroy, inverse_of: :commit
|
|
12
12
|
has_many :check_runs, -> { order(created_at: :desc) }, dependent: :destroy, inverse_of: :commit
|
|
13
13
|
has_many :commit_deployments, dependent: :destroy
|
|
14
14
|
has_many :release_statuses, dependent: :destroy
|
|
15
|
-
belongs_to :
|
|
15
|
+
belongs_to :merge_request, inverse_of: :merge_commit, optional: true
|
|
16
16
|
|
|
17
17
|
deferred_touch stack: :updated_at
|
|
18
18
|
|
|
19
|
-
before_create :
|
|
19
|
+
before_create :identify_merge_request
|
|
20
20
|
after_commit { broadcast_update }
|
|
21
21
|
after_create { stack.update_undeployed_commits_count }
|
|
22
22
|
|
|
23
23
|
after_commit :schedule_refresh_statuses!, :schedule_refresh_check_runs!, :schedule_fetch_stats!,
|
|
24
|
-
|
|
24
|
+
:schedule_continuous_delivery, on: :create
|
|
25
25
|
|
|
26
|
-
belongs_to :author, class_name: 'User', inverse_of: :authored_commits
|
|
27
|
-
belongs_to :committer, class_name: 'User', inverse_of: :commits
|
|
28
|
-
belongs_to :lock_author, class_name:
|
|
26
|
+
belongs_to :author, class_name: 'User', optional: true, inverse_of: :authored_commits
|
|
27
|
+
belongs_to :committer, class_name: 'User', optional: true, inverse_of: :commits
|
|
28
|
+
belongs_to :lock_author, class_name: 'User', optional: true, inverse_of: false
|
|
29
29
|
|
|
30
30
|
def author
|
|
31
31
|
super || AnonymousUser.new
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
+
def author=(user)
|
|
35
|
+
super(user.presence)
|
|
36
|
+
end
|
|
37
|
+
|
|
34
38
|
def committer
|
|
35
39
|
super || AnonymousUser.new
|
|
36
40
|
end
|
|
37
41
|
|
|
42
|
+
def committer=(user)
|
|
43
|
+
super(user.presence)
|
|
44
|
+
end
|
|
45
|
+
|
|
38
46
|
def lock_author
|
|
39
47
|
super || AnonymousUser.new
|
|
40
48
|
end
|
|
41
49
|
|
|
50
|
+
def lock_author=(user)
|
|
51
|
+
super(user.presence)
|
|
52
|
+
end
|
|
53
|
+
|
|
42
54
|
scope :reachable, -> { where(detached: false) }
|
|
43
55
|
|
|
44
56
|
delegate :broadcast_update, :github_repo_name, :hidden_statuses, :required_statuses, :blocking_statuses,
|
|
45
|
-
|
|
57
|
+
:soft_failing_statuses, to: :stack
|
|
46
58
|
|
|
47
59
|
def self.newer_than(commit)
|
|
48
60
|
return all unless commit
|
|
@@ -92,7 +104,7 @@ module Shipit
|
|
|
92
104
|
committer = User.find_or_create_committer_from_github_commit(commit)
|
|
93
105
|
committer ||= Anonymous.new
|
|
94
106
|
|
|
95
|
-
new(
|
|
107
|
+
record = new(
|
|
96
108
|
sha: commit.sha,
|
|
97
109
|
message: commit.commit.message,
|
|
98
110
|
author: author,
|
|
@@ -102,12 +114,18 @@ module Shipit
|
|
|
102
114
|
additions: commit.stats&.additions,
|
|
103
115
|
deletions: commit.stats&.deletions,
|
|
104
116
|
)
|
|
117
|
+
|
|
118
|
+
if record.pull_request?
|
|
119
|
+
record.pull_request_head_sha = commit.parents.last.sha
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
record
|
|
105
123
|
end
|
|
106
124
|
|
|
107
125
|
def message=(message)
|
|
108
126
|
limit = self.class.columns_hash['message'].limit
|
|
109
|
-
if limit && message && message.
|
|
110
|
-
message = message.
|
|
127
|
+
if limit && message && message.bytesize > limit
|
|
128
|
+
message = message.truncate_bytes(limit)
|
|
111
129
|
end
|
|
112
130
|
super(message)
|
|
113
131
|
end
|
|
@@ -137,7 +155,7 @@ module Shipit
|
|
|
137
155
|
|
|
138
156
|
def refresh_statuses!
|
|
139
157
|
github_statuses = stack.handle_github_redirections do
|
|
140
|
-
|
|
158
|
+
stack.github_api.statuses(github_repo_name, sha, per_page: 100)
|
|
141
159
|
end
|
|
142
160
|
github_statuses.each do |status|
|
|
143
161
|
create_status_from_github!(status)
|
|
@@ -152,7 +170,7 @@ module Shipit
|
|
|
152
170
|
|
|
153
171
|
def refresh_check_runs!
|
|
154
172
|
response = stack.handle_github_redirections do
|
|
155
|
-
|
|
173
|
+
stack.github_api.check_runs(github_repo_name, sha)
|
|
156
174
|
end
|
|
157
175
|
response.check_runs.each do |check_run|
|
|
158
176
|
create_or_update_check_run_from_github!(check_run)
|
|
@@ -254,7 +272,7 @@ module Shipit
|
|
|
254
272
|
end
|
|
255
273
|
|
|
256
274
|
def github_commit
|
|
257
|
-
@github_commit ||=
|
|
275
|
+
@github_commit ||= stack.github_api.commit(github_repo_name, sha)
|
|
258
276
|
end
|
|
259
277
|
|
|
260
278
|
def schedule_fetch_stats!
|
|
@@ -280,13 +298,13 @@ module Shipit
|
|
|
280
298
|
stack.deploys.unsuccessful.where(until_commit_id: id).any?
|
|
281
299
|
end
|
|
282
300
|
|
|
283
|
-
def
|
|
301
|
+
def identify_merge_request
|
|
284
302
|
return unless message_parser.pull_request?
|
|
285
|
-
if
|
|
286
|
-
self.
|
|
287
|
-
self.pull_request_number =
|
|
288
|
-
self.pull_request_title =
|
|
289
|
-
self.author =
|
|
303
|
+
if merge_request = stack.merge_requests.find_by(number: message_parser.pull_request_number)
|
|
304
|
+
self.merge_request = merge_request
|
|
305
|
+
self.pull_request_number = merge_request.number
|
|
306
|
+
self.pull_request_title = merge_request.title
|
|
307
|
+
self.author = merge_request.merge_requested_by if merge_request.merge_requested_by
|
|
290
308
|
end
|
|
291
309
|
|
|
292
310
|
self.pull_request_number = message_parser.pull_request_number unless self[:pull_request_number]
|
|
@@ -294,8 +312,8 @@ module Shipit
|
|
|
294
312
|
end
|
|
295
313
|
|
|
296
314
|
def deploy_requested_at
|
|
297
|
-
if
|
|
298
|
-
|
|
315
|
+
if merge_request&.merged?
|
|
316
|
+
merge_request.merge_requested_at
|
|
299
317
|
else
|
|
300
318
|
created_at
|
|
301
319
|
end
|
|
@@ -338,7 +356,7 @@ module Shipit
|
|
|
338
356
|
new_status = status
|
|
339
357
|
|
|
340
358
|
unless already_deployed
|
|
341
|
-
payload = {commit: self, stack: stack, status: new_status.state}
|
|
359
|
+
payload = { commit: self, stack: stack, status: new_status.state }
|
|
342
360
|
if previous_status != new_status
|
|
343
361
|
Hook.emit(:commit_status, stack, payload.merge(commit_status: new_status))
|
|
344
362
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Shipit
|
|
2
3
|
class CommitChecks < EphemeralCommitChecks
|
|
3
4
|
OUTPUT_TTL = 10.minutes.to_i
|
|
@@ -5,17 +6,18 @@ module Shipit
|
|
|
5
6
|
|
|
6
7
|
def initialize(commit)
|
|
7
8
|
@commit = commit
|
|
9
|
+
super(commit)
|
|
8
10
|
end
|
|
9
11
|
|
|
10
12
|
def synchronize(&block)
|
|
11
|
-
@lock ||= Redis::Lock.new('lock', redis, expiration: 1, timeout: 2)
|
|
13
|
+
@lock ||= Redis::Lock.new(key('lock'), Shipit.redis, expiration: 1, timeout: 2)
|
|
12
14
|
@lock.lock(&block)
|
|
13
15
|
end
|
|
14
16
|
|
|
15
17
|
def schedule
|
|
16
|
-
return false if redis.get('status').present?
|
|
18
|
+
return false if Shipit.redis.get(key('status')).present?
|
|
17
19
|
synchronize do
|
|
18
|
-
return false if redis.get('status').present?
|
|
20
|
+
return false if Shipit.redis.get(key('status')).present?
|
|
19
21
|
|
|
20
22
|
initialize_redis_state
|
|
21
23
|
end
|
|
@@ -24,34 +26,34 @@ module Shipit
|
|
|
24
26
|
end
|
|
25
27
|
|
|
26
28
|
def initialize_redis_state
|
|
27
|
-
redis.
|
|
28
|
-
redis.set('output', '', ex: OUTPUT_TTL)
|
|
29
|
-
redis.set('status', 'scheduled', ex: OUTPUT_TTL)
|
|
30
|
-
end
|
|
29
|
+
Shipit.redis.set(key('status'), 'scheduled', ex: OUTPUT_TTL)
|
|
31
30
|
@status = 'scheduled'
|
|
32
31
|
end
|
|
33
32
|
|
|
34
33
|
def status
|
|
35
|
-
@status ||= redis.get('status')
|
|
34
|
+
@status ||= Shipit.redis.get(key('status'))
|
|
36
35
|
end
|
|
37
36
|
|
|
38
37
|
def status=(status)
|
|
39
|
-
redis.set('status', status)
|
|
38
|
+
Shipit.redis.set(key('status'), status)
|
|
40
39
|
@status = status
|
|
41
40
|
end
|
|
42
41
|
|
|
43
42
|
def output(since: 0)
|
|
44
|
-
redis.getrange('output', since, -1)
|
|
43
|
+
Shipit.redis.getrange(key('output'), since, -1)
|
|
45
44
|
end
|
|
46
45
|
|
|
47
46
|
def write(output)
|
|
48
|
-
redis.
|
|
47
|
+
Shipit.redis.pipelined do
|
|
48
|
+
Shipit.redis.append(key('output'), output)
|
|
49
|
+
Shipit.redis.expire(key('output'), OUTPUT_TTL)
|
|
50
|
+
end
|
|
49
51
|
end
|
|
50
52
|
|
|
51
53
|
private
|
|
52
54
|
|
|
53
|
-
def
|
|
54
|
-
|
|
55
|
+
def key(key)
|
|
56
|
+
"commit:#{commit.id}:checks:#{key}"
|
|
55
57
|
end
|
|
56
58
|
end
|
|
57
59
|
end
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Shipit
|
|
2
|
-
class CommitDeployment <
|
|
3
|
+
class CommitDeployment < Record
|
|
3
4
|
belongs_to :task
|
|
4
5
|
has_many :statuses, dependent: :destroy, class_name: 'CommitDeploymentStatus'
|
|
5
6
|
|
|
@@ -19,15 +20,15 @@ module Shipit
|
|
|
19
20
|
return if github_id?
|
|
20
21
|
|
|
21
22
|
response = begin
|
|
22
|
-
create_deployment_on_github(
|
|
23
|
+
create_deployment_on_github(stack.github_api)
|
|
23
24
|
rescue Octokit::ClientError
|
|
24
|
-
raise if Shipit.github.api ==
|
|
25
|
+
raise if Shipit.github(organization: stack.repository.owner).api == stack.github_api
|
|
25
26
|
# If the deploy author didn't gave us the permission to create the deployment we falback the the main shipit
|
|
26
27
|
# user.
|
|
27
28
|
#
|
|
28
29
|
# Octokit currently raise NotFound, but I'm convinced it should be Forbidden if the user can see the repository.
|
|
29
30
|
# So to be future proof I catch boths.
|
|
30
|
-
create_deployment_on_github(
|
|
31
|
+
create_deployment_on_github(stack.github_api)
|
|
31
32
|
end
|
|
32
33
|
update!(github_id: response.id, api_url: response.url)
|
|
33
34
|
end
|
|
@@ -56,7 +57,7 @@ module Shipit
|
|
|
56
57
|
from_sha: task.since_commit.sha,
|
|
57
58
|
to_sha: task.until_commit.sha,
|
|
58
59
|
},
|
|
59
|
-
},
|
|
60
|
+
}.to_json,
|
|
60
61
|
)
|
|
61
62
|
end
|
|
62
63
|
end
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Shipit
|
|
2
|
-
class CommitDeploymentStatus <
|
|
3
|
+
class CommitDeploymentStatus < Record
|
|
3
4
|
DESCRIPTION_CHARACTER_LIMIT_ON_GITHUB = 140
|
|
4
5
|
|
|
5
6
|
belongs_to :commit_deployment
|
|
@@ -11,15 +12,15 @@ module Shipit
|
|
|
11
12
|
def create_on_github!
|
|
12
13
|
return if github_id?
|
|
13
14
|
response = begin
|
|
14
|
-
create_status_on_github(
|
|
15
|
+
create_status_on_github(stack.github_api)
|
|
15
16
|
rescue Octokit::ClientError
|
|
16
|
-
raise if Shipit.github.api ==
|
|
17
|
+
raise if Shipit.github(organization: stack.repository.owner).api == stack.github_api
|
|
17
18
|
# If the deploy author didn't gave us the permission to create the deployment we falback the the main shipit
|
|
18
19
|
# user.
|
|
19
20
|
#
|
|
20
21
|
# Octokit currently raise NotFound, but I'm convinced it should be Forbidden if the user can see the repository.
|
|
21
22
|
# So to be future proof I catch boths.
|
|
22
|
-
create_status_on_github(
|
|
23
|
+
create_status_on_github(stack.github_api)
|
|
23
24
|
end
|
|
24
25
|
update!(github_id: response.id, api_url: response.url)
|
|
25
26
|
end
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module Shipit
|
|
2
|
-
class Delivery <
|
|
3
|
+
class Delivery < Record
|
|
3
4
|
STATUSES = %w(pending scheduled sent).freeze
|
|
4
5
|
enum status: STATUSES.zip(STATUSES).to_h
|
|
5
6
|
|
|
6
7
|
belongs_to :hook
|
|
7
8
|
|
|
8
|
-
validates :url, presence: true, url: {no_local: true, allow_blank: true}
|
|
9
|
+
validates :url, presence: true, url: { no_local: true, allow_blank: true }
|
|
9
10
|
validates :content_type, presence: true
|
|
10
11
|
|
|
11
12
|
serialize :response_headers, JSON
|
|
@@ -36,7 +37,7 @@ module Shipit
|
|
|
36
37
|
def http
|
|
37
38
|
Faraday::Connection.new do |connection|
|
|
38
39
|
connection.headers = headers
|
|
39
|
-
connection.adapter
|
|
40
|
+
connection.adapter(Faraday.default_adapter)
|
|
40
41
|
end
|
|
41
42
|
end
|
|
42
43
|
|
data/app/models/shipit/deploy.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'fileutils'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
@@ -14,8 +15,8 @@ module Shipit
|
|
|
14
15
|
after_transition any => any, do: :update_last_deploy_time
|
|
15
16
|
end
|
|
16
17
|
|
|
17
|
-
belongs_to :until_commit, class_name: 'Commit', required: true
|
|
18
|
-
belongs_to :since_commit, class_name: 'Commit', required: true
|
|
18
|
+
belongs_to :until_commit, class_name: 'Commit', required: true
|
|
19
|
+
belongs_to :since_commit, class_name: 'Commit', required: true
|
|
19
20
|
has_many :commit_deployments, dependent: :destroy, inverse_of: :task, foreign_key: :task_id do
|
|
20
21
|
GITHUB_STATUSES = {
|
|
21
22
|
'pending' => 'pending',
|
|
@@ -91,25 +92,28 @@ module Shipit
|
|
|
91
92
|
env: env&.to_h || {},
|
|
92
93
|
allow_concurrency: force,
|
|
93
94
|
ignored_safeties: force,
|
|
95
|
+
max_retries: stack.retries_on_rollback,
|
|
94
96
|
)
|
|
95
97
|
end
|
|
96
98
|
|
|
97
99
|
# Rolls the stack back to this deploy
|
|
98
|
-
def trigger_rollback(user = AnonymousUser.new, env: nil, force: false)
|
|
100
|
+
def trigger_rollback(user = AnonymousUser.new, env: nil, force: false, lock: true)
|
|
99
101
|
rollback = build_rollback(user, env: env, force: force)
|
|
100
102
|
rollback.save!
|
|
101
103
|
rollback.enqueue
|
|
102
104
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
if lock
|
|
106
|
+
lock_reason = "A rollback for #{rollback.since_commit.sha} has been triggered. " \
|
|
107
|
+
"Please make sure the reason for the rollback has been addressed before deploying again."
|
|
108
|
+
stack.update!(lock_reason: lock_reason, lock_author_id: user.id)
|
|
109
|
+
end
|
|
106
110
|
|
|
107
111
|
rollback
|
|
108
112
|
end
|
|
109
113
|
|
|
110
114
|
# Rolls the stack back to the most recent **previous** successful deploy
|
|
111
|
-
def trigger_revert(force: false)
|
|
112
|
-
previous_successful_commit = commit_to_rollback_to
|
|
115
|
+
def trigger_revert(force: false, rollback_to: nil)
|
|
116
|
+
previous_successful_commit = rollback_to&.until_commit || commit_to_rollback_to
|
|
113
117
|
|
|
114
118
|
rollback = Rollback.create!(
|
|
115
119
|
user_id: user_id,
|
|
@@ -207,7 +211,7 @@ module Shipit
|
|
|
207
211
|
end
|
|
208
212
|
|
|
209
213
|
def report_complete!
|
|
210
|
-
if stack.release_status? && stack.release_status_delay.
|
|
214
|
+
if stack.release_status? && !stack.release_status_delay.zero?
|
|
211
215
|
enter_validation!
|
|
212
216
|
else
|
|
213
217
|
super
|
|
@@ -248,24 +252,12 @@ module Shipit
|
|
|
248
252
|
|
|
249
253
|
# Create one for each pull request in the batch, to give feedback on the PR timeline
|
|
250
254
|
commits.select(&:pull_request?).each do |commit|
|
|
251
|
-
if
|
|
252
|
-
|
|
253
|
-
end
|
|
255
|
+
next if commit.pull_request_head_sha.blank? # This attribute was not always populated
|
|
256
|
+
commit_deployments.create!(sha: commit.pull_request_head_sha)
|
|
254
257
|
end
|
|
255
258
|
|
|
256
259
|
# Immediately update to publish the status to the commit deployments
|
|
257
260
|
update_commit_deployments
|
|
258
|
-
rescue Octokit::ClientError => error
|
|
259
|
-
Rails.logger.warn("Got #{error.class.name} (#{error.message}) when creating CommitDeployments for Deploy##{id}")
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
def pull_request_head_for_commit(commit)
|
|
263
|
-
pull_request = Shipit.github.api.pull_request(commit.stack.github_repo_name, commit.pull_request_number)
|
|
264
|
-
pull_request.head.sha
|
|
265
|
-
rescue Octokit::ClientError => error
|
|
266
|
-
pr_ref = "#{commit.stack.github_repo_name}##{commit.pull_request_number}"
|
|
267
|
-
Rails.logger.warn("Got #{error.class.name} (#{error.message}) when loading pull request #{pr_ref}")
|
|
268
|
-
nil
|
|
269
261
|
end
|
|
270
262
|
|
|
271
263
|
def update_release_status
|
|
@@ -279,10 +271,13 @@ module Shipit
|
|
|
279
271
|
when 'aborted', 'aborting'
|
|
280
272
|
append_release_status('failure', "The deploy on #{stack.environment} was canceled")
|
|
281
273
|
when 'validating'
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
274
|
+
append_release_status(
|
|
275
|
+
'pending',
|
|
276
|
+
"The deploy on #{stack.environment} succeeded"
|
|
277
|
+
) unless stack.release_status_delay.zero?
|
|
278
|
+
|
|
279
|
+
MarkDeployHealthyJob.set(wait: stack.release_status_delay)
|
|
280
|
+
.perform_later(self) if stack.release_status_delay.positive?
|
|
286
281
|
when 'success'
|
|
287
282
|
if stack.release_status_delay.zero?
|
|
288
283
|
append_release_status('success', "The deploy on #{stack.environment} succeeded")
|
|
@@ -293,7 +288,7 @@ module Shipit
|
|
|
293
288
|
def trigger_revert_if_required
|
|
294
289
|
return unless rollback_once_aborted?
|
|
295
290
|
return unless supports_rollback?
|
|
296
|
-
trigger_revert
|
|
291
|
+
trigger_revert(rollback_to: rollback_once_aborted_to)
|
|
297
292
|
end
|
|
298
293
|
|
|
299
294
|
def default_since_commit_id
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'pathname'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
@@ -5,20 +6,34 @@ module Shipit
|
|
|
5
6
|
Error = Class.new(StandardError)
|
|
6
7
|
|
|
7
8
|
class << self
|
|
9
|
+
attr_accessor :pretty_generate
|
|
10
|
+
|
|
8
11
|
def load(json)
|
|
9
12
|
config = json.blank? ? {} : JSON.parse(json)
|
|
10
13
|
new(config)
|
|
11
14
|
end
|
|
12
15
|
|
|
13
16
|
def dump(spec)
|
|
14
|
-
|
|
17
|
+
return unless spec
|
|
18
|
+
|
|
19
|
+
if pretty_generate?
|
|
20
|
+
JSON.pretty_generate(spec.cacheable.config)
|
|
21
|
+
else
|
|
22
|
+
JSON.dump(spec.cacheable.config)
|
|
23
|
+
end
|
|
15
24
|
end
|
|
16
25
|
|
|
17
26
|
def bundle_path
|
|
18
27
|
Rails.root.join('data', 'bundler')
|
|
19
28
|
end
|
|
29
|
+
|
|
30
|
+
def pretty_generate?
|
|
31
|
+
@pretty_generate
|
|
32
|
+
end
|
|
20
33
|
end
|
|
21
34
|
|
|
35
|
+
self.pretty_generate = false
|
|
36
|
+
|
|
22
37
|
def initialize(config)
|
|
23
38
|
@config = config
|
|
24
39
|
end
|
|
@@ -40,6 +55,10 @@ module Shipit
|
|
|
40
55
|
end
|
|
41
56
|
end
|
|
42
57
|
|
|
58
|
+
def blank?
|
|
59
|
+
config.empty?
|
|
60
|
+
end
|
|
61
|
+
|
|
43
62
|
def supports_fetch_deployed_revision?
|
|
44
63
|
fetch_deployed_revision_steps.present?
|
|
45
64
|
end
|
|
@@ -85,6 +104,10 @@ module Shipit
|
|
|
85
104
|
Duration.parse(config('deploy', 'interval') { 0 })
|
|
86
105
|
end
|
|
87
106
|
|
|
107
|
+
def provisioning_handler_name
|
|
108
|
+
config('provision', 'handler_name')
|
|
109
|
+
end
|
|
110
|
+
|
|
88
111
|
def deploy_steps
|
|
89
112
|
around_steps('deploy') do
|
|
90
113
|
config('deploy', 'override') { discover_deploy_steps }
|
|
@@ -103,6 +126,10 @@ module Shipit
|
|
|
103
126
|
deploy_variables.map { |v| [v.name, v.default] }.to_h
|
|
104
127
|
end
|
|
105
128
|
|
|
129
|
+
def retries_on_deploy
|
|
130
|
+
config('deploy', 'retries') { nil }
|
|
131
|
+
end
|
|
132
|
+
|
|
106
133
|
def rollback_steps
|
|
107
134
|
around_steps('rollback') do
|
|
108
135
|
config('rollback', 'override') { discover_rollback_steps }
|
|
@@ -113,6 +140,10 @@ module Shipit
|
|
|
113
140
|
rollback_steps || cant_detect!(:rollback)
|
|
114
141
|
end
|
|
115
142
|
|
|
143
|
+
def retries_on_rollback
|
|
144
|
+
config('rollback', 'retries') { nil }
|
|
145
|
+
end
|
|
146
|
+
|
|
116
147
|
def fetch_deployed_revision_steps
|
|
117
148
|
config('fetch') || discover_fetch_deployed_revision_steps
|
|
118
149
|
end
|
|
@@ -160,12 +191,12 @@ module Shipit
|
|
|
160
191
|
Array.wrap(config('ci', 'blocking'))
|
|
161
192
|
end
|
|
162
193
|
|
|
163
|
-
def
|
|
194
|
+
def merge_request_merge_method
|
|
164
195
|
method = config('merge', 'method')
|
|
165
196
|
method if %w(merge rebase squash).include?(method)
|
|
166
197
|
end
|
|
167
198
|
|
|
168
|
-
def
|
|
199
|
+
def merge_request_required_statuses
|
|
169
200
|
if config('merge', 'require') || config('merge', 'ignore')
|
|
170
201
|
Array.wrap(config('merge', 'require'))
|
|
171
202
|
else
|
|
@@ -173,7 +204,7 @@ module Shipit
|
|
|
173
204
|
end
|
|
174
205
|
end
|
|
175
206
|
|
|
176
|
-
def
|
|
207
|
+
def merge_request_ignored_statuses
|
|
177
208
|
if config('merge', 'require') || config('merge', 'ignore')
|
|
178
209
|
Array.wrap(config('merge', 'ignore')) + [release_status_context].compact
|
|
179
210
|
else
|
|
@@ -181,7 +212,7 @@ module Shipit
|
|
|
181
212
|
end
|
|
182
213
|
end
|
|
183
214
|
|
|
184
|
-
def
|
|
215
|
+
def revalidate_merge_requests_after
|
|
185
216
|
if timeout = config('merge', 'revalidate_after')
|
|
186
217
|
begin
|
|
187
218
|
Duration.parse(timeout)
|
|
@@ -255,11 +286,11 @@ module Shipit
|
|
|
255
286
|
end
|
|
256
287
|
|
|
257
288
|
def task_not_found!(id)
|
|
258
|
-
raise TaskDefinition::NotFound
|
|
289
|
+
raise TaskDefinition::NotFound, "No definition for task #{id.inspect}"
|
|
259
290
|
end
|
|
260
291
|
|
|
261
292
|
def cant_detect!(type)
|
|
262
|
-
raise DeploySpec::Error
|
|
293
|
+
raise DeploySpec::Error, I18n.t("deploy_spec.hint.#{type}")
|
|
263
294
|
end
|
|
264
295
|
end
|
|
265
296
|
end
|