shipit-engine 0.38.0 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +48 -4
- data/Rakefile +2 -1
- data/app/assets/javascripts/shipit/continuous_delivery_schedule.js.coffee +15 -0
- data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +1 -0
- data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
- data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
- data/app/controllers/concerns/shipit/api/rendering.rb +1 -0
- data/app/controllers/concerns/shipit/authentication.rb +1 -0
- data/app/controllers/concerns/shipit/pagination.rb +3 -2
- data/app/controllers/shipit/api/base_controller.rb +12 -10
- data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
- data/app/controllers/shipit/api/commits_controller.rb +2 -3
- data/app/controllers/shipit/api/deploys_controller.rb +6 -1
- data/app/controllers/shipit/api/hooks_controller.rb +4 -3
- data/app/controllers/shipit/api/locks_controller.rb +1 -0
- data/app/controllers/shipit/api/merge_requests_controller.rb +6 -5
- data/app/controllers/shipit/api/outputs_controller.rb +1 -0
- data/app/controllers/shipit/api/release_statuses_controller.rb +2 -1
- data/app/controllers/shipit/api/rollbacks_controller.rb +1 -0
- data/app/controllers/shipit/api/stacks_controller.rb +15 -14
- data/app/controllers/shipit/api/tasks_controller.rb +6 -5
- data/app/controllers/shipit/api_clients_controller.rb +6 -7
- data/app/controllers/shipit/ccmenu_url_controller.rb +3 -2
- data/app/controllers/shipit/commit_checks_controller.rb +2 -1
- data/app/controllers/shipit/commits_controller.rb +1 -0
- data/app/controllers/shipit/continuous_delivery_schedules_controller.rb +42 -0
- data/app/controllers/shipit/deploys_controller.rb +6 -5
- data/app/controllers/shipit/github_authentication_controller.rb +6 -0
- data/app/controllers/shipit/merge_requests_controller.rb +1 -0
- data/app/controllers/shipit/merge_status_controller.rb +30 -26
- data/app/controllers/shipit/release_statuses_controller.rb +1 -0
- data/app/controllers/shipit/repositories_controller.rb +4 -7
- data/app/controllers/shipit/rollbacks_controller.rb +2 -1
- data/app/controllers/shipit/shipit_controller.rb +1 -0
- data/app/controllers/shipit/stacks_controller.rb +27 -31
- data/app/controllers/shipit/status_controller.rb +1 -0
- data/app/controllers/shipit/tasks_controller.rb +3 -1
- data/app/controllers/shipit/webhooks_controller.rb +2 -1
- data/app/helpers/shipit/api_clients_helper.rb +1 -0
- data/app/helpers/shipit/chunks_helper.rb +3 -1
- data/app/helpers/shipit/deploys_helper.rb +7 -3
- data/app/helpers/shipit/github_url_helper.rb +5 -4
- data/app/helpers/shipit/merge_status_helper.rb +1 -0
- data/app/helpers/shipit/shipit_helper.rb +11 -10
- data/app/helpers/shipit/stacks_helper.rb +10 -11
- data/app/helpers/shipit/tasks_helper.rb +2 -1
- data/app/jobs/shipit/background_job/unique.rb +3 -2
- data/app/jobs/shipit/background_job.rb +9 -1
- data/app/jobs/shipit/cache_deploy_spec_job.rb +2 -1
- data/app/jobs/shipit/chunk_rollup_job.rb +1 -0
- data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
- data/app/jobs/shipit/continuous_delivery_job.rb +5 -0
- data/app/jobs/shipit/create_on_github_job.rb +1 -0
- data/app/jobs/shipit/create_release_statuses_job.rb +2 -0
- data/app/jobs/shipit/deferred_touch_job.rb +1 -0
- data/app/jobs/shipit/deliver_hook_job.rb +1 -0
- data/app/jobs/shipit/destroy_job.rb +1 -0
- data/app/jobs/shipit/destroy_repository_job.rb +1 -0
- data/app/jobs/shipit/destroy_stack_job.rb +36 -15
- data/app/jobs/shipit/emit_event_job.rb +1 -0
- data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
- data/app/jobs/shipit/fetch_deployed_revision_job.rb +1 -0
- data/app/jobs/shipit/github_sync_job.rb +4 -2
- data/app/jobs/shipit/mark_deploy_healthy_job.rb +1 -0
- data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
- data/app/jobs/shipit/perform_task_job.rb +1 -0
- data/app/jobs/shipit/process_merge_requests_job.rb +2 -0
- data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
- data/app/jobs/shipit/reap_dead_tasks_job.rb +1 -0
- data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
- data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
- data/app/jobs/shipit/refresh_merge_request_job.rb +1 -0
- data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
- data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
- data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
- data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +6 -7
- data/app/models/concerns/shipit/deferred_touch.rb +5 -2
- data/app/models/shipit/anonymous_user.rb +4 -5
- data/app/models/shipit/api_client.rb +5 -3
- data/app/models/shipit/application_record.rb +1 -0
- data/app/models/shipit/check_run.rb +7 -6
- data/app/models/shipit/command_line_user.rb +4 -5
- data/app/models/shipit/commit.rb +46 -32
- data/app/models/shipit/commit_checks.rb +4 -2
- data/app/models/shipit/commit_deployment.rb +7 -5
- data/app/models/shipit/commit_deployment_status.rb +5 -3
- data/app/models/shipit/commit_message.rb +2 -0
- data/app/models/shipit/continuous_delivery_schedule.rb +84 -0
- data/app/models/shipit/delivery.rb +5 -4
- data/app/models/shipit/deploy.rb +46 -26
- data/app/models/shipit/deploy_spec/bundler_discovery.rb +3 -1
- data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec/file_system.rb +48 -17
- data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +4 -3
- data/app/models/shipit/deploy_spec/lerna_discovery.rb +32 -31
- data/app/models/shipit/deploy_spec/npm_discovery.rb +18 -13
- data/app/models/shipit/deploy_spec/pypi_discovery.rb +5 -4
- data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec.rb +25 -30
- data/app/models/shipit/deploy_stats.rb +6 -1
- data/app/models/shipit/duration.rb +5 -3
- data/app/models/shipit/ephemeral_commit_checks.rb +8 -7
- data/app/models/shipit/github_hook.rb +1 -0
- data/app/models/shipit/github_status.rb +1 -0
- data/app/models/shipit/hook.rb +9 -7
- data/app/models/shipit/membership.rb +1 -0
- data/app/models/shipit/merge_request.rb +26 -16
- data/app/models/shipit/output_chunk.rb +1 -0
- data/app/models/shipit/provisioning_handler.rb +1 -0
- data/app/models/shipit/pull_request.rb +2 -2
- data/app/models/shipit/record.rb +1 -0
- data/app/models/shipit/release_status.rb +4 -3
- data/app/models/shipit/repository.rb +12 -11
- data/app/models/shipit/review_stack.rb +3 -1
- data/app/models/shipit/review_stack_provisioning_queue.rb +2 -2
- data/app/models/shipit/rollback.rb +2 -0
- data/app/models/shipit/stack.rb +71 -60
- data/app/models/shipit/status/common.rb +1 -0
- data/app/models/shipit/status/group.rb +5 -3
- data/app/models/shipit/status/missing.rb +2 -1
- data/app/models/shipit/status/unknown.rb +1 -0
- data/app/models/shipit/status.rb +5 -4
- data/app/models/shipit/task.rb +40 -31
- data/app/models/shipit/task_definition.rb +10 -7
- data/app/models/shipit/task_execution_strategy/default.rb +13 -13
- data/app/models/shipit/team.rb +13 -12
- data/app/models/shipit/undeployed_commit.rb +8 -3
- data/app/models/shipit/unlimited_api_client.rb +2 -2
- data/app/models/shipit/user.rb +23 -16
- data/app/models/shipit/variable_definition.rb +2 -1
- data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +1 -0
- data/app/models/shipit/webhooks/handlers/handler.rb +1 -0
- data/app/models/shipit/webhooks/handlers/membership_handler.rb +1 -0
- data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +10 -10
- data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +1 -1
- data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +10 -10
- data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +2 -2
- data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +2 -2
- data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +1 -1
- data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +3 -3
- data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +1 -1
- data/app/models/shipit/webhooks/handlers/push_handler.rb +2 -1
- data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -0
- data/app/models/shipit/webhooks.rb +3 -2
- data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
- data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
- data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
- data/app/serializers/shipit/commit_serializer.rb +2 -1
- data/app/serializers/shipit/deploy_serializer.rb +1 -0
- data/app/serializers/shipit/hook_serializer.rb +1 -0
- data/app/serializers/shipit/merge_request_serializer.rb +2 -1
- data/app/serializers/shipit/rollback_serializer.rb +1 -0
- data/app/serializers/shipit/short_commit_serializer.rb +1 -0
- data/app/serializers/shipit/stack_serializer.rb +4 -3
- data/app/serializers/shipit/tail_task_serializer.rb +4 -1
- data/app/serializers/shipit/task_serializer.rb +1 -0
- data/app/serializers/shipit/user_serializer.rb +1 -0
- data/app/validators/ascii_only_validator.rb +4 -3
- data/app/validators/subset_validator.rb +1 -0
- data/app/views/shipit/_variables.html.erb +1 -1
- data/app/views/shipit/ccmenu/project.xml.builder +2 -1
- data/app/views/shipit/continuous_delivery_schedules/show.html.erb +59 -0
- data/app/views/shipit/merge_status/failure.html.erb +1 -1
- data/app/views/shipit/missing_settings.html.erb +1 -1
- data/app/views/shipit/stacks/_settings_form.erb +1 -0
- data/config/initializers/inflections.rb +1 -0
- data/config/locales/en.yml +1 -0
- data/config/routes.rb +21 -18
- data/config/secrets.development.example.yml +1 -1
- data/config/secrets.development.shopify.yml +1 -1
- data/db/migrate/20240821003007_add_continuous_delivery_schedules.rb +13 -0
- data/db/migrate/20250207203053_embiggen_github_ids.rb +8 -0
- data/lib/shipit/cast_value.rb +1 -0
- data/lib/shipit/command.rb +29 -9
- data/lib/shipit/commands.rb +4 -2
- data/lib/shipit/csv_serializer.rb +3 -0
- data/lib/shipit/deploy_commands.rb +2 -1
- data/lib/shipit/engine.rb +6 -5
- data/lib/shipit/environment_variables.rb +2 -0
- data/lib/shipit/first_parent_commits_iterator.rb +2 -3
- data/lib/shipit/flock.rb +11 -9
- data/lib/shipit/github_app.rb +14 -16
- data/lib/shipit/github_http_cache_middleware.rb +1 -0
- data/lib/shipit/null_serializer.rb +1 -0
- data/lib/shipit/octokit_check_runs.rb +2 -3
- data/lib/shipit/octokit_iterator.rb +2 -0
- data/lib/shipit/paginator.rb +1 -0
- data/lib/shipit/rollback_commands.rb +2 -1
- data/lib/shipit/same_site_cookie_middleware.rb +1 -0
- data/lib/shipit/simple_message_verifier.rb +1 -0
- data/lib/shipit/stack_commands.rb +35 -27
- data/lib/shipit/stat.rb +1 -0
- data/lib/shipit/task_commands.rb +7 -6
- data/lib/shipit/version.rb +2 -1
- data/lib/shipit.rb +30 -17
- data/lib/tasks/cron.rake +2 -1
- data/lib/tasks/dev.rake +3 -2
- data/lib/tasks/shipit.rake +3 -2
- data/lib/tasks/teams.rake +3 -2
- data/test/controllers/api/base_controller_test.rb +1 -0
- data/test/controllers/api/ccmenu_controller_test.rb +4 -3
- data/test/controllers/api/commits_controller_test.rb +1 -0
- data/test/controllers/api/deploys_controller_test.rb +26 -1
- data/test/controllers/api/hooks_controller_test.rb +6 -5
- data/test/controllers/api/locks_controller_test.rb +1 -0
- data/test/controllers/api/merge_requests_controller_test.rb +1 -0
- data/test/controllers/api/outputs_controller_test.rb +1 -0
- data/test/controllers/api/release_statuses_controller_test.rb +4 -3
- data/test/controllers/api/rollback_controller_test.rb +3 -2
- data/test/controllers/api/stacks_controller_test.rb +13 -12
- data/test/controllers/api/tasks_controller_test.rb +7 -6
- data/test/controllers/api_clients_controller_test.rb +10 -10
- data/test/controllers/ccmenu_controller_test.rb +1 -0
- data/test/controllers/commit_checks_controller_test.rb +1 -0
- data/test/controllers/commits_controller_test.rb +9 -8
- data/test/controllers/continuous_delivery_schedules_controller_test.rb +66 -0
- data/test/controllers/deploys_controller_test.rb +4 -2
- data/test/controllers/github_authentication_controller_test.rb +6 -4
- data/test/controllers/merge_requests_controller_test.rb +1 -0
- data/test/controllers/merge_status_controller_test.rb +5 -4
- data/test/controllers/release_statuses_controller_test.rb +1 -0
- data/test/controllers/repositories_controller_test.rb +6 -5
- data/test/controllers/rollbacks_controller_test.rb +3 -2
- data/test/controllers/stacks_controller_test.rb +8 -6
- data/test/controllers/status_controller_test.rb +1 -0
- data/test/controllers/tasks_controller_test.rb +13 -5
- data/test/controllers/webhooks_controller_test.rb +10 -9
- data/test/dummy/config/application.rb +2 -1
- data/test/dummy/config/initializers/0_load_development_secrets.rb +2 -2
- data/test/dummy/config/secrets.development.json +3 -0
- data/test/dummy/config/secrets.test.json +21 -0
- data/test/dummy/db/schema.rb +33 -6
- data/test/fixtures/shipit/commits.yml +7 -7
- data/test/fixtures/shipit/stacks.yml +4 -10
- data/test/fixtures/shipit/tasks.yml +3 -3
- data/test/helpers/api_helper.rb +2 -3
- data/test/helpers/fixture_aliases_helper.rb +1 -0
- data/test/helpers/hooks_helper.rb +1 -0
- data/test/helpers/json_helper.rb +4 -3
- data/test/helpers/links_helper.rb +2 -1
- data/test/helpers/payloads_helper.rb +1 -0
- data/test/helpers/queries_helper.rb +4 -3
- data/test/jobs/cache_deploy_spec_job_test.rb +3 -2
- data/test/jobs/chunk_rollup_job_test.rb +3 -2
- data/test/jobs/deliver_hook_job_test.rb +1 -0
- data/test/jobs/destroy_repository_job_test.rb +1 -0
- data/test/jobs/destroy_stack_job_test.rb +12 -0
- data/test/jobs/emit_event_job_test.rb +1 -0
- data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
- data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
- data/test/jobs/github_sync_job_test.rb +22 -21
- data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
- data/test/jobs/perform_task_job_test.rb +3 -3
- data/test/jobs/process_merge_requests_job_test.rb +7 -6
- data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
- data/test/jobs/reap_dead_tasks_job_test.rb +1 -0
- data/test/jobs/refresh_github_user_job_test.rb +1 -0
- data/test/jobs/refresh_status_job_test.rb +1 -0
- data/test/jobs/shipit/background_job_test.rb +35 -0
- data/test/jobs/shipit/continuous_delivery_job_test.rb +31 -0
- data/test/jobs/unique_job_test.rb +3 -1
- data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
- data/test/middleware/same_site_cookie_middleware_test.rb +2 -2
- data/test/models/api_client_test.rb +1 -0
- data/test/models/commit_checks_test.rb +2 -1
- data/test/models/commit_deployment_status_test.rb +2 -2
- data/test/models/commit_deployment_test.rb +4 -3
- data/test/models/commits_test.rb +72 -70
- data/test/models/delivery_test.rb +3 -2
- data/test/models/deploy_spec_test.rb +113 -109
- data/test/models/deploy_stats_test.rb +1 -0
- data/test/models/deploys_test.rb +65 -56
- data/test/models/duration_test.rb +1 -1
- data/test/models/github_hook_test.rb +1 -0
- data/test/models/hook_test.rb +7 -4
- data/test/models/membership_test.rb +1 -0
- data/test/models/merge_request_test.rb +26 -20
- data/test/models/release_statuses_test.rb +2 -1
- data/test/models/rollbacks_test.rb +4 -3
- data/test/models/shipit/check_run_test.rb +16 -15
- data/test/models/shipit/continuous_delivery_schedule_test.rb +109 -0
- data/test/models/shipit/deploy_spec/file_system_test.rb +54 -10
- data/test/models/shipit/pull_request_test.rb +9 -9
- data/test/models/shipit/repository_test.rb +3 -2
- data/test/models/shipit/review_stack_provisioning_queue_test.rb +2 -2
- data/test/models/shipit/{stacks_test.rb → stack_test.rb} +48 -34
- data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +36 -34
- data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +28 -28
- data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +42 -42
- data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +33 -33
- data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +37 -37
- data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +1 -1
- data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +44 -42
- data/test/models/shipit/webhooks/handlers_test.rb +1 -0
- data/test/models/status/group_test.rb +3 -2
- data/test/models/status/missing_test.rb +1 -0
- data/test/models/status_test.rb +2 -1
- data/test/models/task_definitions_test.rb +7 -6
- data/test/models/tasks_test.rb +5 -4
- data/test/models/team_test.rb +5 -4
- data/test/models/undeployed_commits_test.rb +10 -9
- data/test/models/users_test.rb +29 -20
- data/test/test_command_integration.rb +1 -1
- data/test/test_helper.rb +12 -10
- data/test/unit/anonymous_user_serializer_test.rb +1 -0
- data/test/unit/command_test.rb +10 -1
- data/test/unit/commands_test.rb +1 -0
- data/test/unit/commit_serializer_test.rb +1 -0
- data/test/unit/csv_serializer_test.rb +3 -2
- data/test/unit/deploy_commands_test.rb +33 -23
- data/test/unit/deploy_serializer_test.rb +1 -0
- data/test/unit/environment_variables_test.rb +2 -1
- data/test/unit/github_app_test.rb +11 -10
- data/test/unit/github_apps_test.rb +19 -18
- data/test/unit/github_url_helper_test.rb +1 -0
- data/test/unit/line_buffer_test.rb +1 -1
- data/test/unit/rollback_commands_test.rb +2 -1
- data/test/unit/shipit_helper_test.rb +1 -0
- data/test/unit/shipit_test.rb +47 -1
- data/test/unit/user_serializer_test.rb +1 -0
- data/test/unit/variable_definition_test.rb +4 -3
- metadata +61 -47
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -21,7 +22,7 @@ module Shipit
|
|
21
22
|
post :create, params: {
|
22
23
|
stack_id: @stack.to_param,
|
23
24
|
deploy_id: @deploy.id,
|
24
|
-
status: 'foo'
|
25
|
+
status: 'foo'
|
25
26
|
}
|
26
27
|
end
|
27
28
|
|
@@ -34,7 +35,7 @@ module Shipit
|
|
34
35
|
post :create, params: {
|
35
36
|
stack_id: @stack.to_param,
|
36
37
|
deploy_id: @deploy.id,
|
37
|
-
status: 'success'
|
38
|
+
status: 'success'
|
38
39
|
}
|
39
40
|
assert_response :created
|
40
41
|
end
|
@@ -51,7 +52,7 @@ module Shipit
|
|
51
52
|
post :create, params: {
|
52
53
|
stack_id: @stack.to_param,
|
53
54
|
deploy_id: @deploy.id,
|
54
|
-
status: 'failure'
|
55
|
+
status: 'failure'
|
55
56
|
}
|
56
57
|
assert_response :created
|
57
58
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -38,14 +39,14 @@ module Shipit
|
|
38
39
|
request.headers['X-Shipit-User'] = @user.login
|
39
40
|
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
|
40
41
|
rollback = Rollback.last
|
41
|
-
rollback.user
|
42
|
+
assert_equal @user, rollback.user
|
42
43
|
end
|
43
44
|
|
44
45
|
test "#create normalises the claimed user" do
|
45
46
|
request.headers['X-Shipit-User'] = @user.login.swapcase
|
46
47
|
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
|
47
48
|
rollback = Rollback.last
|
48
|
-
rollback.user
|
49
|
+
assert_equal @user, rollback.user
|
49
50
|
end
|
50
51
|
|
51
52
|
test "#create renders a 422 if the sha isn't found" do
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -41,24 +42,24 @@ module Shipit
|
|
41
42
|
test "#create fails to create stack if it already exists" do
|
42
43
|
repository = shipit_repositories(:rails)
|
43
44
|
existing_stack = Stack.create!(
|
44
|
-
repository
|
45
|
+
repository:,
|
45
46
|
environment: 'staging',
|
46
|
-
branch: 'staging'
|
47
|
+
branch: 'staging'
|
47
48
|
)
|
48
49
|
|
49
50
|
assert_no_difference -> { Stack.count } do
|
50
51
|
post :create,
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
params: {
|
53
|
+
repo_name: existing_stack.repo_name,
|
54
|
+
repo_owner: existing_stack.repo_owner,
|
55
|
+
environment: existing_stack.environment,
|
56
|
+
branch: existing_stack.branch
|
57
|
+
}
|
57
58
|
end
|
58
59
|
|
59
60
|
assert_response :unprocessable_entity
|
60
61
|
assert_json 'errors', 'repository' => [
|
61
|
-
'cannot be used more than once with this environment. Check archived stacks.'
|
62
|
+
'cannot be used more than once with this environment. Check archived stacks.'
|
62
63
|
]
|
63
64
|
end
|
64
65
|
|
@@ -71,7 +72,7 @@ module Shipit
|
|
71
72
|
id: @stack.to_param,
|
72
73
|
merge_queue_enabled: false,
|
73
74
|
ignore_ci: true,
|
74
|
-
continuous_deployment: true
|
75
|
+
continuous_deployment: true
|
75
76
|
}
|
76
77
|
|
77
78
|
assert_response :ok
|
@@ -87,7 +88,7 @@ module Shipit
|
|
87
88
|
|
88
89
|
patch :update, params: {
|
89
90
|
id: @stack.to_param,
|
90
|
-
branch: 'test'
|
91
|
+
branch: 'test'
|
91
92
|
}
|
92
93
|
|
93
94
|
assert_response :ok
|
@@ -104,7 +105,7 @@ module Shipit
|
|
104
105
|
|
105
106
|
patch :update, params: {
|
106
107
|
id: @stack.to_param,
|
107
|
-
continuous_deployment: false
|
108
|
+
continuous_deployment: false
|
108
109
|
}
|
109
110
|
|
110
111
|
assert_response :ok
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -39,42 +40,42 @@ module Shipit
|
|
39
40
|
|
40
41
|
expected_env = {
|
41
42
|
"FOO" => "1",
|
42
|
-
"BAR" => "0"
|
43
|
+
"BAR" => "0"
|
43
44
|
}
|
44
45
|
assert_equal expected_env, Shipit::Task.last.env
|
45
46
|
end
|
46
47
|
|
47
48
|
test "#trigger refuses to trigger a task with tasks not whitelisted" do
|
48
49
|
env = { 'DANGEROUS_VARIABLE' => 'bar' }
|
49
|
-
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env:
|
50
|
+
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: }
|
50
51
|
assert_response :unprocessable_entity
|
51
52
|
assert_json 'message', 'Variables DANGEROUS_VARIABLE have not been whitelisted'
|
52
53
|
end
|
53
54
|
|
54
55
|
test "#trigger triggers a task with only whitelisted env variables" do
|
55
56
|
env = { 'FOO' => 'bar' }
|
56
|
-
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env:
|
57
|
+
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: }
|
57
58
|
assert_response :accepted
|
58
59
|
assert_json 'type', 'task'
|
59
60
|
assert_json 'status', 'pending'
|
60
61
|
|
61
62
|
expected_env = {
|
62
63
|
"FOO" => "bar",
|
63
|
-
"BAR" => "0"
|
64
|
+
"BAR" => "0"
|
64
65
|
}
|
65
66
|
assert_equal expected_env, Shipit::Task.last.env
|
66
67
|
end
|
67
68
|
|
68
69
|
test "#trigger triggers a task with explicitly passed and default variables" do
|
69
70
|
env = { 'WALRUS' => 'overridden value' }
|
70
|
-
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env:
|
71
|
+
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: }
|
71
72
|
assert_response :accepted
|
72
73
|
|
73
74
|
# FOO and BAR are variables with a default value
|
74
75
|
expected_env = {
|
75
76
|
"FOO" => "1",
|
76
77
|
"BAR" => "0",
|
77
|
-
"WALRUS" => "overridden value"
|
78
|
+
"WALRUS" => "overridden value"
|
78
79
|
}
|
79
80
|
assert_equal expected_env, Shipit::Task.last.env
|
80
81
|
end
|
@@ -23,7 +23,7 @@ module Shipit
|
|
23
23
|
assert_response :forbidden
|
24
24
|
assert_equal(
|
25
25
|
'You must be a member of cyclimse/cooks or shopify/developers to access this application.',
|
26
|
-
response.body
|
26
|
+
response.body
|
27
27
|
)
|
28
28
|
end
|
29
29
|
|
@@ -44,9 +44,9 @@ module Shipit
|
|
44
44
|
name: 'walrus_app',
|
45
45
|
permissions: [
|
46
46
|
'read:stack',
|
47
|
-
'lock:stack'
|
48
|
-
]
|
49
|
-
}
|
47
|
+
'lock:stack'
|
48
|
+
]
|
49
|
+
}
|
50
50
|
}
|
51
51
|
end
|
52
52
|
|
@@ -59,9 +59,9 @@ module Shipit
|
|
59
59
|
name: 'walrus_app',
|
60
60
|
permissions: [
|
61
61
|
'read:stack',
|
62
|
-
'lock:stack'
|
63
|
-
]
|
64
|
-
}
|
62
|
+
'lock:stack'
|
63
|
+
]
|
64
|
+
}
|
65
65
|
}
|
66
66
|
|
67
67
|
assert_equal shipit_users(:walrus).id, ApiClient.last.creator.id
|
@@ -84,15 +84,15 @@ module Shipit
|
|
84
84
|
test "#update updates an existing api_client" do
|
85
85
|
new_permissions = [
|
86
86
|
'read:stack',
|
87
|
-
'lock:stack'
|
87
|
+
'lock:stack'
|
88
88
|
]
|
89
89
|
|
90
90
|
assert_difference "ApiClient.count", 0 do
|
91
91
|
patch :update, params: {
|
92
92
|
id: @api_client.id,
|
93
93
|
api_client: {
|
94
|
-
permissions: new_permissions
|
95
|
-
}
|
94
|
+
permissions: new_permissions
|
95
|
+
}
|
96
96
|
}
|
97
97
|
end
|
98
98
|
@api_client.reload
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -14,10 +15,10 @@ module Shipit
|
|
14
15
|
refute_predicate(@commit, :locked?)
|
15
16
|
|
16
17
|
patch(:update, params: {
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
stack_id: @stack.to_param,
|
19
|
+
id: @commit.id,
|
20
|
+
commit: { locked: true }
|
21
|
+
})
|
21
22
|
|
22
23
|
assert_response(:ok)
|
23
24
|
@commit.reload
|
@@ -29,10 +30,10 @@ module Shipit
|
|
29
30
|
@commit.lock(@user)
|
30
31
|
|
31
32
|
patch(:update, params: {
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
stack_id: @stack.to_param,
|
34
|
+
id: @commit.id,
|
35
|
+
commit: { locked: false }
|
36
|
+
})
|
36
37
|
|
37
38
|
assert_response(:ok)
|
38
39
|
@commit.reload
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
module Shipit
|
6
|
+
class ContinuousDeliverySchedulesControllerTest < ActionController::TestCase
|
7
|
+
setup do
|
8
|
+
@routes = Shipit::Engine.routes
|
9
|
+
@stack = shipit_stacks(:shipit)
|
10
|
+
session[:user_id] = shipit_users(:walrus).id
|
11
|
+
end
|
12
|
+
|
13
|
+
def valid_params
|
14
|
+
Shipit::ContinuousDeliverySchedule::DAYS.each_with_object({}) do |day, hash|
|
15
|
+
hash[:"#{day}_enabled"] = "0"
|
16
|
+
hash[:"#{day}_start"] = "09:00"
|
17
|
+
hash[:"#{day}_end"] = "17:00"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
test "#show returns a 200 response" do
|
22
|
+
get(:show, params: { id: @stack.to_param })
|
23
|
+
|
24
|
+
assert(response.ok?)
|
25
|
+
end
|
26
|
+
|
27
|
+
test "#update" do
|
28
|
+
patch(:update, params: {
|
29
|
+
id: @stack.to_param,
|
30
|
+
continuous_delivery_schedule: {
|
31
|
+
**valid_params
|
32
|
+
}
|
33
|
+
})
|
34
|
+
|
35
|
+
assert_redirected_to(stack_continuous_delivery_schedule_path(@stack))
|
36
|
+
assert_equal("Successfully updated", flash[:success])
|
37
|
+
|
38
|
+
schedule = @stack.continuous_delivery_schedule
|
39
|
+
|
40
|
+
Shipit::ContinuousDeliverySchedule::DAYS.each do |day|
|
41
|
+
refute(schedule.read_attribute("#{day}_enabled"))
|
42
|
+
|
43
|
+
day_start = schedule.read_attribute("#{day}_start")
|
44
|
+
assert_equal("09:00:00 AM", day_start.strftime("%r"))
|
45
|
+
|
46
|
+
day_end = schedule.read_attribute("#{day}_end")
|
47
|
+
assert_equal("05:00:00 PM", day_end.strftime("%r"))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
test "#update renders validation errors" do
|
52
|
+
patch(:update, params: {
|
53
|
+
id: @stack.to_param,
|
54
|
+
continuous_delivery_schedule: {
|
55
|
+
# Make Sunday end before it starts
|
56
|
+
**valid_params.merge(sunday_end: "08:00")
|
57
|
+
}
|
58
|
+
})
|
59
|
+
|
60
|
+
assert_response(:unprocessable_entity)
|
61
|
+
assert_equal("Check form for errors", flash[:warning])
|
62
|
+
elements = assert_select(".validation-errors")
|
63
|
+
assert_includes(elements.sole.inner_text, "Sunday end must be after start (09:00 AM)")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
5
6
|
class DeploysControllerTest < ActionController::TestCase
|
6
7
|
setup do
|
7
|
-
Deploy.where(status: %w
|
8
|
+
Deploy.where(status: %w[running pending]).update_all(status: 'success')
|
8
9
|
@stack = shipit_stacks(:shipit)
|
9
10
|
@deploy = shipit_deploys(:shipit)
|
10
11
|
@commit = shipit_commits(:second)
|
@@ -31,6 +32,7 @@ module Shipit
|
|
31
32
|
test ":new works for not yet deployed stacks" do
|
32
33
|
@stack = shipit_stacks(:undeployed_stack)
|
33
34
|
get :new, params: { stack_id: @stack.to_param, sha: @stack.commits.last.sha }
|
35
|
+
assert_response :success
|
34
36
|
end
|
35
37
|
|
36
38
|
test ":new shows a warning if a deploy is already running" do
|
@@ -62,7 +64,7 @@ module Shipit
|
|
62
64
|
|
63
65
|
test ":create can receive an :env hash" do
|
64
66
|
env = { 'SAFETY_DISABLED' => '1' }
|
65
|
-
post :create, params: { stack_id: @stack.to_param, deploy: { until_commit_id: @commit.id, env:
|
67
|
+
post :create, params: { stack_id: @stack.to_param, deploy: { until_commit_id: @commit.id, env: } }
|
66
68
|
new_deploy = Deploy.last
|
67
69
|
assert_equal env, new_deploy.env
|
68
70
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -6,7 +7,7 @@ module Shipit
|
|
6
7
|
test ":callback can sign in to github" do
|
7
8
|
auth = OmniAuth::AuthHash.new(
|
8
9
|
credentials: OmniAuth::AuthHash.new(
|
9
|
-
token: 's3cr3t'
|
10
|
+
token: 's3cr3t'
|
10
11
|
),
|
11
12
|
extra: OmniAuth::AuthHash.new(
|
12
13
|
raw_info: OmniAuth::AuthHash.new(
|
@@ -15,9 +16,9 @@ module Shipit
|
|
15
16
|
email: 'shipit-user@example.com',
|
16
17
|
login: 'shipit-user',
|
17
18
|
avatar_url: 'https://example.com',
|
18
|
-
api_url: 'https://github.com/api/v3/users/shipit-user'
|
19
|
-
)
|
20
|
-
)
|
19
|
+
api_url: 'https://github.com/api/v3/users/shipit-user'
|
20
|
+
)
|
21
|
+
)
|
21
22
|
)
|
22
23
|
@request.env['omniauth.auth'] = auth
|
23
24
|
|
@@ -28,6 +29,7 @@ module Shipit
|
|
28
29
|
user = User.find_by(login: 'shipit-user')
|
29
30
|
assert_equal 's3cr3t', user.github_access_token
|
30
31
|
assert_equal 44, user.github_id
|
32
|
+
assert session[:authenticated], "Expected session[:authenticated] to be true"
|
31
33
|
end
|
32
34
|
end
|
33
35
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -38,14 +39,14 @@ module Shipit
|
|
38
39
|
test "GET show prefers stacks with merge_queue_enabled" do
|
39
40
|
existing = shipit_stacks(:shipit)
|
40
41
|
Shipit::Stack.where(
|
41
|
-
repository: existing.repository
|
42
|
+
repository: existing.repository
|
42
43
|
).update_all(merge_queue_enabled: false)
|
43
44
|
|
44
45
|
Shipit::Stack.create(
|
45
46
|
repository: existing.repository,
|
46
47
|
environment: 'foo',
|
47
48
|
branch: existing.branch,
|
48
|
-
merge_queue_enabled: true
|
49
|
+
merge_queue_enabled: true
|
49
50
|
)
|
50
51
|
|
51
52
|
get :show, params: { referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master' }
|
@@ -56,7 +57,7 @@ module Shipit
|
|
56
57
|
test "GET show prefers locked stacks above all else" do
|
57
58
|
existing = shipit_stacks(:shipit)
|
58
59
|
Shipit::Stack.where(
|
59
|
-
repository: existing.repository
|
60
|
+
repository: existing.repository
|
60
61
|
).update_all(lock_reason: 'testing', merge_queue_enabled: false, locked_since: Time.now.utc)
|
61
62
|
|
62
63
|
# Shipit would otherwise prefer this, because it has the merge queue enabled
|
@@ -64,7 +65,7 @@ module Shipit
|
|
64
65
|
repository: existing.repository,
|
65
66
|
environment: 'foo',
|
66
67
|
branch: existing.branch,
|
67
|
-
merge_queue_enabled: true
|
68
|
+
merge_queue_enabled: true
|
68
69
|
)
|
69
70
|
|
70
71
|
get :show, params: { referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master' }
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -22,7 +23,7 @@ module Shipit
|
|
22
23
|
assert_response :forbidden
|
23
24
|
assert_equal(
|
24
25
|
'You must be a member of cyclimse/cooks or shopify/developers to access this application.',
|
25
|
-
response.body
|
26
|
+
response.body
|
26
27
|
)
|
27
28
|
end
|
28
29
|
|
@@ -36,8 +37,8 @@ module Shipit
|
|
36
37
|
post :create, params: {
|
37
38
|
repository: {
|
38
39
|
name: 'valid',
|
39
|
-
owner: 'repository'
|
40
|
-
}
|
40
|
+
owner: 'repository'
|
41
|
+
}
|
41
42
|
}
|
42
43
|
end
|
43
44
|
assert_redirected_to repository_path(Repository.last)
|
@@ -48,8 +49,8 @@ module Shipit
|
|
48
49
|
post :create, params: {
|
49
50
|
repository: {
|
50
51
|
owner: 'some',
|
51
|
-
name: 'owner/path'
|
52
|
-
}
|
52
|
+
name: 'owner/path'
|
53
|
+
}
|
53
54
|
}
|
54
55
|
end
|
55
56
|
assert_response :success
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
5
6
|
class RollbacksControllerTest < ActionController::TestCase
|
6
7
|
setup do
|
7
|
-
Deploy.where(status: %w
|
8
|
+
Deploy.where(status: %w[running pending]).update_all(status: 'success')
|
8
9
|
@stack = shipit_stacks(:shipit)
|
9
10
|
@deploy = shipit_deploys(:shipit)
|
10
11
|
session[:user_id] = shipit_users(:walrus).id
|
@@ -18,7 +19,7 @@ module Shipit
|
|
18
19
|
|
19
20
|
test ":create can receive an :env hash" do
|
20
21
|
env = { 'SAFETY_DISABLED' => '1' }
|
21
|
-
post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id, env:
|
22
|
+
post :create, params: { stack_id: @stack.to_param, rollback: { parent_id: @deploy.id, env: } }
|
22
23
|
new_rollback = Rollback.last
|
23
24
|
assert_equal env, new_rollback.env
|
24
25
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -10,7 +11,7 @@ module Shipit
|
|
10
11
|
end
|
11
12
|
|
12
13
|
test "validates that Shipit.github is present" do
|
13
|
-
Rails.application.
|
14
|
+
Rails.application.credentials.stubs(:github).returns(nil)
|
14
15
|
get :index
|
15
16
|
assert_select "#github_app .missing"
|
16
17
|
assert_select ".missing", count: 1
|
@@ -54,7 +55,7 @@ module Shipit
|
|
54
55
|
assert_response :forbidden
|
55
56
|
assert_equal(
|
56
57
|
'You must be a member of cyclimse/cooks or shopify/developers to access this application.',
|
57
|
-
response.body
|
58
|
+
response.body
|
58
59
|
)
|
59
60
|
end
|
60
61
|
|
@@ -98,6 +99,7 @@ module Shipit
|
|
98
99
|
test "#show handles locked stacks without a lock_author" do
|
99
100
|
@stack.update!(lock_reason: "I am a lock with no author")
|
100
101
|
get :show, params: { id: @stack.to_param }
|
102
|
+
assert_response :ok
|
101
103
|
end
|
102
104
|
|
103
105
|
test "#show auto-links URLs in lock reason" do
|
@@ -114,8 +116,8 @@ module Shipit
|
|
114
116
|
repo_name: 'rails',
|
115
117
|
repo_owner: 'rails',
|
116
118
|
environment: 'staging',
|
117
|
-
branch: 'staging'
|
118
|
-
}
|
119
|
+
branch: 'staging'
|
120
|
+
}
|
119
121
|
}
|
120
122
|
end
|
121
123
|
|
@@ -240,8 +242,8 @@ module Shipit
|
|
240
242
|
repo_owner: 'rails',
|
241
243
|
environment: 'staging',
|
242
244
|
branch: 'staging',
|
243
|
-
deploy_url: 'Javascript:alert(1);'
|
244
|
-
}
|
245
|
+
deploy_url: 'Javascript:alert(1);'
|
246
|
+
}
|
245
247
|
}
|
246
248
|
assert_response :success
|
247
249
|
assert_equal 'Deploy url is invalid', flash[:warning]
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'test_helper'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -11,9 +12,16 @@ module Shipit
|
|
11
12
|
session[:user_id] = shipit_users(:walrus).id
|
12
13
|
end
|
13
14
|
|
14
|
-
test "tasks defined in the shipit.yml can be displayed" do
|
15
|
+
test "tasks defined in the shipit.yml can be displayed with default variable values" do
|
15
16
|
get :new, params: { stack_id: @stack, definition_id: @definition.id }
|
16
17
|
assert_response :ok
|
18
|
+
assert_select 'input[name="task[env][FOO]"][value="1"]'
|
19
|
+
end
|
20
|
+
|
21
|
+
test "it is possible to provide a default value override for a task" do
|
22
|
+
get :new, params: { stack_id: @stack, definition_id: @definition.id, FOO: '42' }
|
23
|
+
assert_response :ok
|
24
|
+
assert_select 'input[name="task[env][FOO]"][value="42"]'
|
17
25
|
end
|
18
26
|
|
19
27
|
test "tasks defined in the shipit.yml can't be triggered if the stack is being deployed" do
|
@@ -47,7 +55,7 @@ module Shipit
|
|
47
55
|
test "tasks with variables defined in the shipit.yml can be triggered with their variables set" do
|
48
56
|
env = { "FOO" => "0" }
|
49
57
|
|
50
|
-
post :create, params: { stack_id: @stack, definition_id: @definition.id, task: { env:
|
58
|
+
post :create, params: { stack_id: @stack, definition_id: @definition.id, task: { env: }, force: 'true' }
|
51
59
|
|
52
60
|
assert_redirected_to stack_tasks_path(@stack, Task.last)
|
53
61
|
end
|
@@ -106,7 +114,7 @@ module Shipit
|
|
106
114
|
|
107
115
|
get :tail, params: { stack_id: @stack.to_param, id: @task.id }, format: :json
|
108
116
|
assert_response :success
|
109
|
-
assert_json_keys %w
|
117
|
+
assert_json_keys %w[url status output]
|
110
118
|
assert_json 'status', @task.status
|
111
119
|
assert_json 'output', @task.chunk_output
|
112
120
|
assert_json 'url', "/shopify/shipit-engine/production/tasks/#{@task.id}/tail?last_byte=#{last_chunk}"
|
@@ -118,7 +126,7 @@ module Shipit
|
|
118
126
|
|
119
127
|
get :tail, params: { stack_id: @stack.to_param, id: @task.id, last_byte: "50" }, format: :json
|
120
128
|
assert_response :success
|
121
|
-
assert_json_keys %w
|
129
|
+
assert_json_keys %w[url status output]
|
122
130
|
end
|
123
131
|
|
124
132
|
test ":tail doesn't returns the next url if the task is finished" do
|
@@ -134,7 +142,7 @@ module Shipit
|
|
134
142
|
|
135
143
|
get :tail, params: { stack_id: @stack.to_param, id: @task.id }, format: :json
|
136
144
|
assert_response :success
|
137
|
-
assert_json_keys %w
|
145
|
+
assert_json_keys %w[status output rollback_url]
|
138
146
|
end
|
139
147
|
|
140
148
|
test ":lookup returns stack task url if the task is an instance of Task" do
|