shipit-engine 0.31.0 → 0.35.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 +17 -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 +2 -3
- 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/unique.rb +1 -0
- data/app/jobs/shipit/background_job.rb +4 -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/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_spec.rb +38 -7
- 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/base.rb +30 -0
- data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
- data/app/models/shipit/provisioning_handler.rb +32 -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 +6 -0
- data/app/models/shipit/stack.rb +127 -45
- 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/status.rb +3 -2
- 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/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/models/shipit/webhooks.rb +11 -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 +8 -2
- 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 +3 -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/db/migrate/20210823075617_change_check_runs_github_updated_at_default.rb +5 -0
- data/lib/shipit/cast_value.rb +1 -0
- data/lib/shipit/command.rb +19 -17
- data/lib/shipit/commands.rb +23 -9
- 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 +2 -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 +39 -9
- data/lib/shipit/stat.rb +1 -0
- data/lib/shipit/task_commands.rb +9 -0
- data/lib/shipit/version.rb +2 -1
- data/lib/shipit.rb +61 -17
- 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 +219 -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} +82 -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 +77 -20
- 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 +325 -182
- 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
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
class StackProvisioningHandlerTest < ActiveSupport::TestCase
|
|
7
|
+
teardown do
|
|
8
|
+
Shipit::ProvisioningHandler.reset_registry!
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "uses the no-op handler as default when no default handler is registered" do
|
|
12
|
+
assert_equal Shipit::ProvisioningHandler::Base, Shipit::ProvisioningHandler.default
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
test "allows registration of a default handler" do
|
|
16
|
+
mock_handler = mock("Mock Provisioning Handler")
|
|
17
|
+
|
|
18
|
+
Shipit::ProvisioningHandler.default = mock_handler
|
|
19
|
+
|
|
20
|
+
assert_equal mock_handler, Shipit::ProvisioningHandler.default
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
test "UnregisteredProvisioningHandler is returned when an attempt to fetch an unregistered handler is made" do
|
|
24
|
+
unregistered_handler = mock("Mock Provisioning Handler")
|
|
25
|
+
|
|
26
|
+
assert_equal(
|
|
27
|
+
Shipit::ProvisioningHandler::UnregisteredProvisioningHandler,
|
|
28
|
+
Shipit::ProvisioningHandler.fetch(unregistered_handler)
|
|
29
|
+
)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test "registers handlers so they become fetchable" do
|
|
33
|
+
mock_handler = mock("Mock Provisioning Handler")
|
|
34
|
+
|
|
35
|
+
Shipit::ProvisioningHandler.register(mock_handler)
|
|
36
|
+
|
|
37
|
+
assert_equal mock_handler, Shipit::ProvisioningHandler.fetch(mock_handler.to_s)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
test "handlers are called during provisioning" do
|
|
41
|
+
stack = shipit_stacks(:review_stack)
|
|
42
|
+
stack.update(
|
|
43
|
+
provision_status: :deprovisioned
|
|
44
|
+
)
|
|
45
|
+
handler = Shipit::ProvisioningHandler.default
|
|
46
|
+
|
|
47
|
+
handler.any_instance.expects(:up)
|
|
48
|
+
|
|
49
|
+
assert stack.provision!, "stack should have provisioned."
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test "handlers are called during deprovisioning" do
|
|
53
|
+
stack = shipit_stacks(:review_stack)
|
|
54
|
+
stack.update(
|
|
55
|
+
provision_status: :provisioned
|
|
56
|
+
)
|
|
57
|
+
handler = Shipit::ProvisioningHandler.default
|
|
58
|
+
|
|
59
|
+
handler.any_instance.expects(:down)
|
|
60
|
+
|
|
61
|
+
assert stack.deprovision!, "stack should have deprovisioned."
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
class PullRequestTest < ActiveSupport::TestCase
|
|
7
|
+
test "github_pull_request= parses into a a Shipit::PullRequest" do
|
|
8
|
+
github_pull_request = resource(
|
|
9
|
+
{
|
|
10
|
+
url: "https://api.github.com/repos/Codertocat/Hello-World/pulls/2",
|
|
11
|
+
id: 279147437,
|
|
12
|
+
number: 2,
|
|
13
|
+
state: "open",
|
|
14
|
+
additions: 100,
|
|
15
|
+
deletions: 101,
|
|
16
|
+
title: "Update the README with new information.",
|
|
17
|
+
head: {
|
|
18
|
+
sha: "ec26c3e57ca3a959ca5aad62de7213c562f8c821",
|
|
19
|
+
},
|
|
20
|
+
user: {
|
|
21
|
+
login: "Codertocat",
|
|
22
|
+
},
|
|
23
|
+
assignees: [
|
|
24
|
+
{
|
|
25
|
+
login: "bob",
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
labels: [
|
|
29
|
+
{
|
|
30
|
+
name: "deploy",
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
}
|
|
34
|
+
)
|
|
35
|
+
stack = shipit_stacks(:review_stack)
|
|
36
|
+
pull_request = stack.pull_request
|
|
37
|
+
|
|
38
|
+
stack.pull_request.github_pull_request = github_pull_request
|
|
39
|
+
|
|
40
|
+
assert_equal 279147437, pull_request.github_id
|
|
41
|
+
assert_equal 2, pull_request.number
|
|
42
|
+
assert_equal "https://api.github.com/repos/Codertocat/Hello-World/pulls/2", pull_request.api_url
|
|
43
|
+
assert_equal "Update the README with new information.", pull_request.title
|
|
44
|
+
assert_equal "open", pull_request.state
|
|
45
|
+
assert_equal 100, pull_request.additions
|
|
46
|
+
assert_equal 101, pull_request.deletions
|
|
47
|
+
assert_equal shipit_users(:codertocat), pull_request.user
|
|
48
|
+
assert_equal [shipit_users(:bob)], pull_request.assignees
|
|
49
|
+
assert_equal ["deploy"], pull_request.labels
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
@@ -19,7 +20,7 @@ module Shipit
|
|
|
19
20
|
|
|
20
21
|
test "owner and name are case insensitive" do
|
|
21
22
|
assert_no_difference -> { Repository.count } do
|
|
22
|
-
error = assert_raises
|
|
23
|
+
error = assert_raises(ActiveRecord::RecordInvalid) do
|
|
23
24
|
Repository.create!(
|
|
24
25
|
owner: @repository.owner.upcase,
|
|
25
26
|
name: @repository.name.upcase,
|
|
@@ -62,6 +63,10 @@ module Shipit
|
|
|
62
63
|
assert_equal "https://github.com/#{@repository.owner}/#{@repository.name}.git", @repository.git_url
|
|
63
64
|
end
|
|
64
65
|
|
|
66
|
+
test "review_stacks_enabled defaults to false" do
|
|
67
|
+
assert_equal false, Repository.new.review_stacks_enabled
|
|
68
|
+
end
|
|
69
|
+
|
|
65
70
|
test "from_github_repo_name" do
|
|
66
71
|
owner = "repository-owner"
|
|
67
72
|
name = "repository-name"
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
class ReviewStackProvisionStatusTest < ActiveSupport::TestCase
|
|
7
|
+
test "stacks default to deprovisioned state" do
|
|
8
|
+
stack = Shipit::ReviewStack.new
|
|
9
|
+
|
|
10
|
+
assert_equal 'deprovisioned', stack.provision_status
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
test "non-review stacks don't transition" do
|
|
14
|
+
stack = Shipit::ReviewStack.new
|
|
15
|
+
stack.provision
|
|
16
|
+
|
|
17
|
+
assert_equal 'deprovisioned', stack.provision_status
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test "review stacks that are deprovisioned can be provisioned" do
|
|
21
|
+
stack = review_stack(provision_status: :deprovisioned)
|
|
22
|
+
|
|
23
|
+
stack.provision
|
|
24
|
+
|
|
25
|
+
assert_equal 'provisioning', stack.provision_status
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test "review stacks that are provisioning can succeed" do
|
|
29
|
+
stack = review_stack(provision_status: :provisioning)
|
|
30
|
+
|
|
31
|
+
stack.provision_success
|
|
32
|
+
|
|
33
|
+
assert_equal 'provisioned', stack.provision_status
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
test "review stacks that are provisioning can fail" do
|
|
37
|
+
stack = review_stack(provision_status: :provisioning)
|
|
38
|
+
|
|
39
|
+
stack.provision_failure
|
|
40
|
+
|
|
41
|
+
assert_equal 'deprovisioned', stack.provision_status
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
test "review stacks are provisioned can be deprovisioned" do
|
|
45
|
+
stack = review_stack(provision_status: :provisioned)
|
|
46
|
+
|
|
47
|
+
stack.deprovision
|
|
48
|
+
|
|
49
|
+
assert 'deprovisioning', stack.provision_status
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test "review stacks that are deprovisioning can succeed" do
|
|
53
|
+
stack = review_stack(provision_status: :deprovisioning)
|
|
54
|
+
|
|
55
|
+
stack.deprovision_success
|
|
56
|
+
|
|
57
|
+
assert_equal 'deprovisioned', stack.provision_status
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
test "review stacks that are deprovisioning can fail" do
|
|
61
|
+
stack = review_stack(provision_status: :deprovisioning)
|
|
62
|
+
|
|
63
|
+
stack.deprovision_failure
|
|
64
|
+
|
|
65
|
+
assert_equal 'provisioned', stack.provision_status
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def review_stack(provision_status: :deprovisioned)
|
|
69
|
+
stack = shipit_stacks(:review_stack)
|
|
70
|
+
stack.provision_status = provision_status
|
|
71
|
+
|
|
72
|
+
stack.save!
|
|
73
|
+
|
|
74
|
+
stack
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
class ReviewStackProvisioningQueueTest < ActiveSupport::TestCase
|
|
7
|
+
test ".add en-queues a stack for provisioning" do
|
|
8
|
+
review_stack = shipit_stacks(:review_stack)
|
|
9
|
+
review_stack.update(lock_reason: nil)
|
|
10
|
+
|
|
11
|
+
assert_changes -> { review_stack.awaiting_provision }, from: false, to: true do
|
|
12
|
+
queue.add(review_stack)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
test ".work provisions resource stacks when they are provision-able" do
|
|
17
|
+
review_stack = provisionable_review_stack
|
|
18
|
+
setup_provisioning_handler(for_stack: review_stack, provision: true)
|
|
19
|
+
queue.add(review_stack)
|
|
20
|
+
|
|
21
|
+
assert_changes -> { review_stack.reload.provision_status }, from: "deprovisioned", to: "provisioning" do
|
|
22
|
+
queue.work
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test ".work does not provision resource stacks when they are not provisionable" do
|
|
27
|
+
review_stack = provisionable_review_stack
|
|
28
|
+
setup_provisioning_handler(for_stack: review_stack, provision: false)
|
|
29
|
+
queue.add(review_stack)
|
|
30
|
+
|
|
31
|
+
assert_equal "deprovisioned", review_stack.provision_status
|
|
32
|
+
assert_no_changes -> { review_stack.reload.provision_status } do
|
|
33
|
+
queue.work
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def setup_provisioning_handler(for_stack:, provision:)
|
|
40
|
+
provisioning_handler_instance = mock("ProvisioningHandler instance")
|
|
41
|
+
provisioning_handler_instance.expects(:provision?).returns(provision)
|
|
42
|
+
provisioning_handler_instance.expects(:up).returns(true) if !!provision
|
|
43
|
+
provisioning_handler_class = mock("ProvisioningHandler class")
|
|
44
|
+
provisioning_handler_class.expects(:new).at_least_once.with(for_stack).returns(provisioning_handler_instance)
|
|
45
|
+
Shipit::ProvisioningHandler.expects(:fetch).at_least_once.returns(provisioning_handler_class)
|
|
46
|
+
|
|
47
|
+
provisioning_handler_instance
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def provisionable_review_stack
|
|
51
|
+
review_stack = shipit_stacks(:review_stack)
|
|
52
|
+
review_stack.update(
|
|
53
|
+
provision_status: :deprovisioned,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
review_stack
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def queue
|
|
60
|
+
ReviewStackProvisioningQueue
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
class ReviewStackTest < ActiveSupport::TestCase
|
|
7
|
+
setup do
|
|
8
|
+
@review_stack = shipit_stacks(:review_stack)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "clearing stale caches" do
|
|
12
|
+
stale_stack = shipit_stacks(:archived_6hours_ago)
|
|
13
|
+
FileUtils.mkdir_p(stale_stack.base_path)
|
|
14
|
+
path = File.join(stale_stack.base_path, 'foo')
|
|
15
|
+
File.write(path, 'bar')
|
|
16
|
+
|
|
17
|
+
not_stale_stack = shipit_stacks(:archived_30minutes_ago)
|
|
18
|
+
FileUtils.mkdir_p(not_stale_stack.base_path)
|
|
19
|
+
path = File.join(not_stale_stack.base_path, 'foo')
|
|
20
|
+
File.write(path, 'bar')
|
|
21
|
+
|
|
22
|
+
ReviewStack.clear_stale_caches
|
|
23
|
+
|
|
24
|
+
refute File.exist?(stale_stack.base_path)
|
|
25
|
+
assert File.exist?(not_stale_stack.base_path)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test "creating a review stack emits a hook" do
|
|
29
|
+
new_review_stack = @review_stack.dup
|
|
30
|
+
new_review_stack.environment = "new-review-stack-environment"
|
|
31
|
+
|
|
32
|
+
expect_hook(:review_stack, new_review_stack, action: :added, review_stack: new_review_stack) do
|
|
33
|
+
new_review_stack.save!
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
test "updating a review stack emit a hook" do
|
|
38
|
+
expect_hook(:review_stack, @review_stack, action: :updated, review_stack: @review_stack) do
|
|
39
|
+
@review_stack.update(environment: 'foo')
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
test "updating a review stack doesn't emit a hook if only `updated_at` is changed" do
|
|
44
|
+
# force a save to make sure `cached_deploy_spec` serialization is consistent with how Active Record would
|
|
45
|
+
# serialize it.
|
|
46
|
+
@review_stack.update(updated_at: 2.days.ago)
|
|
47
|
+
|
|
48
|
+
expect_no_hook(:review_stack) do
|
|
49
|
+
@review_stack.update(updated_at: Time.zone.now)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
test "deleteing a review stack emits a hook" do
|
|
54
|
+
expect_hook(:review_stack, @review_stack, action: :removed, review_stack: @review_stack) do
|
|
55
|
+
@review_stack.destroy!
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
test "#env includes the stack's pull request labels" do
|
|
60
|
+
stack = shipit_stacks(:review_stack)
|
|
61
|
+
stack.pull_request.labels = ["wip", "bug"]
|
|
62
|
+
|
|
63
|
+
assert_equal stack.env["WIP"], "true"
|
|
64
|
+
assert_equal stack.env["BUG"], "true"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
test "#unarchive! triggers a GithubSync job" do
|
|
68
|
+
stack = shipit_stacks(:review_stack)
|
|
69
|
+
assert_no_enqueued_jobs(only: GithubSyncJob) do
|
|
70
|
+
stack.archive!(shipit_users(:codertocat))
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
assert_enqueued_with(job: GithubSyncJob, args: [stack_id: stack.id]) do
|
|
74
|
+
stack.unarchive!
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
test "#trigger_continuous_delivery does not enqueue deployment ref update job" do
|
|
79
|
+
Shipit.stubs(:update_latest_deployed_ref).returns(true)
|
|
80
|
+
@stack = shipit_stacks(:review_stack)
|
|
81
|
+
assert_no_enqueued_jobs(only: Shipit::UpdateGithubLastDeployedRefJob) do
|
|
82
|
+
task = @stack.trigger_continuous_delivery
|
|
83
|
+
task.update!(status: "running")
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
assert_no_enqueued_jobs(only: Shipit::UpdateGithubLastDeployedRefJob) do
|
|
87
|
+
@stack.last_active_task.complete!
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
require 'securerandom'
|
|
3
4
|
|
|
@@ -9,10 +10,20 @@ module Shipit
|
|
|
9
10
|
GithubHook.any_instance.stubs(:teardown!)
|
|
10
11
|
end
|
|
11
12
|
|
|
12
|
-
test "branch defaults to
|
|
13
|
+
test "branch defaults to default branch name" do
|
|
13
14
|
@stack.branch = ""
|
|
15
|
+
Shipit.github.api.expects(:repo).with("shopify/shipit-engine").returns(
|
|
16
|
+
Struct.new(:default_branch).new('something')
|
|
17
|
+
)
|
|
14
18
|
assert @stack.save
|
|
15
|
-
assert_equal '
|
|
19
|
+
assert_equal 'something', @stack.branch
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
test "branch is blank when default cannot be determined" do
|
|
23
|
+
@stack.branch = ""
|
|
24
|
+
Shipit.github.api.expects(:repo).raises(Octokit::NotFound)
|
|
25
|
+
assert_not @stack.save
|
|
26
|
+
assert_nil @stack.branch
|
|
16
27
|
end
|
|
17
28
|
|
|
18
29
|
test "environment defaults to production" do
|
|
@@ -70,11 +81,11 @@ module Shipit
|
|
|
70
81
|
|
|
71
82
|
last_commit = shipit_commits(:third)
|
|
72
83
|
deploy = @stack.trigger_deploy(last_commit, AnonymousUser.new)
|
|
73
|
-
assert_includes
|
|
84
|
+
assert_includes(FakeReceiver.hooks, [
|
|
74
85
|
:deploy,
|
|
75
86
|
@stack,
|
|
76
|
-
{deploy: deploy, status: "pending", stack: @stack},
|
|
77
|
-
]
|
|
87
|
+
{ deploy: deploy, status: "pending", stack: @stack },
|
|
88
|
+
])
|
|
78
89
|
ensure
|
|
79
90
|
Shipit.internal_hook_receivers = original_receivers
|
|
80
91
|
end
|
|
@@ -200,7 +211,7 @@ module Shipit
|
|
|
200
211
|
|
|
201
212
|
test "#create queues a GithubSyncJob" do
|
|
202
213
|
assert_enqueued_with(job: GithubSyncJob) do
|
|
203
|
-
Stack.create!(repository: shipit_repositories(:rails))
|
|
214
|
+
Stack.create!(repository: shipit_repositories(:rails), branch: 'main')
|
|
204
215
|
end
|
|
205
216
|
end
|
|
206
217
|
|
|
@@ -251,6 +262,7 @@ module Shipit
|
|
|
251
262
|
stack = Stack.create!(
|
|
252
263
|
repository: Repository.new(owner: "foo", name: "bar"),
|
|
253
264
|
environment: 'production',
|
|
265
|
+
branch: 'main',
|
|
254
266
|
)
|
|
255
267
|
commit = shipit_commits(:first)
|
|
256
268
|
stack.commits << commit
|
|
@@ -266,8 +278,9 @@ module Shipit
|
|
|
266
278
|
end
|
|
267
279
|
end
|
|
268
280
|
|
|
269
|
-
test "#deployable? returns true if the stack is not locked and is not deploying" do
|
|
281
|
+
test "#deployable? returns true if the stack is not locked, not awaiting provision, and is not deploying" do
|
|
270
282
|
@stack.deploys.destroy_all
|
|
283
|
+
@stack.update!(lock_reason: nil, awaiting_provision: false)
|
|
271
284
|
assert_predicate @stack, :deployable?
|
|
272
285
|
end
|
|
273
286
|
|
|
@@ -281,6 +294,11 @@ module Shipit
|
|
|
281
294
|
refute_predicate @stack, :deployable?
|
|
282
295
|
end
|
|
283
296
|
|
|
297
|
+
test "#deployable? returns false if the stack is awaiting provisioning" do
|
|
298
|
+
@stack.update!(lock_reason: nil, awaiting_provision: true)
|
|
299
|
+
refute_predicate @stack, :deployable?
|
|
300
|
+
end
|
|
301
|
+
|
|
284
302
|
test "#allows_merges? returns true if the stack is not locked and the branch is green" do
|
|
285
303
|
assert_predicate @stack, :allows_merges?
|
|
286
304
|
end
|
|
@@ -306,7 +324,7 @@ module Shipit
|
|
|
306
324
|
end
|
|
307
325
|
|
|
308
326
|
test "#monitoring returns deploy_spec's content" do
|
|
309
|
-
assert_equal [{'image' => 'https://example.com/monitor.png', 'width' => 200, 'height' => 300}], @stack.monitoring
|
|
327
|
+
assert_equal [{ 'image' => 'https://example.com/monitor.png', 'width' => 200, 'height' => 300 }], @stack.monitoring
|
|
310
328
|
end
|
|
311
329
|
|
|
312
330
|
test "#destroy deletes the related commits" do
|
|
@@ -338,30 +356,41 @@ module Shipit
|
|
|
338
356
|
time = Time.current
|
|
339
357
|
@stack.update(lock_reason: "Just for fun", lock_author: shipit_users(:walrus))
|
|
340
358
|
travel 1.day
|
|
341
|
-
expect_hook(:lock, @stack, locked: false, lock_details: {from: time, until: Time.current}, stack: @stack) do
|
|
359
|
+
expect_hook(:lock, @stack, locked: false, lock_details: { from: time, until: Time.current }, stack: @stack) do
|
|
342
360
|
@stack.update(lock_reason: nil)
|
|
343
361
|
end
|
|
344
362
|
end
|
|
345
363
|
end
|
|
346
364
|
|
|
347
|
-
test "unlocking the stack triggers a
|
|
348
|
-
assert_no_enqueued_jobs(only:
|
|
365
|
+
test "unlocking the stack triggers a MergeMergeRequests job" do
|
|
366
|
+
assert_no_enqueued_jobs(only: ProcessMergeRequestsJob) do
|
|
349
367
|
@stack.update(lock_reason: "Just for fun", lock_author: shipit_users(:walrus))
|
|
350
368
|
end
|
|
351
369
|
|
|
352
|
-
assert_enqueued_with(job:
|
|
370
|
+
assert_enqueued_with(job: ProcessMergeRequestsJob, args: [@stack]) do
|
|
353
371
|
@stack.update(lock_reason: nil)
|
|
354
372
|
end
|
|
355
373
|
end
|
|
356
374
|
|
|
357
375
|
test "the git cache lock prevent concurrent access to the git cache" do
|
|
358
|
-
@stack.
|
|
376
|
+
second_stack = Shipit::Stack.find(@stack.id)
|
|
377
|
+
second_stack.acquire_git_cache_lock do
|
|
359
378
|
assert_raises Flock::TimeoutError do
|
|
360
379
|
@stack.acquire_git_cache_lock(timeout: 0.1) {}
|
|
361
380
|
end
|
|
362
381
|
end
|
|
363
382
|
end
|
|
364
383
|
|
|
384
|
+
test "the git cache lock is reentrant if called on the same Stack instance" do
|
|
385
|
+
called = false
|
|
386
|
+
@stack.acquire_git_cache_lock(timeout: 0.01) do
|
|
387
|
+
@stack.acquire_git_cache_lock(timeout: 0.01) do
|
|
388
|
+
called = true
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
assert called
|
|
392
|
+
end
|
|
393
|
+
|
|
365
394
|
test "the git cache lock is scoped to the stack" do
|
|
366
395
|
called = false
|
|
367
396
|
shipit_stacks(:cyclimse).acquire_git_cache_lock do
|
|
@@ -389,7 +418,7 @@ module Shipit
|
|
|
389
418
|
|
|
390
419
|
test "updating the stack emit a hook" do
|
|
391
420
|
expect_hook(:stack, @stack, action: :updated, stack: @stack) do
|
|
392
|
-
@stack.update(
|
|
421
|
+
@stack.update(environment: 'foo')
|
|
393
422
|
end
|
|
394
423
|
end
|
|
395
424
|
|
|
@@ -483,7 +512,9 @@ module Shipit
|
|
|
483
512
|
|
|
484
513
|
assert_no_enqueued_jobs do
|
|
485
514
|
assert_no_difference -> { Deploy.count } do
|
|
486
|
-
@stack.trigger_continuous_delivery
|
|
515
|
+
value = @stack.trigger_continuous_delivery
|
|
516
|
+
|
|
517
|
+
assert_nil value
|
|
487
518
|
end
|
|
488
519
|
end
|
|
489
520
|
end
|
|
@@ -551,7 +582,24 @@ module Shipit
|
|
|
551
582
|
end
|
|
552
583
|
end
|
|
553
584
|
|
|
585
|
+
test "#trigger_continuous_delivery bails out if no DeploySpec has been cached" do
|
|
586
|
+
@stack = shipit_stacks(:check_deploy_spec)
|
|
587
|
+
deploy_spec = @stack.cached_deploy_spec
|
|
588
|
+
|
|
589
|
+
assert_predicate @stack, :deployable?
|
|
590
|
+
refute_predicate @stack, :deployed_too_recently?
|
|
591
|
+
assert(deploy_spec.blank?, "DeploySpec blank? returned false")
|
|
592
|
+
|
|
593
|
+
assert_no_enqueued_jobs(only: Shipit::PerformTaskJob) do
|
|
594
|
+
assert_no_difference -> { Deploy.count } do
|
|
595
|
+
@stack.trigger_continuous_delivery
|
|
596
|
+
end
|
|
597
|
+
end
|
|
598
|
+
end
|
|
599
|
+
|
|
554
600
|
test "#trigger_continuous_delivery enqueues deployment ref update job" do
|
|
601
|
+
Shipit.stubs(:update_latest_deployed_ref).returns(true)
|
|
602
|
+
|
|
555
603
|
@stack = shipit_stacks(:shipit_canaries)
|
|
556
604
|
shipit_tasks(:canaries_running).delete
|
|
557
605
|
|
|
@@ -567,6 +615,8 @@ module Shipit
|
|
|
567
615
|
end
|
|
568
616
|
|
|
569
617
|
test "#trigger_continuous_delivery executes ref update job with correct sha" do
|
|
618
|
+
Shipit.stubs(:update_latest_deployed_ref).returns(true)
|
|
619
|
+
|
|
570
620
|
@stack = shipit_stacks(:shipit_canaries)
|
|
571
621
|
shipit_tasks(:canaries_running).delete
|
|
572
622
|
|
|
@@ -598,7 +648,7 @@ module Shipit
|
|
|
598
648
|
@stack.tasks.delete_all
|
|
599
649
|
|
|
600
650
|
deploy = @stack.trigger_continuous_delivery
|
|
601
|
-
assert_equal({'SAFETY_DISABLED' => '0'}, deploy.env)
|
|
651
|
+
assert_equal({ 'SAFETY_DISABLED' => '0' }, deploy.env)
|
|
602
652
|
end
|
|
603
653
|
|
|
604
654
|
test "#continuous_delivery_delayed! bumps updated_at" do
|
|
@@ -898,6 +948,22 @@ module Shipit
|
|
|
898
948
|
)
|
|
899
949
|
end
|
|
900
950
|
|
|
951
|
+
test "#unarchive! triggers a GithubSync job" do
|
|
952
|
+
assert_no_enqueued_jobs(only: GithubSyncJob) do
|
|
953
|
+
@stack.archive!(shipit_users(:codertocat))
|
|
954
|
+
end
|
|
955
|
+
|
|
956
|
+
assert_enqueued_with(job: GithubSyncJob, args: [stack_id: @stack.id]) do
|
|
957
|
+
@stack.unarchive!
|
|
958
|
+
end
|
|
959
|
+
end
|
|
960
|
+
|
|
961
|
+
test "#update that changes the branch name triggers a GithubSync job" do
|
|
962
|
+
assert_enqueued_with(job: GithubSyncJob, args: [stack_id: @stack.id]) do
|
|
963
|
+
@stack.update!(branch: 'test')
|
|
964
|
+
end
|
|
965
|
+
end
|
|
966
|
+
|
|
901
967
|
private
|
|
902
968
|
|
|
903
969
|
def generate_revert_commit(stack:, reverted_commit:, author: reverted_commit.author)
|