shipit-engine 0.28.0 → 0.32.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/stylesheets/_pages/_stacks.scss +76 -3
- data/app/assets/stylesheets/_structure/_main.scss +2 -1
- data/app/assets/stylesheets/merge_status.scss +0 -3
- 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/outputs_controller.rb +2 -1
- data/app/controllers/shipit/api/pull_requests_controller.rb +7 -6
- 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 +37 -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 +3 -2
- data/app/controllers/shipit/github_authentication_controller.rb +4 -3
- data/app/controllers/shipit/merge_status_controller.rb +19 -14
- data/app/controllers/shipit/pull_requests_controller.rb +3 -2
- data/app/controllers/shipit/release_statuses_controller.rb +3 -2
- 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 +6 -5
- data/app/controllers/shipit/webhooks_controller.rb +5 -132
- data/app/helpers/shipit/chunks_helper.rb +1 -0
- data/app/helpers/shipit/deploys_helper.rb +4 -3
- data/app/helpers/shipit/github_url_helper.rb +1 -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 +5 -0
- data/app/helpers/shipit/tasks_helper.rb +1 -0
- data/app/jobs/shipit/background_job.rb +4 -0
- data/app/jobs/shipit/background_job/unique.rb +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 +6 -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_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 +2 -1
- data/app/jobs/shipit/github_sync_job.rb +3 -2
- data/app/jobs/shipit/{mark_deploy_healty_job.rb → mark_deploy_healthy_job.rb} +1 -0
- data/app/jobs/shipit/merge_pull_requests_job.rb +1 -0
- data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
- data/app/jobs/shipit/perform_task_job.rb +14 -5
- 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_pull_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 -3
- data/app/models/concerns/shipit/deferred_touch.rb +4 -3
- data/app/models/shipit/anonymous_user.rb +5 -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 +4 -3
- data/app/models/shipit/command_line_user.rb +1 -0
- data/app/models/shipit/commit.rb +31 -12
- data/app/models/shipit/commit_checks.rb +1 -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 +40 -10
- data/app/models/shipit/deploy_spec.rb +22 -3
- 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 +10 -3
- 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 +3 -2
- data/app/models/shipit/hook.rb +6 -5
- data/app/models/shipit/membership.rb +3 -2
- data/app/models/shipit/output_chunk.rb +7 -2
- data/app/models/shipit/pull_request.rb +13 -7
- data/app/models/shipit/record.rb +18 -0
- data/app/models/shipit/release_status.rb +3 -2
- data/app/models/shipit/repository.rb +43 -0
- data/app/models/shipit/rollback.rb +1 -0
- data/app/models/shipit/stack.rb +109 -50
- 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 +64 -9
- data/app/models/shipit/task_definition.rb +1 -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 +29 -5
- data/app/models/shipit/variable_definition.rb +1 -0
- data/app/models/shipit/webhooks.rb +33 -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/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 +2 -1
- data/app/serializers/shipit/hook_serializer.rb +1 -0
- data/app/serializers/shipit/pull_request_serializer.rb +1 -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 +7 -1
- data/app/serializers/shipit/tail_task_serializer.rb +1 -0
- 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 +6 -4
- 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/new.html.erb +17 -12
- data/app/views/shipit/deploys/show.html.erb +2 -2
- data/app/views/shipit/merge_status/logged_out.erb +1 -1
- data/app/views/shipit/stacks/_header.html.erb +27 -12
- data/app/views/shipit/stacks/_links.html.erb +1 -0
- data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
- data/app/views/shipit/stacks/index.html.erb +7 -2
- data/app/views/shipit/stacks/settings.html.erb +19 -0
- data/app/views/shipit/stacks/statistics.html.erb +82 -0
- 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 +14 -2
- 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/lib/shipit.rb +18 -20
- 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 +60 -6
- data/lib/shipit/github_http_cache_middleware.rb +57 -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/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 +6 -3
- data/lib/shipit/stat.rb +1 -0
- data/lib/shipit/task_commands.rb +22 -14
- data/lib/shipit/version.rb +2 -1
- data/lib/snippets/release-gem +5 -1
- data/lib/tasks/cron.rake +2 -0
- 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/outputs_controller_test.rb +3 -2
- data/test/controllers/api/pull_requests_controller_test.rb +8 -7
- 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 +44 -15
- 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_status_controller_test.rb +27 -9
- data/test/controllers/pull_requests_controller_test.rb +4 -3
- data/test/controllers/release_statuses_controller_test.rb +3 -2
- data/test/controllers/rollbacks_controller_test.rb +9 -8
- data/test/controllers/stacks_controller_test.rb +64 -15
- data/test/controllers/status_controller_test.rb +1 -0
- data/test/controllers/tasks_controller_test.rb +20 -19
- data/test/controllers/webhooks_controller_test.rb +36 -9
- data/test/dummy/config/application.rb +1 -1
- data/test/dummy/config/environments/development.rb +24 -4
- data/test/dummy/config/environments/test.rb +2 -0
- data/test/dummy/db/schema.rb +25 -11
- data/test/dummy/db/seeds.rb +34 -17
- 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 +38 -0
- data/test/fixtures/shipit/repositories.yml +27 -0
- data/test/fixtures/shipit/stacks.yml +190 -30
- data/test/fixtures/shipit/tasks.yml +66 -3
- 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 +1 -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 +1 -0
- data/test/jobs/deliver_hook_job_test.rb +2 -1
- 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/merge_pull_requests_job_test.rb +5 -4
- data/test/jobs/perform_task_job_test.rb +4 -3
- 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 +13 -11
- 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 +99 -7
- data/test/models/delivery_test.rb +3 -2
- data/test/models/deploy_spec_test.rb +47 -42
- data/test/models/deploy_stats_test.rb +113 -0
- data/test/models/deploys_test.rb +60 -13
- 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/output_chunk_test.rb +1 -0
- data/test/models/pull_request_test.rb +18 -11
- 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/repository_test.rb +77 -0
- data/test/models/shipit/wehbooks/handlers_test.rb +27 -0
- data/test/models/stacks_test.rb +110 -56
- 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 +18 -1
- data/test/models/team_test.rb +4 -2
- data/test/models/undeployed_commits_test.rb +14 -0
- data/test/models/users_test.rb +109 -1
- data/test/test_command_integration.rb +3 -2
- data/test/test_helper.rb +38 -34
- data/test/unit/anonymous_user_serializer_test.rb +14 -0
- data/test/unit/command_test.rb +12 -7
- 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 +165 -0
- data/test/unit/github_url_helper_test.rb +1 -0
- data/test/unit/rollback_commands_test.rb +2 -1
- data/test/unit/shipit_helper_test.rb +17 -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 +215 -157
- data/lib/shipit/strip_cache_control.rb +0 -40
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'test_helper'
|
2
3
|
|
3
4
|
module Shipit
|
@@ -9,7 +10,7 @@ module Shipit
|
|
9
10
|
end
|
10
11
|
|
11
12
|
test "#create sets a lock" do
|
12
|
-
post :create, params: {stack_id: @stack.to_param, reason: 'Just for fun!'}
|
13
|
+
post :create, params: { stack_id: @stack.to_param, reason: 'Just for fun!' }
|
13
14
|
assert_response :ok
|
14
15
|
assert_json 'is_locked', true
|
15
16
|
assert_json 'lock_reason', 'Just for fun!'
|
@@ -18,12 +19,12 @@ module Shipit
|
|
18
19
|
|
19
20
|
test "#create fails if already locked" do
|
20
21
|
@stack.update!(lock_reason: "Don't forget me")
|
21
|
-
post :create, params: {stack_id: @stack.to_param, reason: 'Just for fun!'}
|
22
|
+
post :create, params: { stack_id: @stack.to_param, reason: 'Just for fun!' }
|
22
23
|
assert_response :conflict
|
23
24
|
end
|
24
25
|
|
25
26
|
test "#update sets a lock" do
|
26
|
-
put :update, params: {stack_id: @stack.to_param, reason: 'Just for fun!'}
|
27
|
+
put :update, params: { stack_id: @stack.to_param, reason: 'Just for fun!' }
|
27
28
|
assert_response :ok
|
28
29
|
assert_json 'is_locked', true
|
29
30
|
assert_json 'lock_reason', 'Just for fun!'
|
@@ -31,7 +32,7 @@ module Shipit
|
|
31
32
|
|
32
33
|
test "#update can override a previous lock" do
|
33
34
|
@stack.update!(lock_reason: 'Meh...')
|
34
|
-
put :update, params: {stack_id: @stack.to_param, reason: 'Just for fun!'}
|
35
|
+
put :update, params: { stack_id: @stack.to_param, reason: 'Just for fun!' }
|
35
36
|
assert_response :ok
|
36
37
|
assert_json 'is_locked', true
|
37
38
|
assert_json 'lock_reason', 'Just for fun!'
|
@@ -40,14 +41,14 @@ module Shipit
|
|
40
41
|
test "#update does not override previous locked_since" do
|
41
42
|
since = Time.current.round
|
42
43
|
@stack.update!(lock_reason: 'Meh...', locked_since: since)
|
43
|
-
put :update, params: {stack_id: @stack.to_param, reason: 'Just for fun!'}
|
44
|
+
put :update, params: { stack_id: @stack.to_param, reason: 'Just for fun!' }
|
44
45
|
assert_response :ok
|
45
46
|
assert_json 'locked_since', since.utc.iso8601(3)
|
46
47
|
end
|
47
48
|
|
48
49
|
test "#destroy clears the lock" do
|
49
50
|
@stack.update!(lock_reason: 'Meh...', locked_since: Time.current)
|
50
|
-
delete :destroy, params: {stack_id: @stack.to_param}
|
51
|
+
delete :destroy, params: { stack_id: @stack.to_param }
|
51
52
|
assert_response :ok
|
52
53
|
assert_json 'is_locked', false
|
53
54
|
assert_json { |json| assert_nil json['locked_since'] }
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'test_helper'
|
2
3
|
|
3
4
|
module Shipit
|
@@ -11,9 +12,9 @@ module Shipit
|
|
11
12
|
test "#show returns the task output as plain text" do
|
12
13
|
task = @stack.tasks.last
|
13
14
|
|
14
|
-
get :show, params: {stack_id: @stack.to_param, task_id: task.id}
|
15
|
+
get :show, params: { stack_id: @stack.to_param, task_id: task.id }
|
15
16
|
assert_response :ok
|
16
|
-
assert_equal 'text/plain', response.
|
17
|
+
assert_equal 'text/plain', response.media_type
|
17
18
|
assert_equal task.chunk_output, response.body
|
18
19
|
end
|
19
20
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'test_helper'
|
2
3
|
|
3
4
|
module Shipit
|
@@ -12,46 +13,46 @@ module Shipit
|
|
12
13
|
test "#index returns a list of pull requests" do
|
13
14
|
pull_request = @stack.pull_requests.last
|
14
15
|
|
15
|
-
get :index, params: {stack_id: @stack.to_param}
|
16
|
+
get :index, params: { stack_id: @stack.to_param }
|
16
17
|
assert_response :ok
|
17
18
|
assert_json '0.id', pull_request.id
|
18
19
|
end
|
19
20
|
|
20
21
|
test "#show returns a single pull requests" do
|
21
|
-
get :show, params: {stack_id: @stack.to_param, id: @pull_request.number.to_s}
|
22
|
+
get :show, params: { stack_id: @stack.to_param, id: @pull_request.number.to_s }
|
22
23
|
assert_response :ok
|
23
24
|
assert_json 'id', @pull_request.id
|
24
25
|
end
|
25
26
|
|
26
27
|
test "#update responds with Accepted if the pull request was queued" do
|
27
28
|
assert_enqueued_with(job: RefreshPullRequestJob) do
|
28
|
-
put :update, params: {stack_id: @stack.to_param, id: '64'}
|
29
|
+
put :update, params: { stack_id: @stack.to_param, id: '64' }
|
29
30
|
end
|
30
31
|
assert_response :accepted
|
31
32
|
end
|
32
33
|
|
33
34
|
test "#update responds with Accepted if the pull request was already queued" do
|
34
35
|
assert_enqueued_with(job: RefreshPullRequestJob) do
|
35
|
-
put :update, params: {stack_id: @stack.to_param, id: '65'}
|
36
|
+
put :update, params: { stack_id: @stack.to_param, id: '65' }
|
36
37
|
end
|
37
38
|
assert_response :accepted
|
38
39
|
end
|
39
40
|
|
40
41
|
test "#update responds with method not allowed if the pull request was already merged" do
|
41
42
|
@pull_request.complete!
|
42
|
-
put :update, params: {stack_id: @stack.to_param, id: @pull_request.number.to_s}
|
43
|
+
put :update, params: { stack_id: @stack.to_param, id: @pull_request.number.to_s }
|
43
44
|
assert_response :method_not_allowed
|
44
45
|
assert_json 'message', 'This pull request was already merged.'
|
45
46
|
end
|
46
47
|
|
47
48
|
test "#destroy cancels the merge if the pull request was waiting" do
|
48
|
-
delete :destroy, params: {stack_id: @stack.to_param, id: @pull_request.number.to_s}
|
49
|
+
delete :destroy, params: { stack_id: @stack.to_param, id: @pull_request.number.to_s }
|
49
50
|
assert_response :no_content
|
50
51
|
assert_predicate @pull_request.reload, :canceled?
|
51
52
|
end
|
52
53
|
|
53
54
|
test "#destroy silently fail if the pull request was unknown" do
|
54
|
-
delete :destroy, params: {stack_id: @stack.to_param, id: '83453489'}
|
55
|
+
delete :destroy, params: { stack_id: @stack.to_param, id: '83453489' }
|
55
56
|
assert_response :no_content
|
56
57
|
end
|
57
58
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'test_helper'
|
2
3
|
|
3
4
|
module Shipit
|
@@ -10,7 +11,7 @@ module Shipit
|
|
10
11
|
end
|
11
12
|
|
12
13
|
test "#create renders a 422 if status is not found" do
|
13
|
-
post :create, params: {stack_id: @stack.to_param, deploy_id: @deploy.id}
|
14
|
+
post :create, params: { stack_id: @stack.to_param, deploy_id: @deploy.id }
|
14
15
|
assert_response :unprocessable_entity
|
15
16
|
assert_json 'errors', 'status' => ['is required', 'is not included in the list']
|
16
17
|
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
module Shipit
|
5
|
+
module Api
|
6
|
+
class RollbacksControllerTest < ActionController::TestCase
|
7
|
+
setup do
|
8
|
+
authenticate!
|
9
|
+
@user = shipit_users(:walrus)
|
10
|
+
@stack = shipit_stacks(:shipit)
|
11
|
+
@commit = shipit_commits(:fourth)
|
12
|
+
end
|
13
|
+
|
14
|
+
test "#create triggers a new rollback for the stack" do
|
15
|
+
assert_difference -> { @stack.deploys.count }, 1 do
|
16
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
|
17
|
+
end
|
18
|
+
assert_response :accepted
|
19
|
+
assert_json 'status', 'pending'
|
20
|
+
end
|
21
|
+
|
22
|
+
test "#create triggers a new rollback for whitelisted variables" do
|
23
|
+
correct_env = { 'SAFETY_DISABLED' => 1 }
|
24
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha, env: correct_env }
|
25
|
+
assert_response :accepted
|
26
|
+
assert_json 'type', 'rollback'
|
27
|
+
assert_json 'status', 'pending'
|
28
|
+
end
|
29
|
+
|
30
|
+
test "#create refuses to trigger a new rollback with incorrect variables" do
|
31
|
+
incorrect_env = { 'DANGEROUS_VARIABLE' => 1 }
|
32
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha, env: incorrect_env }
|
33
|
+
assert_response :unprocessable_entity
|
34
|
+
assert_json 'message', 'Variables DANGEROUS_VARIABLE have not been whitelisted'
|
35
|
+
end
|
36
|
+
|
37
|
+
test "#create use the claimed user as author" do
|
38
|
+
request.headers['X-Shipit-User'] = @user.login
|
39
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
|
40
|
+
rollback = Rollback.last
|
41
|
+
rollback.user == @user
|
42
|
+
end
|
43
|
+
|
44
|
+
test "#create normalises the claimed user" do
|
45
|
+
request.headers['X-Shipit-User'] = @user.login.swapcase
|
46
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
|
47
|
+
rollback = Rollback.last
|
48
|
+
rollback.user == @user
|
49
|
+
end
|
50
|
+
|
51
|
+
test "#create renders a 422 if the sha isn't found" do
|
52
|
+
post :create, params: { stack_id: @stack.to_param, sha: '123443543545' }
|
53
|
+
assert_response :unprocessable_entity
|
54
|
+
assert_json 'errors', 'sha' => ['Unknown revision']
|
55
|
+
end
|
56
|
+
|
57
|
+
test "#create renders a 422 if the sha format is invalid" do
|
58
|
+
post :create, params: { stack_id: @stack.to_param, sha: '1' }
|
59
|
+
assert_response :unprocessable_entity
|
60
|
+
assert_json 'errors', 'sha' => ['is too short (minimum is 6 characters)']
|
61
|
+
end
|
62
|
+
|
63
|
+
test "#create renders a 422 if deploy attached to sha isn't found" do
|
64
|
+
post :create, params: { stack_id: @stack.to_param, sha: shipit_commits(:fifth).sha }
|
65
|
+
assert_response :unprocessable_entity
|
66
|
+
assert_json 'errors', 'sha' => ['Cant find associated deploy']
|
67
|
+
end
|
68
|
+
|
69
|
+
test "#create refuses to rollback on locked stacks" do
|
70
|
+
@stack.update!(lock_reason: 'Something broken')
|
71
|
+
|
72
|
+
assert_no_difference -> { @stack.deploys.count } do
|
73
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
|
74
|
+
end
|
75
|
+
assert_response :unprocessable_entity
|
76
|
+
assert_json 'errors.force', ["Can't rollback a locked stack"]
|
77
|
+
end
|
78
|
+
|
79
|
+
test "#create rollbacks on locked stack if force mode is enabled" do
|
80
|
+
@stack.update!(lock_reason: 'Something broken')
|
81
|
+
|
82
|
+
assert_difference -> { @stack.deploys.count }, 1 do
|
83
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha, force: 'true' }
|
84
|
+
end
|
85
|
+
assert_response :accepted
|
86
|
+
assert_json 'status', 'pending'
|
87
|
+
end
|
88
|
+
|
89
|
+
test "#create refuses to rollback if active task" do
|
90
|
+
@stack.deploys.last.update!(status: 'running')
|
91
|
+
|
92
|
+
assert_no_difference -> { @stack.deploys.count } do
|
93
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
|
94
|
+
end
|
95
|
+
assert_response :unprocessable_entity
|
96
|
+
assert_json 'errors.force', ["Can't rollback, deploy in progress"]
|
97
|
+
end
|
98
|
+
|
99
|
+
test "#create aborts active task and sets rollback to" do
|
100
|
+
last_deploy = @stack.deploys.last
|
101
|
+
last_deploy.update!(status: 'running')
|
102
|
+
|
103
|
+
assert_no_difference -> { @stack.deploys.count } do
|
104
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha, force: 'true' }
|
105
|
+
end
|
106
|
+
last_deploy.reload
|
107
|
+
assert_response :accepted
|
108
|
+
refute_predicate last_deploy, :active?
|
109
|
+
assert_json 'rollback_once_aborted_to.until_commit_id', @commit.id
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'test_helper'
|
2
3
|
|
3
4
|
module Shipit
|
@@ -13,7 +14,7 @@ module Shipit
|
|
13
14
|
@client.save!
|
14
15
|
|
15
16
|
assert_no_difference 'Stack.count' do
|
16
|
-
post :create, params: {repo_name: 'rails', repo_owner: 'rails', environment: 'staging', branch: 'staging'}
|
17
|
+
post :create, params: { repo_name: 'rails', repo_owner: 'rails', environment: 'staging', branch: 'staging' }
|
17
18
|
end
|
18
19
|
|
19
20
|
assert_response :forbidden
|
@@ -22,15 +23,15 @@ module Shipit
|
|
22
23
|
|
23
24
|
test "#create fails with invalid stack" do
|
24
25
|
assert_no_difference "Stack.count" do
|
25
|
-
post :create, params: {repo_owner: 'some', repo_name: 'owner/path'}
|
26
|
+
post :create, params: { repo_owner: 'some', repo_name: 'owner/path' }
|
26
27
|
end
|
27
28
|
assert_response :unprocessable_entity
|
28
|
-
assert_json 'errors', '
|
29
|
+
assert_json 'errors', 'repository' => ['is invalid']
|
29
30
|
end
|
30
31
|
|
31
32
|
test "#create creates a stack and renders it back" do
|
32
33
|
assert_difference -> { Stack.count } do
|
33
|
-
post :create, params: {repo_name: 'rails', repo_owner: 'rails', environment: 'staging', branch: 'staging'}
|
34
|
+
post :create, params: { repo_name: 'rails', repo_owner: 'rails', environment: 'staging', branch: 'staging' }
|
34
35
|
end
|
35
36
|
|
36
37
|
assert_response :ok
|
@@ -38,19 +39,47 @@ module Shipit
|
|
38
39
|
end
|
39
40
|
|
40
41
|
test "#create fails to create stack if it already exists" do
|
41
|
-
|
42
|
-
|
43
|
-
|
42
|
+
repository = shipit_repositories(:rails)
|
43
|
+
existing_stack = Stack.create!(
|
44
|
+
repository: repository,
|
44
45
|
environment: 'staging',
|
45
46
|
branch: 'staging',
|
46
47
|
)
|
47
48
|
|
48
49
|
assert_no_difference -> { Stack.count } do
|
49
|
-
post :create,
|
50
|
+
post :create,
|
51
|
+
params: {
|
52
|
+
repo_name: existing_stack.repo_name,
|
53
|
+
repo_owner: existing_stack.repo_owner,
|
54
|
+
environment: existing_stack.environment,
|
55
|
+
branch: existing_stack.branch,
|
56
|
+
}
|
50
57
|
end
|
51
58
|
|
52
59
|
assert_response :unprocessable_entity
|
53
|
-
assert_json 'errors', '
|
60
|
+
assert_json 'errors', 'repository' => [
|
61
|
+
'cannot be used more than once with this environment. Check archived stacks.',
|
62
|
+
]
|
63
|
+
end
|
64
|
+
|
65
|
+
test "#update updates a stack and renders it back" do
|
66
|
+
assert_equal true, @stack.merge_queue_enabled
|
67
|
+
assert_equal false, @stack.ignore_ci
|
68
|
+
assert_equal false, @stack.continuous_deployment
|
69
|
+
|
70
|
+
patch :update, params: {
|
71
|
+
id: @stack.to_param,
|
72
|
+
merge_queue_enabled: false,
|
73
|
+
ignore_ci: true,
|
74
|
+
continuous_deployment: true,
|
75
|
+
}
|
76
|
+
|
77
|
+
assert_response :ok
|
78
|
+
@stack.reload
|
79
|
+
|
80
|
+
assert_equal false, @stack.merge_queue_enabled
|
81
|
+
assert_equal true, @stack.ignore_ci
|
82
|
+
assert_equal true, @stack.continuous_deployment
|
54
83
|
end
|
55
84
|
|
56
85
|
test "#index returns a list of stacks" do
|
@@ -65,7 +94,7 @@ module Shipit
|
|
65
94
|
end
|
66
95
|
|
67
96
|
test "#index is paginable" do
|
68
|
-
get :index, params: {page_size: 1}
|
97
|
+
get :index, params: { page_size: 1 }
|
69
98
|
assert_json do |list|
|
70
99
|
assert_instance_of Array, list
|
71
100
|
assert_equal 1, list.size
|
@@ -77,7 +106,7 @@ module Shipit
|
|
77
106
|
end
|
78
107
|
|
79
108
|
test "the `next` link is not provided when the last page is reached" do
|
80
|
-
get :index, params: {page_size: Stack.count}
|
109
|
+
get :index, params: { page_size: Stack.count }
|
81
110
|
assert_no_link 'next'
|
82
111
|
end
|
83
112
|
|
@@ -97,20 +126,20 @@ module Shipit
|
|
97
126
|
end
|
98
127
|
|
99
128
|
test "#show renders the stack" do
|
100
|
-
get :show, params: {id: @stack.to_param}
|
129
|
+
get :show, params: { id: @stack.to_param }
|
101
130
|
assert_response :ok
|
102
131
|
assert_json 'id', @stack.id
|
103
132
|
end
|
104
133
|
|
105
134
|
test "#show returns last_deployed_at column for stack" do
|
106
|
-
get :show, params: {id: @stack.to_param}
|
135
|
+
get :show, params: { id: @stack.to_param }
|
107
136
|
assert_response :ok
|
108
137
|
assert_json 'last_deployed_at', @stack.last_deployed_at
|
109
138
|
end
|
110
139
|
|
111
140
|
test "#destroy schedules stack deletion job" do
|
112
141
|
assert_enqueued_with(job: DestroyStackJob) do
|
113
|
-
delete :destroy, params: {id: @stack.to_param}
|
142
|
+
delete :destroy, params: { id: @stack.to_param }
|
114
143
|
end
|
115
144
|
assert_response :accepted
|
116
145
|
end
|
@@ -120,7 +149,7 @@ module Shipit
|
|
120
149
|
@client.save!
|
121
150
|
|
122
151
|
assert_no_difference 'Stack.count' do
|
123
|
-
delete :destroy, params: {id: @stack.to_param}
|
152
|
+
delete :destroy, params: { id: @stack.to_param }
|
124
153
|
end
|
125
154
|
|
126
155
|
assert_response :forbidden
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'test_helper'
|
2
3
|
|
3
4
|
module Shipit
|
@@ -11,7 +12,7 @@ module Shipit
|
|
11
12
|
test "#index returns a list of tasks" do
|
12
13
|
task = @stack.tasks.last
|
13
14
|
|
14
|
-
get :index, params: {stack_id: @stack.to_param}
|
15
|
+
get :index, params: { stack_id: @stack.to_param }
|
15
16
|
assert_response :ok
|
16
17
|
assert_json '0.id', task.id
|
17
18
|
end
|
@@ -19,18 +20,18 @@ module Shipit
|
|
19
20
|
test "#show returns a task" do
|
20
21
|
task = @stack.tasks.last
|
21
22
|
|
22
|
-
get :show, params: {stack_id: @stack.to_param, id: task.id}
|
23
|
+
get :show, params: { stack_id: @stack.to_param, id: task.id }
|
23
24
|
assert_response :ok
|
24
25
|
assert_json 'id', task.id
|
25
26
|
end
|
26
27
|
|
27
28
|
test "#trigger returns 404 with unknown task" do
|
28
|
-
post :trigger, params: {stack_id: @stack.to_param, task_name: 'shave_the_yak'}
|
29
|
+
post :trigger, params: { stack_id: @stack.to_param, task_name: 'shave_the_yak' }
|
29
30
|
assert_response :not_found
|
30
31
|
end
|
31
32
|
|
32
33
|
test "#trigger triggers a custom task" do
|
33
|
-
post :trigger, params: {stack_id: @stack.to_param, task_name: 'restart'}
|
34
|
+
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart' }
|
34
35
|
assert_response :accepted
|
35
36
|
assert_json 'type', 'task'
|
36
37
|
assert_json 'status', 'pending'
|
@@ -43,15 +44,15 @@ module Shipit
|
|
43
44
|
end
|
44
45
|
|
45
46
|
test "#trigger refuses to trigger a task with tasks not whitelisted" do
|
46
|
-
env = {'DANGEROUS_VARIABLE' => 'bar'}
|
47
|
-
post :trigger, params: {stack_id: @stack.to_param, task_name: 'restart', env: env}
|
47
|
+
env = { 'DANGEROUS_VARIABLE' => 'bar' }
|
48
|
+
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
|
48
49
|
assert_response :unprocessable_entity
|
49
50
|
assert_json 'message', 'Variables DANGEROUS_VARIABLE have not been whitelisted'
|
50
51
|
end
|
51
52
|
|
52
53
|
test "#trigger triggers a task with only whitelisted env variables" do
|
53
|
-
env = {'FOO' => 'bar'}
|
54
|
-
post :trigger, params: {stack_id: @stack.to_param, task_name: 'restart', env: env}
|
54
|
+
env = { 'FOO' => 'bar' }
|
55
|
+
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
|
55
56
|
assert_response :accepted
|
56
57
|
assert_json 'type', 'task'
|
57
58
|
assert_json 'status', 'pending'
|
@@ -64,8 +65,8 @@ module Shipit
|
|
64
65
|
end
|
65
66
|
|
66
67
|
test "#trigger triggers a task with explicitly passed and default variables" do
|
67
|
-
env = {'WALRUS' => 'overridden value'}
|
68
|
-
post :trigger, params: {stack_id: @stack.to_param, task_name: 'restart', env: env}
|
68
|
+
env = { 'WALRUS' => 'overridden value' }
|
69
|
+
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
|
69
70
|
assert_response :accepted
|
70
71
|
|
71
72
|
# FOO and BAR are variables with a default value
|
@@ -78,14 +79,14 @@ module Shipit
|
|
78
79
|
end
|
79
80
|
|
80
81
|
test "#trigger returns a 404 when the task doesn't exist" do
|
81
|
-
post :trigger, params: {stack_id: @stack.to_param, task_name: 'doesnt_exist'}
|
82
|
+
post :trigger, params: { stack_id: @stack.to_param, task_name: 'doesnt_exist' }
|
82
83
|
assert_response :not_found
|
83
84
|
end
|
84
85
|
|
85
86
|
test "#trigger returns 409 when a task is already running" do
|
86
87
|
shipit_deploys(:shipit_running).update!(allow_concurrency: false, status: 'running')
|
87
88
|
assert_predicate @stack, :active_task?
|
88
|
-
post :trigger, params: {stack_id: @stack.to_param, task_name: 'restart'}
|
89
|
+
post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart' }
|
89
90
|
assert_response :conflict
|
90
91
|
assert_json 'message', 'A task is already running.'
|
91
92
|
end
|