shipit-engine 0.39.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 +40 -1
- 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 +10 -8
- 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 +2 -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 +4 -2
- 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 -2
- 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 +4 -3
- 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 +35 -16
- 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 +8 -6
- 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 +1 -1
- 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 +59 -56
- 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 +33 -28
- 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 +21 -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/ccmenu/project.xml.builder +2 -1
- data/app/views/shipit/continuous_delivery_schedules/show.html.erb +59 -0
- 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/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 +5 -4
- 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 -15
- 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 +1 -0
- 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 +34 -26
- 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 +29 -16
- 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 +2 -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 +7 -5
- data/test/controllers/status_controller_test.rb +1 -0
- data/test/controllers/tasks_controller_test.rb +5 -4
- data/test/controllers/webhooks_controller_test.rb +10 -9
- data/test/dummy/config/application.rb +1 -1
- 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 -1
- 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 +23 -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/stack_test.rb +30 -29
- 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 +21 -20
- data/test/test_command_integration.rb +1 -1
- data/test/test_helper.rb +11 -9
- 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 +10 -9
- 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 +53 -43
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'json'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -23,23 +24,23 @@ module Shipit
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def discover_lerna_checklist
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
return unless lerna?
|
28
|
+
|
29
|
+
command = if lerna_lerna >= LATEST_MAJOR_VERSION
|
30
|
+
'lerna version'
|
31
|
+
else
|
32
|
+
%(
|
31
33
|
lerna publish --skip-npm
|
32
34
|
&& git add -A
|
33
35
|
&& git push --follow-tags
|
34
36
|
)
|
35
|
-
|
37
|
+
end
|
36
38
|
|
37
|
-
|
39
|
+
[%(
|
38
40
|
<strong>Don't forget version and tag before publishing!</strong>
|
39
41
|
You can do this with:<br/>
|
40
42
|
<pre>#{command}</pre>
|
41
43
|
)]
|
42
|
-
end
|
43
44
|
end
|
44
45
|
|
45
46
|
def lerna?
|
@@ -72,47 +73,47 @@ module Shipit
|
|
72
73
|
|
73
74
|
def publish_lerna_packages
|
74
75
|
return publish_independent_packages if lerna_version == 'independent'
|
76
|
+
|
75
77
|
publish_fixed_version_packages
|
76
78
|
end
|
77
79
|
|
78
80
|
def publish_independent_packages
|
79
|
-
|
81
|
+
if lerna_lerna >= LATEST_MAJOR_VERSION
|
80
82
|
[
|
81
83
|
'assert-lerna-independent-version-tags',
|
82
|
-
'publish-lerna-independent-packages'
|
84
|
+
'publish-lerna-independent-packages'
|
83
85
|
]
|
84
86
|
else
|
85
87
|
[
|
86
88
|
'assert-lerna-independent-version-tags',
|
87
|
-
'publish-lerna-independent-packages-legacy'
|
89
|
+
'publish-lerna-independent-packages-legacy'
|
88
90
|
]
|
89
91
|
end
|
90
|
-
command
|
91
92
|
end
|
92
93
|
|
93
94
|
def publish_fixed_version_packages
|
94
95
|
check_tags = 'assert-lerna-fixed-version-tag'
|
95
96
|
version = lerna_version
|
96
97
|
publish = if lerna_lerna >= LATEST_MAJOR_VERSION
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
98
|
+
%W[
|
99
|
+
node_modules/.bin/lerna publish
|
100
|
+
from-git
|
101
|
+
--yes
|
102
|
+
--dist-tag #{dist_tag(version)}
|
103
|
+
].join(" ")
|
104
|
+
else
|
105
|
+
# `yarn publish` requires user input, so always use npm.
|
106
|
+
%W[
|
107
|
+
node_modules/.bin/lerna publish
|
108
|
+
--yes
|
109
|
+
--skip-git
|
110
|
+
--repo-version #{version}
|
111
|
+
--force-publish=*
|
112
|
+
--npm-tag #{dist_tag(version)}
|
113
|
+
--npm-client=npm
|
114
|
+
--skip-npm=false
|
115
|
+
].join(" ")
|
116
|
+
end
|
116
117
|
|
117
118
|
[check_tags, publish]
|
118
119
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'json'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -27,19 +28,19 @@ module Shipit
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def discover_yarn_checklist
|
30
|
-
|
31
|
-
|
31
|
+
return unless yarn?
|
32
|
+
|
33
|
+
[%(<strong>Don't forget version and tag before publishing!</strong> You can do this with:<br/>
|
32
34
|
yarn version --new-version <strong><major|minor|patch></strong>
|
33
35
|
&& git push --follow-tags</pre>)]
|
34
|
-
end
|
35
36
|
end
|
36
37
|
|
37
38
|
def discover_npm_checklist
|
38
|
-
|
39
|
-
|
39
|
+
return unless npm?
|
40
|
+
|
41
|
+
[%(<strong>Don't forget version and tag before publishing!</strong> You can do this with:<br/>
|
40
42
|
npm version <strong><major|minor|patch></strong>
|
41
43
|
&& git push --follow-tags</pre>)]
|
42
|
-
end
|
43
44
|
end
|
44
45
|
|
45
46
|
def npm?
|
@@ -59,6 +60,7 @@ module Shipit
|
|
59
60
|
# An 1.0.0-beta.1 would be installable using both:
|
60
61
|
# `yarn add package@1.0.0-beta.1` and `yarn add package@next`
|
61
62
|
return 'next' if ['-beta', '-alpha', '-rc', '-next'].any? { |tag| version.include?(tag) }
|
63
|
+
|
62
64
|
'latest'
|
63
65
|
end
|
64
66
|
|
@@ -104,21 +106,25 @@ module Shipit
|
|
104
106
|
# default to private deploy when we enforce a publishConfig
|
105
107
|
if enforce_publish_config?
|
106
108
|
return PRIVATE if config.blank?
|
109
|
+
|
107
110
|
config['access'] || PRIVATE
|
108
111
|
end
|
109
112
|
|
110
113
|
return PUBLIC if config.blank?
|
114
|
+
|
111
115
|
config['access'] || PUBLIC
|
112
116
|
end
|
113
117
|
|
114
118
|
def scoped_package?
|
115
119
|
return false if Shipit.npm_org_scope.nil?
|
120
|
+
|
116
121
|
package_name.start_with?(Shipit.npm_org_scope)
|
117
122
|
end
|
118
123
|
|
119
124
|
def enforce_publish_config?
|
120
125
|
enforce = Shipit.enforce_publish_config
|
121
126
|
return false if enforce.nil? || enforce.to_s == "0"
|
127
|
+
|
122
128
|
true
|
123
129
|
end
|
124
130
|
|
@@ -148,9 +154,7 @@ module Shipit
|
|
148
154
|
scope = Shipit.npm_org_scope
|
149
155
|
prefix = scoped_package? ? "#{scope}:registry" : "registry"
|
150
156
|
|
151
|
-
if publish_config_access == PUBLIC
|
152
|
-
return "#{prefix}=#{NPM_REGISTRY}"
|
153
|
-
end
|
157
|
+
return "#{prefix}=#{NPM_REGISTRY}" if publish_config_access == PUBLIC
|
154
158
|
|
155
159
|
"#{prefix}=#{Shipit.private_npm_registry}"
|
156
160
|
end
|
@@ -164,15 +168,16 @@ module Shipit
|
|
164
168
|
publish = "npm publish --tag #{dist_tag(package_version)} --access #{publish_config_access}"
|
165
169
|
|
166
170
|
return [check_tags, generate_npmrc, publish] if enforce_publish_config?
|
171
|
+
|
167
172
|
[check_tags, publish]
|
168
173
|
end
|
169
174
|
|
170
175
|
def js_command(command_args)
|
171
176
|
runner = if yarn?
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
177
|
+
'yarn'
|
178
|
+
else
|
179
|
+
'npm'
|
180
|
+
end
|
176
181
|
|
177
182
|
"#{runner} #{command_args}"
|
178
183
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class DeploySpec
|
4
5
|
module PypiDiscovery
|
@@ -15,10 +16,10 @@ module Shipit
|
|
15
16
|
end
|
16
17
|
|
17
18
|
def discover_pypi_checklist
|
18
|
-
|
19
|
-
|
19
|
+
return unless egg?
|
20
|
+
|
21
|
+
[%(<strong>Don't forget to add a tag before deploying!</strong> You can do this with:
|
20
22
|
git tag -a -m "Version <strong>x.y.z</strong>" v<strong>x.y.z</strong> && git push --tags)]
|
21
|
-
end
|
22
23
|
end
|
23
24
|
|
24
25
|
def egg?
|
@@ -33,7 +34,7 @@ module Shipit
|
|
33
34
|
[
|
34
35
|
"assert-egg-version-tag #{setup_dot_py}",
|
35
36
|
'python setup.py register sdist',
|
36
|
-
'twine upload dist/*'
|
37
|
+
'twine upload dist/*'
|
37
38
|
]
|
38
39
|
end
|
39
40
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'pathname'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -47,11 +48,9 @@ module Shipit
|
|
47
48
|
def config(*keys, &default)
|
48
49
|
default ||= -> { nil }
|
49
50
|
keys.flatten.reduce(@config) do |hash, key|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
return default.call
|
54
|
-
end
|
51
|
+
return default.call unless hash.is_a?(Hash)
|
52
|
+
|
53
|
+
hash.fetch(key) { return default.call }
|
55
54
|
end
|
56
55
|
end
|
57
56
|
|
@@ -80,7 +79,7 @@ module Shipit
|
|
80
79
|
config('dependencies', 'override') { discover_dependencies_steps || [] }
|
81
80
|
end
|
82
81
|
end
|
83
|
-
|
82
|
+
alias dependencies_steps! dependencies_steps
|
84
83
|
|
85
84
|
def maximum_commits_per_deploy
|
86
85
|
config('deploy', 'max_commits') { 8 }
|
@@ -95,9 +94,9 @@ module Shipit
|
|
95
94
|
end
|
96
95
|
|
97
96
|
def release_status_delay
|
98
|
-
|
99
|
-
|
100
|
-
|
97
|
+
return unless delay = config('status', 'delay') { config('deploy', 'interval') { 0 } }
|
98
|
+
|
99
|
+
Duration.parse(delay)
|
101
100
|
end
|
102
101
|
|
103
102
|
def pause_between_deploys
|
@@ -193,7 +192,7 @@ module Shipit
|
|
193
192
|
|
194
193
|
def merge_request_merge_method
|
195
194
|
method = config('merge', 'method')
|
196
|
-
method if %w
|
195
|
+
method if %w[merge rebase squash].include?(method)
|
197
196
|
end
|
198
197
|
|
199
198
|
def merge_request_required_statuses
|
@@ -213,11 +212,11 @@ module Shipit
|
|
213
212
|
end
|
214
213
|
|
215
214
|
def revalidate_merge_requests_after
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
215
|
+
return unless timeout = config('merge', 'revalidate_after')
|
216
|
+
|
217
|
+
begin
|
218
|
+
Duration.parse(timeout)
|
219
|
+
rescue Duration::ParseError
|
221
220
|
end
|
222
221
|
end
|
223
222
|
|
@@ -226,11 +225,11 @@ module Shipit
|
|
226
225
|
end
|
227
226
|
|
228
227
|
def max_divergence_age
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
228
|
+
return unless timeout = config('merge', 'max_divergence', 'age')
|
229
|
+
|
230
|
+
begin
|
231
|
+
Duration.parse(timeout)
|
232
|
+
rescue Duration::ParseError
|
234
233
|
end
|
235
234
|
end
|
236
235
|
|
@@ -255,6 +254,7 @@ module Shipit
|
|
255
254
|
def around_steps(section)
|
256
255
|
steps = yield
|
257
256
|
return unless steps
|
257
|
+
|
258
258
|
config(section, 'pre') { [] } + steps + config(section, 'post') { [] }
|
259
259
|
end
|
260
260
|
|
@@ -262,24 +262,19 @@ module Shipit
|
|
262
262
|
config
|
263
263
|
end
|
264
264
|
|
265
|
-
def discover_review_checklist
|
266
|
-
end
|
265
|
+
def discover_review_checklist; end
|
267
266
|
|
268
267
|
def discover_task_definitions
|
269
268
|
config('tasks') || {}
|
270
269
|
end
|
271
270
|
|
272
|
-
def discover_dependencies_steps
|
273
|
-
end
|
271
|
+
def discover_dependencies_steps; end
|
274
272
|
|
275
|
-
def discover_deploy_steps
|
276
|
-
end
|
273
|
+
def discover_deploy_steps; end
|
277
274
|
|
278
|
-
def discover_rollback_steps
|
279
|
-
end
|
275
|
+
def discover_rollback_steps; end
|
280
276
|
|
281
|
-
def discover_fetch_deployed_revision_steps
|
282
|
-
end
|
277
|
+
def discover_fetch_deployed_revision_steps; end
|
283
278
|
|
284
279
|
def discover_machine_env
|
285
280
|
{}
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class DeployStats
|
4
5
|
delegate :empty?, to: :@deploys
|
@@ -14,6 +15,7 @@ module Shipit
|
|
14
15
|
|
15
16
|
def average_duration
|
16
17
|
return if empty?
|
18
|
+
|
17
19
|
@durations.sum / @durations.length.to_f
|
18
20
|
end
|
19
21
|
|
@@ -27,11 +29,13 @@ module Shipit
|
|
27
29
|
|
28
30
|
def median_duration
|
29
31
|
return if @durations.empty?
|
32
|
+
|
30
33
|
(sorted_durations[(@durations.length - 1) / 2] + sorted_durations[@durations.length / 2]) / 2.0
|
31
34
|
end
|
32
35
|
|
33
36
|
def success_rate
|
34
37
|
return if empty?
|
38
|
+
|
35
39
|
(@deploys.count(&:success?) / @deploys.length.to_f) * 100
|
36
40
|
end
|
37
41
|
|
@@ -39,7 +43,7 @@ module Shipit
|
|
39
43
|
{
|
40
44
|
count: percent_change(compare_stats.count, count),
|
41
45
|
average_duration: percent_change(compare_stats.average_duration, average_duration),
|
42
|
-
median_duration: percent_change(compare_stats.median_duration, median_duration)
|
46
|
+
median_duration: percent_change(compare_stats.median_duration, median_duration)
|
43
47
|
}
|
44
48
|
end
|
45
49
|
|
@@ -52,6 +56,7 @@ module Shipit
|
|
52
56
|
def percent_change(from, to)
|
53
57
|
return if to.nil? || from.nil?
|
54
58
|
return to * 100 if from.zero?
|
59
|
+
|
55
60
|
((to - from) / from.to_f) * 100
|
56
61
|
end
|
57
62
|
end
|
@@ -1,21 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class Duration < ActiveSupport::Duration
|
4
5
|
ParseError = Class.new(ArgumentError)
|
5
6
|
|
6
|
-
FORMAT =
|
7
|
+
FORMAT = /
|
7
8
|
\A
|
8
9
|
(?<days>\d+d)?
|
9
10
|
(?<hours>\d+h)?
|
10
11
|
(?<minutes>\d+m)?
|
11
12
|
(?<seconds>\d+s?)?
|
12
13
|
\z
|
13
|
-
|
14
|
+
/x
|
14
15
|
UNITS = {
|
15
16
|
's' => :seconds,
|
16
17
|
'm' => :minutes,
|
17
18
|
'h' => :hours,
|
18
|
-
'd' => :days
|
19
|
+
'd' => :days
|
19
20
|
}.freeze
|
20
21
|
|
21
22
|
class << self
|
@@ -25,6 +26,7 @@ module Shipit
|
|
25
26
|
unless match = FORMAT.match(value.to_s)
|
26
27
|
raise ParseError, "not a duration: #{value.inspect}"
|
27
28
|
end
|
29
|
+
|
28
30
|
parts = []
|
29
31
|
UNITS.each_value do |unit|
|
30
32
|
if value = match[unit]
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class EphemeralCommitChecks
|
4
|
-
FINAL_STATUSES = %w
|
5
|
+
FINAL_STATUSES = %w[failed error success].freeze
|
5
6
|
|
6
7
|
def initialize(commit)
|
7
8
|
@commit = commit
|
@@ -13,8 +14,8 @@ module Shipit
|
|
13
14
|
def run
|
14
15
|
self.status = 'running'
|
15
16
|
commands = StackCommands.new(stack)
|
16
|
-
commands.with_temporary_working_directory(commit:
|
17
|
-
deploy_spec = DeploySpec::FileSystem.new(directory, stack
|
17
|
+
commands.with_temporary_working_directory(commit:) do |directory|
|
18
|
+
deploy_spec = DeploySpec::FileSystem.new(directory, stack)
|
18
19
|
capture_all(build_commands(deploy_spec.dependencies_steps, chdir: directory))
|
19
20
|
capture_all(build_commands(deploy_spec.review_checks, chdir: directory))
|
20
21
|
end
|
@@ -22,7 +23,7 @@ module Shipit
|
|
22
23
|
rescue Command::Error
|
23
24
|
self.status = 'failed'
|
24
25
|
self
|
25
|
-
rescue
|
26
|
+
rescue StandardError
|
26
27
|
self.status = 'error'
|
27
28
|
raise
|
28
29
|
else
|
@@ -46,7 +47,7 @@ module Shipit
|
|
46
47
|
private
|
47
48
|
|
48
49
|
def build_commands(commands, chdir:)
|
49
|
-
commands.map { |c| Command.new(c, env: Shipit.env, chdir:
|
50
|
+
commands.map { |c| Command.new(c, env: Shipit.env, chdir:) }
|
50
51
|
end
|
51
52
|
|
52
53
|
def capture_all(commands)
|
@@ -59,8 +60,8 @@ module Shipit
|
|
59
60
|
command.stream! do |line|
|
60
61
|
write(line)
|
61
62
|
end
|
62
|
-
rescue Command::Error =>
|
63
|
-
write(
|
63
|
+
rescue Command::Error => e
|
64
|
+
write(e.message)
|
64
65
|
raise
|
65
66
|
ensure
|
66
67
|
write("\n")
|
data/app/models/shipit/hook.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class Hook < Record
|
4
5
|
class DeliverySigner
|
@@ -46,7 +47,7 @@ module Shipit
|
|
46
47
|
'Content-Type' => content_type,
|
47
48
|
'X-Shipit-Event' => event,
|
48
49
|
'X-Shipit-Signature' => signature,
|
49
|
-
'Accept' => '*/*'
|
50
|
+
'Accept' => '*/*'
|
50
51
|
}
|
51
52
|
end
|
52
53
|
|
@@ -63,10 +64,10 @@ module Shipit
|
|
63
64
|
|
64
65
|
CONTENT_TYPES = {
|
65
66
|
'json' => 'application/json',
|
66
|
-
'form' => 'application/x-www-form-urlencoded'
|
67
|
+
'form' => 'application/x-www-form-urlencoded'
|
67
68
|
}.freeze
|
68
69
|
|
69
|
-
EVENTS = %w
|
70
|
+
EVENTS = %w[
|
70
71
|
stack
|
71
72
|
review_stack
|
72
73
|
task
|
@@ -78,7 +79,7 @@ module Shipit
|
|
78
79
|
merge_status
|
79
80
|
merge
|
80
81
|
pull_request
|
81
|
-
|
82
|
+
].freeze
|
82
83
|
|
83
84
|
belongs_to :stack, required: false
|
84
85
|
has_many :deliveries
|
@@ -96,10 +97,11 @@ module Shipit
|
|
96
97
|
class << self
|
97
98
|
def emit(event, stack, payload)
|
98
99
|
raise "#{event} is not declared in Shipit::Hook::EVENTS" unless EVENTS.include?(event.to_s)
|
100
|
+
|
99
101
|
Shipit::EmitEventJob.perform_later(
|
100
102
|
event: event.to_s,
|
101
103
|
stack_id: stack&.id,
|
102
|
-
payload: coerce_payload(payload)
|
104
|
+
payload: coerce_payload(payload)
|
103
105
|
)
|
104
106
|
deliver_internal_hooks(event, stack, payload)
|
105
107
|
end
|
@@ -142,7 +144,7 @@ module Shipit
|
|
142
144
|
url: delivery_url,
|
143
145
|
content_type: CONTENT_TYPES[content_type],
|
144
146
|
payload: serialize_payload(payload),
|
145
|
-
secret:
|
147
|
+
secret:
|
146
148
|
)
|
147
149
|
end
|
148
150
|
|