shipit-engine 0.28.1 → 0.33.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 +41 -2
- data/Rakefile +4 -2
- data/app/assets/images/archive-solid.svg +1 -0
- 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/_repositories.scss +148 -0
- data/app/assets/stylesheets/_pages/_stacks.scss +95 -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 +13 -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 +4 -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 +33 -0
- data/app/controllers/shipit/api/stacks_controller.rb +50 -5
- data/app/controllers/shipit/api/tasks_controller.rb +6 -5
- data/app/controllers/shipit/api_clients_controller.rb +50 -0
- 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 +5 -4
- 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 +33 -28
- 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 +78 -14
- data/app/controllers/shipit/status_controller.rb +2 -1
- data/app/controllers/shipit/tasks_controller.rb +9 -8
- data/app/controllers/shipit/webhooks_controller.rb +5 -132
- 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 -0
- data/app/helpers/shipit/stacks_helper.rb +9 -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 +4 -1
- 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 +3 -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 +1 -0
- 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 +5 -4
- 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 +2 -1
- data/app/jobs/shipit/{mark_deploy_healty_job.rb → 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 -90
- 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 +4 -3
- data/app/models/concerns/shipit/deferred_touch.rb +4 -3
- data/app/models/shipit/anonymous_user.rb +9 -0
- 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 +5 -4
- data/app/models/shipit/command_line_user.rb +5 -0
- data/app/models/shipit/commit.rb +41 -22
- data/app/models/shipit/commit_checks.rb +2 -0
- data/app/models/shipit/commit_deployment.rb +17 -12
- data/app/models/shipit/commit_deployment_status.rb +8 -3
- data/app/models/shipit/commit_message.rb +1 -0
- data/app/models/shipit/delivery.rb +4 -3
- data/app/models/shipit/deploy.rb +41 -10
- data/app/models/shipit/deploy_spec.rb +38 -7
- data/app/models/shipit/deploy_spec/bundler_discovery.rb +2 -1
- 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 +1 -0
- 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 +58 -0
- data/app/models/shipit/duration.rb +3 -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 +8 -5
- data/app/models/shipit/membership.rb +3 -2
- data/app/models/shipit/merge_request.rb +302 -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 +27 -260
- 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 +3 -2
- data/app/models/shipit/repository.rb +97 -0
- data/app/models/shipit/review_stack.rb +116 -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 +130 -57
- data/app/models/shipit/status.rb +3 -2
- data/app/models/shipit/status/common.rb +7 -6
- data/app/models/shipit/status/group.rb +1 -0
- data/app/models/shipit/status/missing.rb +2 -1
- data/app/models/shipit/status/unknown.rb +2 -1
- data/app/models/shipit/task.rb +118 -14
- 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 +110 -0
- data/app/models/shipit/team.rb +2 -1
- 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 +15 -8
- data/app/models/shipit/variable_definition.rb +1 -0
- data/app/models/shipit/webhooks.rb +43 -0
- data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +20 -0
- data/app/models/shipit/webhooks/handlers/handler.rb +41 -0
- data/app/models/shipit/webhooks/handlers/membership_handler.rb +46 -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 +21 -0
- data/app/models/shipit/webhooks/handlers/status_handler.rb +27 -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 +12 -5
- 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 +4 -3
- data/app/validators/subset_validator.rb +1 -0
- data/app/views/layouts/_head.html.erb +0 -0
- data/app/views/layouts/shipit.html.erb +5 -3
- data/app/views/shipit/_variables.html.erb +1 -1
- data/app/views/shipit/api_clients/index.html.erb +36 -0
- data/app/views/shipit/api_clients/new.html.erb +33 -0
- data/app/views/shipit/api_clients/show.html.erb +35 -0
- 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/logged_out.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 +13 -0
- data/app/views/shipit/stacks/_header.html.erb +30 -12
- data/app/views/shipit/stacks/_links.html.erb +1 -0
- 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 +9 -3
- data/app/views/shipit/stacks/settings.html.erb +22 -3
- data/app/views/shipit/stacks/show.html.erb +1 -1
- data/app/views/shipit/stacks/statistics.html.erb +82 -0
- 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 +18 -5
- data/config/routes.rb +29 -7
- data/db/migrate/20191209231045_create_shipit_repositories.rb +12 -0
- data/db/migrate/20191209231307_add_repository_reference_to_stacks.rb +15 -0
- data/db/migrate/20191216162728_backfill_repository_data.rb +22 -0
- data/db/migrate/20191216163010_remove_repository_information_from_stacks.rb +20 -0
- data/db/migrate/20191219205202_add_archived_since_to_stacks.rb +6 -0
- data/db/migrate/20200102175621_optional_task_commits.rb +6 -0
- data/db/migrate/20200109132519_add_sha_to_commit_deployments.rb +5 -0
- 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/lib/shipit.rb +23 -3
- data/lib/shipit/cast_value.rb +1 -0
- data/lib/shipit/command.rb +14 -18
- data/lib/shipit/commands.rb +5 -4
- data/lib/shipit/csv_serializer.rb +1 -0
- data/lib/shipit/deploy_commands.rb +1 -0
- data/lib/shipit/engine.rb +11 -2
- data/lib/shipit/environment_variables.rb +11 -1
- data/lib/shipit/first_parent_commits_iterator.rb +1 -0
- data/lib/shipit/flock.rb +1 -0
- data/lib/shipit/github_app.rb +41 -10
- 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 +3 -2
- 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 +1 -0
- data/lib/shipit/stack_commands.rb +12 -4
- data/lib/shipit/stat.rb +1 -0
- data/lib/shipit/task_commands.rb +23 -14
- data/lib/shipit/version.rb +2 -1
- 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 +16 -17
- 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 +15 -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 +4 -2
- 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 +65 -16
- data/test/controllers/api/tasks_controller_test.rb +13 -12
- data/test/controllers/api_clients_controller_test.rb +104 -0
- 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 +33 -22
- 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 +27 -9
- 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 +72 -15
- data/test/controllers/status_controller_test.rb +1 -0
- data/test/controllers/tasks_controller_test.rb +33 -20
- data/test/controllers/webhooks_controller_test.rb +36 -9
- data/test/dummy/config/application.rb +7 -2
- data/test/dummy/config/environments/development.rb +23 -6
- data/test/dummy/config/environments/test.rb +2 -5
- data/test/dummy/db/schema.rb +76 -24
- data/test/dummy/db/seeds.rb +30 -16
- data/test/fixtures/payloads/check_suite_master.json +2 -2
- 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/shipit/commit_deployment_statuses.yml +4 -4
- data/test/fixtures/shipit/commit_deployments.yml +8 -8
- data/test/fixtures/shipit/commits.yml +52 -1
- 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 +28 -0
- data/test/fixtures/shipit/stacks.yml +335 -30
- data/test/fixtures/shipit/statuses.yml +9 -0
- data/test/fixtures/shipit/tasks.yml +69 -3
- 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 +15 -11
- 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 +10 -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 +1 -0
- 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 +34 -4
- data/test/models/commit_deployment_test.rb +9 -11
- data/test/models/commits_test.rb +116 -21
- data/test/models/delivery_test.rb +2 -1
- data/test/models/deploy_spec_test.rb +103 -65
- data/test/models/deploy_stats_test.rb +113 -0
- data/test/models/deploys_test.rb +207 -26
- data/test/models/duration_test.rb +1 -0
- data/test/models/github_hook_test.rb +1 -0
- data/test/models/hook_test.rb +20 -16
- data/test/models/membership_test.rb +1 -0
- data/test/models/{pull_request_test.rb → merge_request_test.rb} +48 -41
- 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 +1 -0
- 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 +81 -0
- 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 +59 -0
- data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +120 -60
- 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 +83 -0
- data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
- data/test/models/shipit/webhooks/handlers_test.rb +27 -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 +59 -1
- data/test/models/team_test.rb +4 -2
- data/test/models/undeployed_commits_test.rb +14 -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 +37 -32
- data/test/unit/anonymous_user_serializer_test.rb +14 -0
- data/test/unit/command_test.rb +15 -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 +14 -4
- 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 +137 -0
- data/test/unit/github_url_helper_test.rb +6 -0
- data/test/unit/rollback_commands_test.rb +2 -1
- 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 +1 -0
- data/test/unit/user_serializer_test.rb +14 -0
- data/test/unit/variable_definition_test.rb +1 -0
- metadata +334 -169
- 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
|
@@ -1,22 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
4
|
-
class
|
|
5
|
+
class ProcessMergeRequestsJobTest < ActiveSupport::TestCase
|
|
5
6
|
setup do
|
|
6
7
|
@stack = shipit_stacks(:shipit)
|
|
7
|
-
@job =
|
|
8
|
+
@job = ProcessMergeRequestsJob.new
|
|
8
9
|
|
|
9
|
-
@pending_pr =
|
|
10
|
-
@unmergeable_pr =
|
|
11
|
-
@not_ready_pr =
|
|
12
|
-
@closed_pr =
|
|
13
|
-
@merged_pr =
|
|
14
|
-
@expired_pr =
|
|
15
|
-
@mergable_pending_ci =
|
|
10
|
+
@pending_pr = shipit_merge_requests(:shipit_pending)
|
|
11
|
+
@unmergeable_pr = shipit_merge_requests(:shipit_pending_unmergeable)
|
|
12
|
+
@not_ready_pr = shipit_merge_requests(:shipit_pending_not_mergeable_yet)
|
|
13
|
+
@closed_pr = shipit_merge_requests(:shipit_pending_closed)
|
|
14
|
+
@merged_pr = shipit_merge_requests(:shipit_pending_merged)
|
|
15
|
+
@expired_pr = shipit_merge_requests(:shipit_pending_expired)
|
|
16
|
+
@mergable_pending_ci = shipit_merge_requests(:shipit_mergeable_pending_ci)
|
|
16
17
|
end
|
|
17
18
|
|
|
18
19
|
test "#perform rejects unmergeable PRs and merge the others" do
|
|
19
|
-
|
|
20
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
20
21
|
stub_request(:put, "#{@pending_pr.api_url}/merge").to_return(status: %w(200 OK), body: {
|
|
21
22
|
sha: "6dcb09b5b57875f334f61aebed695e2e4193db5e",
|
|
22
23
|
merged: true,
|
|
@@ -34,7 +35,7 @@ module Shipit
|
|
|
34
35
|
end
|
|
35
36
|
|
|
36
37
|
test "#perform rejects PRs if the merge attempt fails" do
|
|
37
|
-
|
|
38
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
38
39
|
stub_request(:put, "#{@pending_pr.api_url}/merge").to_return(status: %w(405 Method not allowed), body: {
|
|
39
40
|
message: "Pull Request is not mergeable",
|
|
40
41
|
documentation_url: "https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button",
|
|
@@ -46,24 +47,24 @@ module Shipit
|
|
|
46
47
|
end
|
|
47
48
|
|
|
48
49
|
test "#perform rejects PRs but do not attempt to merge any if the stack doesn't allow merges" do
|
|
49
|
-
|
|
50
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
50
51
|
@stack.update!(lock_reason: 'Maintenance')
|
|
51
52
|
@job.perform(@stack)
|
|
52
53
|
assert_predicate @pending_pr.reload, :pending?
|
|
53
54
|
end
|
|
54
55
|
|
|
55
56
|
test "#perform revalidate PRs but do not attempt to merge any if the stack doesn't allow merges" do
|
|
56
|
-
|
|
57
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
57
58
|
@stack.update!(lock_reason: 'Maintenance')
|
|
58
59
|
@job.perform(@stack)
|
|
59
60
|
assert_predicate @expired_pr.reload, :revalidating?
|
|
60
61
|
end
|
|
61
62
|
|
|
62
63
|
test "#perform schedules a new job if the first PR in the queue is not mergeable yet" do
|
|
63
|
-
|
|
64
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
64
65
|
|
|
65
66
|
@pending_pr.update!(mergeable: nil)
|
|
66
|
-
assert_enqueued_with(job:
|
|
67
|
+
assert_enqueued_with(job: ProcessMergeRequestsJob) do
|
|
67
68
|
@job.perform(@stack)
|
|
68
69
|
end
|
|
69
70
|
assert_predicate @pending_pr.reload, :pending?
|
|
@@ -71,21 +72,21 @@ module Shipit
|
|
|
71
72
|
|
|
72
73
|
test "#perform cancels merge requests for closed PRs" do
|
|
73
74
|
@pending_pr.cancel!
|
|
74
|
-
|
|
75
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
75
76
|
@job.perform(@stack)
|
|
76
77
|
assert_predicate @closed_pr.reload, :canceled?
|
|
77
78
|
end
|
|
78
79
|
|
|
79
80
|
test "#perform cancels merge requests for manually merged PRs" do
|
|
80
81
|
@pending_pr.cancel!
|
|
81
|
-
|
|
82
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
82
83
|
@job.perform(@stack)
|
|
83
84
|
assert_predicate @merged_pr.reload, :canceled?
|
|
84
85
|
end
|
|
85
86
|
|
|
86
87
|
test "#perform does not reject pull requests with pending statuses" do
|
|
87
88
|
@pending_pr.cancel!
|
|
88
|
-
|
|
89
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
89
90
|
@job.perform(@stack)
|
|
90
91
|
refute_predicate @mergable_pending_ci.reload, :rejected?
|
|
91
92
|
refute_predicate @mergable_pending_ci.reload, :merged?
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
module Shipit
|
|
5
|
+
class ReapDeadTasksJobTest < ActiveSupport::TestCase
|
|
6
|
+
setup do
|
|
7
|
+
Task.where(status: Task::ACTIVE_STATUSES).update_all(status: 'success')
|
|
8
|
+
|
|
9
|
+
not_recently = Shipit::Task.recently_created_at - 1.minute
|
|
10
|
+
@deploy = shipit_deploys(:shipit)
|
|
11
|
+
@deploy.status = 'success'
|
|
12
|
+
@deploy.created_at = not_recently
|
|
13
|
+
@deploy.save!
|
|
14
|
+
|
|
15
|
+
@rollback = @deploy.build_rollback
|
|
16
|
+
@rollback.status = 'running'
|
|
17
|
+
@rollback.created_at = not_recently
|
|
18
|
+
@rollback.save!
|
|
19
|
+
|
|
20
|
+
@zombie_deploy = shipit_deploys(:shipit2)
|
|
21
|
+
@zombie_deploy.status = 'running'
|
|
22
|
+
@zombie_deploy.created_at = not_recently
|
|
23
|
+
@zombie_deploy.save!
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test 'reaps only zombie tasks' do
|
|
27
|
+
refute_predicate @zombie_deploy, :error?
|
|
28
|
+
|
|
29
|
+
Shipit::Deploy.any_instance.expects(:alive?).returns(false)
|
|
30
|
+
Shipit::Rollback.any_instance.expects(:alive?).returns(true)
|
|
31
|
+
ReapDeadTasksJob.perform_now
|
|
32
|
+
|
|
33
|
+
@zombie_deploy.reload
|
|
34
|
+
assert_predicate @zombie_deploy, :error?
|
|
35
|
+
|
|
36
|
+
@deploy.reload
|
|
37
|
+
assert_predicate @deploy, :finished?
|
|
38
|
+
|
|
39
|
+
@rollback.reload
|
|
40
|
+
assert_predicate @rollback, :running?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
test "does reap recently created tasks" do
|
|
44
|
+
Task.where(status: Task::ACTIVE_STATUSES).update_all(status: 'success')
|
|
45
|
+
recently = Time.current
|
|
46
|
+
@deploy = shipit_deploys(:shipit)
|
|
47
|
+
@deploy.created_at = recently
|
|
48
|
+
@deploy.status = 'running'
|
|
49
|
+
@deploy.save!
|
|
50
|
+
Shipit::Deploy.any_instance.expects(:alive?).never
|
|
51
|
+
|
|
52
|
+
ReapDeadTasksJob.perform_now
|
|
53
|
+
|
|
54
|
+
@deploy.reload
|
|
55
|
+
assert_predicate @deploy, :running?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
test 'reaps zombie aborting tasks' do
|
|
59
|
+
deploy = shipit_deploys(:shipit2)
|
|
60
|
+
deploy.status = 'aborting'
|
|
61
|
+
deploy.save!
|
|
62
|
+
|
|
63
|
+
ReapDeadTasksJob.perform_now
|
|
64
|
+
|
|
65
|
+
assert_predicate deploy.reload, :error?
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
class DeployCommandsTest < ActiveSupport::TestCase
|
|
6
|
+
test "#env includes the stack's pull request labels" do
|
|
7
|
+
stack = shipit_stacks(:review_stack)
|
|
8
|
+
deploy = stack.trigger_continuous_delivery
|
|
9
|
+
stack.pull_request.labels = ["wip", "bug"]
|
|
10
|
+
|
|
11
|
+
env = Shipit::DeployCommands.new(deploy).env
|
|
12
|
+
|
|
13
|
+
assert_equal env["WIP"], "true"
|
|
14
|
+
assert_equal env["BUG"], "true"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
class TaskCommandsTest < ActiveSupport::TestCase
|
|
6
|
+
test "#env includes a ReviewStack's pull request labels" do
|
|
7
|
+
stack = shipit_stacks(:review_stack)
|
|
8
|
+
stack.pull_request.labels = ["wip", "bug"]
|
|
9
|
+
task = shipit_tasks(:shipit_restart)
|
|
10
|
+
task.stack = stack
|
|
11
|
+
|
|
12
|
+
env = Shipit::TaskCommands.new(task).env
|
|
13
|
+
|
|
14
|
+
assert_equal env["WIP"], "true"
|
|
15
|
+
assert_equal env["BUG"], "true"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
module Shipit
|
|
5
|
+
class SameSiteCookieMiddlewareTest < ActiveSupport::TestCase
|
|
6
|
+
def app
|
|
7
|
+
Rack::Lint.new(lambda { |_env|
|
|
8
|
+
response = Rack::Response.new("", 200, "Content-Type" => "text/yaml")
|
|
9
|
+
|
|
10
|
+
response.set_cookie("session_test", value: "session_test", domain: ".test.com", path: "/")
|
|
11
|
+
response.set_cookie("another_cookie", value: "123abc", domain: ".test.com", path: "/")
|
|
12
|
+
response.finish
|
|
13
|
+
})
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def env_for_url(url)
|
|
17
|
+
env = Rack::MockRequest.env_for(url)
|
|
18
|
+
env
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def middleware
|
|
22
|
+
Shipit::SameSiteCookieMiddleware.new(app)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
test 'SameSite cookie attributes should be added on SSL' do
|
|
26
|
+
env = env_for_url("https://test.com/")
|
|
27
|
+
|
|
28
|
+
_status, headers, _body = middleware.call(env)
|
|
29
|
+
|
|
30
|
+
assert_includes headers['Set-Cookie'], 'SameSite'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
test 'SameSite cookie attributes should be added when multiple cookies are present' do
|
|
34
|
+
env = env_for_url("https://test.com/")
|
|
35
|
+
|
|
36
|
+
_status, headers, _body = middleware.call(env)
|
|
37
|
+
|
|
38
|
+
session_cookie, other_cookie = headers['Set-Cookie'].split("\n")
|
|
39
|
+
|
|
40
|
+
assert_includes session_cookie, 'SameSite'
|
|
41
|
+
assert_includes other_cookie, 'SameSite'
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
test 'SameSite cookie attributes should not be added on non SSL requests' do
|
|
45
|
+
env = env_for_url("http://test.com/")
|
|
46
|
+
|
|
47
|
+
_status, headers, _body = middleware.call(env)
|
|
48
|
+
|
|
49
|
+
assert_not_includes headers['Set-Cookie'], 'SameSite'
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
4
5
|
class CommitDeploymentStatusTest < ActiveSupport::TestCase
|
|
5
6
|
setup do
|
|
6
|
-
@status = shipit_commit_deployment_statuses(:
|
|
7
|
+
@status = shipit_commit_deployment_statuses(:shipit2_deploy_third_in_progress)
|
|
7
8
|
@deployment = @status.commit_deployment
|
|
8
9
|
@task = @deployment.task
|
|
9
|
-
@commit = @deployment.commit
|
|
10
10
|
@author = @deployment.author
|
|
11
11
|
end
|
|
12
12
|
|
|
@@ -14,14 +14,44 @@ module Shipit
|
|
|
14
14
|
response = stub(id: 44, url: 'https://example.com')
|
|
15
15
|
@author.github_api.expects(:create_deployment_status).with(
|
|
16
16
|
@deployment.api_url,
|
|
17
|
-
'
|
|
17
|
+
'in_progress',
|
|
18
|
+
accept: "application/vnd.github.flash-preview+json",
|
|
18
19
|
target_url: "http://shipit.com/shopify/shipit-engine/production/deploys/#{@task.id}",
|
|
19
|
-
description: "walrus triggered the deploy of shopify/shipit-engine/production to #{@
|
|
20
|
+
description: "walrus triggered the deploy of shopify/shipit-engine/production to #{@deployment.short_sha}",
|
|
21
|
+
environment_url: "https://shipit.shopify.com",
|
|
20
22
|
).returns(response)
|
|
21
23
|
|
|
22
24
|
@status.create_on_github!
|
|
23
25
|
assert_equal response.id, @status.github_id
|
|
24
26
|
assert_equal response.url, @status.api_url
|
|
25
27
|
end
|
|
28
|
+
|
|
29
|
+
test 'description is truncated to character limit' do
|
|
30
|
+
limit = CommitDeploymentStatus::DESCRIPTION_CHARACTER_LIMIT_ON_GITHUB
|
|
31
|
+
deployment = shipit_commit_deployments(:shipit_deploy_second)
|
|
32
|
+
|
|
33
|
+
status = deployment.statuses.create!(status: 'success')
|
|
34
|
+
status.stubs(:description).returns('desc' * limit)
|
|
35
|
+
create_status_response = stub(id: 'abcd', url: 'https://github.com/status/abcd')
|
|
36
|
+
status.author.github_api.expects(:create_deployment_status).with do |*_args, **kwargs|
|
|
37
|
+
kwargs[:description].size <= limit
|
|
38
|
+
end.returns(create_status_response)
|
|
39
|
+
|
|
40
|
+
status.create_on_github!
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
test 'includes deployment url when the deployment succeeds' do
|
|
44
|
+
deployment = shipit_commit_deployments(:shipit_deploy_second)
|
|
45
|
+
|
|
46
|
+
status = deployment.statuses.create!(status: 'success')
|
|
47
|
+
stack = status.stack
|
|
48
|
+
stack.deploy_url = "stack-deploy-url"
|
|
49
|
+
create_status_response = stub(id: 'abcd', url: 'https://github.com/status/abcd')
|
|
50
|
+
status.author.github_api.expects(:create_deployment_status).with do |*_args, **kwargs|
|
|
51
|
+
kwargs[:environment_url] == 'stack-deploy-url'
|
|
52
|
+
end.returns(create_status_response)
|
|
53
|
+
|
|
54
|
+
status.create_on_github!
|
|
55
|
+
end
|
|
26
56
|
end
|
|
27
57
|
end
|
|
@@ -1,33 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
4
5
|
class CommitDeploymentTest < ActiveSupport::TestCase
|
|
5
6
|
setup do
|
|
6
7
|
@deployment = shipit_commit_deployments(:shipit_pending_fourth)
|
|
7
|
-
@commit = @deployment.commit
|
|
8
8
|
@task = @deployment.task
|
|
9
9
|
@stack = @task.stack
|
|
10
10
|
@author = @deployment.author
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
test "there can only be one record per deploy and commit pair" do
|
|
14
|
-
assert_raises ActiveRecord::RecordNotUnique do
|
|
15
|
-
CommitDeployment.create!(task: @deployment.task, commit: @deployment.commit)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
13
|
test "creation on GitHub" do
|
|
20
|
-
pull_request_response = stub(head: stub(sha: '6dcb09b5b57875f334f61aebed695e2e4193db5e'))
|
|
21
|
-
@author.github_api.expects(:pull_request).with('shopify/shipit-engine', 7).returns(pull_request_response)
|
|
22
|
-
|
|
23
14
|
deployment_response = stub(id: 42, url: 'https://example.com')
|
|
24
15
|
@author.github_api.expects(:create_deployment).with(
|
|
25
16
|
'shopify/shipit-engine',
|
|
26
|
-
|
|
17
|
+
@deployment.sha,
|
|
27
18
|
auto_merge: false,
|
|
28
19
|
required_contexts: [],
|
|
29
20
|
description: "Via Shipit",
|
|
30
21
|
environment: @stack.environment,
|
|
22
|
+
payload: {
|
|
23
|
+
shipit: {
|
|
24
|
+
task_id: 4,
|
|
25
|
+
from_sha: 'f890fd8b5f2be05d1fedb763a3605ee461c39074',
|
|
26
|
+
to_sha: '467578b362bf2b4df5903e1c7960929361c3435a',
|
|
27
|
+
},
|
|
28
|
+
}.to_json,
|
|
31
29
|
).returns(deployment_response)
|
|
32
30
|
|
|
33
31
|
@deployment.create_on_github!
|
data/test/models/commits_test.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
@@ -12,7 +13,7 @@ module Shipit
|
|
|
12
13
|
stub_request(:get, "https://api.github.com/user/emails").to_return(
|
|
13
14
|
status: %w(200 OK),
|
|
14
15
|
body: {}.to_json,
|
|
15
|
-
headers: {"Content-Type" => "application/json"},
|
|
16
|
+
headers: { "Content-Type" => "application/json" },
|
|
16
17
|
)
|
|
17
18
|
end
|
|
18
19
|
|
|
@@ -68,6 +69,39 @@ module Shipit
|
|
|
68
69
|
refute_predicate commit, :revert?
|
|
69
70
|
end
|
|
70
71
|
|
|
72
|
+
test '.create_from_github truncates long messages' do
|
|
73
|
+
message = 'ABCDEFGHIJ' * 7000
|
|
74
|
+
|
|
75
|
+
assert_difference -> { Commit.count }, +1 do
|
|
76
|
+
@stack.commits.create_from_github!(
|
|
77
|
+
resource(
|
|
78
|
+
sha: '2adaad1ad30c235d3a6e7981dfc1742f7ecb1e85',
|
|
79
|
+
author: {},
|
|
80
|
+
committer: {},
|
|
81
|
+
commit: {
|
|
82
|
+
author: {
|
|
83
|
+
name: 'Lando Walrussian',
|
|
84
|
+
email: 'walrus@shopify.com',
|
|
85
|
+
date: Time.now,
|
|
86
|
+
},
|
|
87
|
+
committer: {
|
|
88
|
+
name: 'Lando Walrussian',
|
|
89
|
+
email: 'walrus@shopify.com',
|
|
90
|
+
date: Time.now,
|
|
91
|
+
},
|
|
92
|
+
message: message,
|
|
93
|
+
},
|
|
94
|
+
),
|
|
95
|
+
)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
max_message_size = Shipit::Commit.columns_hash["message"].limit
|
|
99
|
+
commit = Commit.last
|
|
100
|
+
|
|
101
|
+
refute_predicate commit.message, :blank?
|
|
102
|
+
assert(commit.message.length <= Shipit::Commit.columns_hash["message"].limit) if max_message_size
|
|
103
|
+
end
|
|
104
|
+
|
|
71
105
|
test '.create_from_github handle PRs merged by another Shipit stacks' do
|
|
72
106
|
assert_difference -> { Commit.count }, +1 do
|
|
73
107
|
@stack.commits.create_from_github!(
|
|
@@ -96,6 +130,55 @@ module Shipit
|
|
|
96
130
|
assert_equal shipit_users(:walrus), commit.author
|
|
97
131
|
end
|
|
98
132
|
|
|
133
|
+
test '.create_from_github stores pull_request_head_sha' do
|
|
134
|
+
assert_difference -> { Commit.count }, +1 do
|
|
135
|
+
@stack.commits.create_from_github!(
|
|
136
|
+
resource(
|
|
137
|
+
sha: '2adaad1ad30c235d3a6e7981dfc1742f7ecb1e85',
|
|
138
|
+
author: {},
|
|
139
|
+
committer: {},
|
|
140
|
+
commit: {
|
|
141
|
+
author: {
|
|
142
|
+
name: 'Shipit',
|
|
143
|
+
email: '',
|
|
144
|
+
date: Time.now,
|
|
145
|
+
},
|
|
146
|
+
committer: {
|
|
147
|
+
name: 'Shipit',
|
|
148
|
+
email: '',
|
|
149
|
+
date: Time.now,
|
|
150
|
+
},
|
|
151
|
+
message: "Merge pull request #62 from shipit-engine/yoloshipit\n\nyoloshipit!",
|
|
152
|
+
},
|
|
153
|
+
parents: [
|
|
154
|
+
{ sha: "1864542e3d2f8a41916a2dec0f2b4d3c1bf4899b", url: '', html_url: '' },
|
|
155
|
+
{ sha: "63d7e03e517fd2ae1caeb1b7a9f21767f84d671a", url: '', html_url: '' },
|
|
156
|
+
],
|
|
157
|
+
),
|
|
158
|
+
)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
commit = Commit.last
|
|
162
|
+
assert_equal '63d7e03e517fd2ae1caeb1b7a9f21767f84d671a', commit.pull_request_head_sha
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
test "#message= truncates the message" do
|
|
166
|
+
skip unless Shipit::Commit.columns_hash['message'].limit
|
|
167
|
+
limit = Shipit::Commit.columns_hash['message'].limit
|
|
168
|
+
|
|
169
|
+
@commit.update!(message: 'a' * limit * 2)
|
|
170
|
+
assert_equal limit, @commit.message.bytesize
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
test "#message= truncates multibyte messages" do
|
|
174
|
+
skip unless Shipit::Commit.columns_hash['message'].limit
|
|
175
|
+
limit = Shipit::Commit.columns_hash['message'].limit
|
|
176
|
+
|
|
177
|
+
@commit.update!(message: '国' * limit)
|
|
178
|
+
assert_operator @commit.message.length, :<=, limit
|
|
179
|
+
assert_operator @commit.message.bytesize, :<=, limit
|
|
180
|
+
end
|
|
181
|
+
|
|
99
182
|
test "#pull_request? detect pull request based on message format" do
|
|
100
183
|
assert @pr.pull_request?
|
|
101
184
|
refute @commit.pull_request?
|
|
@@ -143,7 +226,7 @@ module Shipit
|
|
|
143
226
|
|
|
144
227
|
test "updating broadcasts an update event" do
|
|
145
228
|
expect_event(@stack)
|
|
146
|
-
@commit.
|
|
229
|
+
@commit.update(message: "toto")
|
|
147
230
|
end
|
|
148
231
|
|
|
149
232
|
test "updating state to success triggers new deploy when stack has continuous deployment" do
|
|
@@ -190,12 +273,14 @@ module Shipit
|
|
|
190
273
|
committed_at: Time.now,
|
|
191
274
|
)
|
|
192
275
|
|
|
193
|
-
@stack.deploys.
|
|
276
|
+
deploy = @stack.deploys.build(
|
|
194
277
|
user_id: walrus.id,
|
|
195
278
|
since_commit: @stack.commits.first,
|
|
196
279
|
until_commit: new_commit,
|
|
197
280
|
status: 'success',
|
|
198
281
|
)
|
|
282
|
+
deploy.stubs(:pull_request_head_for_commit).returns(nil)
|
|
283
|
+
deploy.save!
|
|
199
284
|
|
|
200
285
|
assert_no_difference "Deploy.count" do
|
|
201
286
|
@commit.statuses.create!(stack_id: @stack.id, state: 'success')
|
|
@@ -248,7 +333,7 @@ module Shipit
|
|
|
248
333
|
target_url: 'http://example.com',
|
|
249
334
|
created_at: 1.day.ago,
|
|
250
335
|
)
|
|
251
|
-
Shipit.github.api.expects(:statuses).with(@stack.github_repo_name, @commit.sha).returns([status])
|
|
336
|
+
Shipit.github.api.expects(:statuses).with(@stack.github_repo_name, @commit.sha, per_page: 100).returns([status])
|
|
252
337
|
assert_difference '@commit.statuses.count', 1 do
|
|
253
338
|
@commit.refresh_statuses!
|
|
254
339
|
end
|
|
@@ -385,10 +470,10 @@ module Shipit
|
|
|
385
470
|
commit = shipit_commits(:second)
|
|
386
471
|
assert_predicate commit.status, :group?
|
|
387
472
|
assert_equal 3, commit.status.size
|
|
388
|
-
commit.stack.update!(cached_deploy_spec: DeploySpec.new('ci' => {'hide' => [
|
|
473
|
+
commit.stack.update!(cached_deploy_spec: DeploySpec.new('ci' => { 'hide' => [
|
|
389
474
|
'Travis CI',
|
|
390
475
|
'metrics/coveralls',
|
|
391
|
-
]}))
|
|
476
|
+
] }))
|
|
392
477
|
commit.reload
|
|
393
478
|
refute_predicate commit.status, :group?
|
|
394
479
|
end
|
|
@@ -518,7 +603,7 @@ module Shipit
|
|
|
518
603
|
'error' => %w(success),
|
|
519
604
|
}
|
|
520
605
|
expected_webhook_transitions.each do |initial_state, firing_states|
|
|
521
|
-
initial_status_attributes = {state: initial_state, description: 'abc', context: 'ci/travis'}
|
|
606
|
+
initial_status_attributes = { state: initial_state, description: 'abc', context: 'ci/travis' }
|
|
522
607
|
(expected_webhook_transitions.keys - %w(unknown)).each do |new_state|
|
|
523
608
|
should_fire = firing_states.include?(new_state)
|
|
524
609
|
action = should_fire ? 'fires' : 'does not fire'
|
|
@@ -537,7 +622,7 @@ module Shipit
|
|
|
537
622
|
end
|
|
538
623
|
assert_equal initial_state, commit.state
|
|
539
624
|
|
|
540
|
-
expected_status_attributes = {state: new_state, description: initial_state, context: 'ci/travis'}
|
|
625
|
+
expected_status_attributes = { state: new_state, description: initial_state, context: 'ci/travis' }
|
|
541
626
|
add_status = lambda do
|
|
542
627
|
attrs = expected_status_attributes.merge(created_at: 1.day.ago.to_s(:db))
|
|
543
628
|
commit.create_status_from_github!(OpenStruct.new(attrs))
|
|
@@ -602,7 +687,7 @@ module Shipit
|
|
|
602
687
|
end
|
|
603
688
|
end
|
|
604
689
|
|
|
605
|
-
test "#add_status schedule a
|
|
690
|
+
test "#add_status schedule a MergeMergeRequests job if the commit transition to `pending` or `success`" do
|
|
606
691
|
commit = shipit_commits(:second)
|
|
607
692
|
github_status = OpenStruct.new(
|
|
608
693
|
state: 'success',
|
|
@@ -612,7 +697,7 @@ module Shipit
|
|
|
612
697
|
)
|
|
613
698
|
|
|
614
699
|
assert_equal 'failure', commit.state
|
|
615
|
-
assert_enqueued_with(job:
|
|
700
|
+
assert_enqueued_with(job: ProcessMergeRequestsJob, args: [@commit.stack]) do
|
|
616
701
|
commit.create_status_from_github!(github_status)
|
|
617
702
|
assert_equal 'success', commit.state
|
|
618
703
|
end
|
|
@@ -653,12 +738,12 @@ module Shipit
|
|
|
653
738
|
sha: '5590fd8b5f2be05d1fedb763a3605ee461c39074',
|
|
654
739
|
message: "Merge pull request #62 from shipit-engine/yoloshipit\n\nyoloshipit!",
|
|
655
740
|
)
|
|
656
|
-
|
|
741
|
+
merge_request = shipit_merge_requests(:shipit_pending)
|
|
657
742
|
|
|
658
743
|
assert_predicate commit, :pull_request?
|
|
659
744
|
assert_equal 62, commit.pull_request_number
|
|
660
|
-
assert_equal
|
|
661
|
-
assert_equal
|
|
745
|
+
assert_equal merge_request.title, commit.pull_request_title
|
|
746
|
+
assert_equal merge_request, commit.merge_request
|
|
662
747
|
end
|
|
663
748
|
|
|
664
749
|
test "merge commits infer pull request number and title from the message if it's not a known pull request" do
|
|
@@ -674,7 +759,7 @@ module Shipit
|
|
|
674
759
|
assert_predicate commit, :pull_request?
|
|
675
760
|
assert_equal 99, commit.pull_request_number
|
|
676
761
|
assert_equal 'yoloshipit!', commit.pull_request_title
|
|
677
|
-
assert_nil commit.
|
|
762
|
+
assert_nil commit.merge_request
|
|
678
763
|
end
|
|
679
764
|
|
|
680
765
|
test "the merge requester if known overrides the commit author" do
|
|
@@ -703,7 +788,7 @@ module Shipit
|
|
|
703
788
|
refute_predicate commit, :pull_request?
|
|
704
789
|
assert_nil commit.pull_request_number
|
|
705
790
|
assert_nil commit.pull_request_title
|
|
706
|
-
assert_nil commit.
|
|
791
|
+
assert_nil commit.merge_request
|
|
707
792
|
end
|
|
708
793
|
|
|
709
794
|
test "#revert? returns false if the message doesn't follow the revert convention" do
|
|
@@ -762,17 +847,27 @@ module Shipit
|
|
|
762
847
|
test "when merged via the queue, deploy_requested_at is merge_requested_at" do
|
|
763
848
|
commit = shipit_commits(:cyclimse_merged)
|
|
764
849
|
assert_predicate commit, :pull_request?
|
|
765
|
-
assert_equal commit.
|
|
766
|
-
assert_equal commit.deploy_requested_at, commit.
|
|
850
|
+
assert_equal commit.merge_request, shipit_merge_requests(:cyclimse_pending_merged)
|
|
851
|
+
assert_equal commit.deploy_requested_at, commit.merge_request.merge_requested_at
|
|
767
852
|
end
|
|
768
853
|
|
|
769
854
|
test "when merged manually after being queued, deploy_requested_at is created_at" do
|
|
770
|
-
pr =
|
|
855
|
+
pr = shipit_merge_requests(:cyclimse_pending_merged)
|
|
771
856
|
pr.cancel!
|
|
772
857
|
commit = shipit_commits(:cyclimse_merged)
|
|
773
858
|
assert_equal commit.deploy_requested_at, commit.created_at
|
|
774
859
|
end
|
|
775
860
|
|
|
861
|
+
test "#recently_pushed?" do
|
|
862
|
+
freeze_time do
|
|
863
|
+
commit = Commit.new(message: "abcd", created_at: Time.now.utc)
|
|
864
|
+
assert_predicate commit, :recently_pushed?
|
|
865
|
+
|
|
866
|
+
commit = Commit.new(message: "abcd", created_at: 10.minutes.ago)
|
|
867
|
+
refute_predicate commit, :recently_pushed?
|
|
868
|
+
end
|
|
869
|
+
end
|
|
870
|
+
|
|
776
871
|
private
|
|
777
872
|
|
|
778
873
|
def expect_event(stack)
|
|
@@ -784,9 +879,9 @@ module Shipit
|
|
|
784
879
|
|
|
785
880
|
def expect_hook_emit(commit, event, status_attributes, &block)
|
|
786
881
|
matches = lambda do |payload|
|
|
787
|
-
assert_equal
|
|
788
|
-
assert_equal
|
|
789
|
-
assert_equal
|
|
882
|
+
assert_equal(commit, payload[:commit])
|
|
883
|
+
assert_equal(commit.stack, payload[:stack])
|
|
884
|
+
assert_equal(status_attributes[:state], payload[:status])
|
|
790
885
|
end
|
|
791
886
|
expect_hook(event, commit.stack, matches, &block)
|
|
792
887
|
end
|