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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b42049322671e225e86884f3990cf0233fcd0b4ac7eaec63643a3c57dbe8f9b
|
4
|
+
data.tar.gz: 132aee7cfff7bc2801a0a28224be08e625880bfc59fcc98a6adabd1459a2b812
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d75e469feb17bab9a1792cefd41da3ae8daf38d1b32ef0c1ab39df1bfd931b033f27d83cadefb92e77ff3063f2b8ebdcea4844ef64b88d61a9a87d1183eca19
|
7
|
+
data.tar.gz: 667e3e0cbaac19bc64c11defa7e502d504aea73c09010e81bf1368a52d5794fc8953e29b34d7cb65865f5229d3c3ab38bbe2bc62db822bdb59fb119d59b728c9
|
data/README.md
CHANGED
@@ -123,6 +123,7 @@ The settings in the `shipit.yml` file relate to the different things you can do
|
|
123
123
|
* [Custom Tasks](#custom-tasks) (`tasks`)
|
124
124
|
* [Custom links](#custom-links) (`links`)
|
125
125
|
* [Review Process](#review-process) (`review.checklist`, `review.monitoring`, `review.checks`)
|
126
|
+
* [Inherit From](#inherit-from)(`inherit_from`)
|
126
127
|
|
127
128
|
All the settings in `shipit.yml` are optional. Most applications can be deployed from Shipit without any configuration.
|
128
129
|
|
@@ -130,6 +131,8 @@ Also, if your repository is deployed different ways depending on the environment
|
|
130
131
|
|
131
132
|
For example for a stack like: `my-org/my-repo/staging`, `shipit.staging.yml` will have priority over `shipit.yml`.
|
132
133
|
|
134
|
+
In order to reduce duplication across different environment specific files, you can specify an `inherit_from` key in your relevant `shipit.yml` file. This key expects a string of the file name to inherit from. If this key is specified, a deep-merge will be performed on the file therein, overwriting any duplicated values from the parent. See [Inherit From](#inherit-from)(`inherit_From`) for example.
|
135
|
+
|
133
136
|
Lastly, if you override the `app_name` configuration in your Shipit deployment, `yourapp.yml` and `yourapp.staging.yml` will work.
|
134
137
|
|
135
138
|
* * *
|
@@ -613,9 +616,45 @@ review:
|
|
613
616
|
- bundle exec rake db:migrate:status
|
614
617
|
```
|
615
618
|
|
619
|
+
<h3 id="inherit-from">Inherit From</h3>
|
620
|
+
|
621
|
+
If the `inherit_from` key is specified, a deep-merge will be performed on the file therein, overwriting any duplicated values from the parent. Keys may be chained across files. Example:
|
622
|
+
|
623
|
+
``` yaml
|
624
|
+
# shipit.production.yml
|
625
|
+
inherit_from: shipit.staging.yml
|
626
|
+
|
627
|
+
machine:
|
628
|
+
environment:
|
629
|
+
PUBLIC: true
|
630
|
+
```
|
631
|
+
|
632
|
+
``` yaml
|
633
|
+
# shipit.staging.yml
|
634
|
+
inherit_from: shipit.yml
|
635
|
+
|
636
|
+
deploy:
|
637
|
+
override:
|
638
|
+
- ./some_deployment_process.sh ${PUBLIC}
|
639
|
+
```
|
640
|
+
|
641
|
+
``` yaml
|
642
|
+
# shipit.yml
|
643
|
+
|
644
|
+
machine:
|
645
|
+
environment:
|
646
|
+
TEST: true
|
647
|
+
PUBLIC: false
|
648
|
+
```
|
649
|
+
|
650
|
+
Loading 'shipit.production.yml' would result in:
|
651
|
+
```rb
|
652
|
+
{"machine"=>{"environment"=>{"TEST"=>true, "PUBLIC"=>true}}, "deploy"=>{"override"=>["./some_deployment_process.sh ${PUBLIC}"]}}
|
653
|
+
```
|
654
|
+
|
616
655
|
<h3 id="shell-commands-timeout">Shell commands timeout</h3>
|
617
656
|
|
618
|
-
All the shell commands can take an optional `timeout` parameter
|
657
|
+
All the shell commands can take an optional `timeout` parameter. This is the value in seconds that a command can be inactive before Shipit will terminate the task.
|
619
658
|
|
620
659
|
```yml
|
621
660
|
deploy:
|
data/Rakefile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
3
4
|
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
4
5
|
|
@@ -8,7 +9,7 @@ begin
|
|
8
9
|
rescue LoadError
|
9
10
|
end
|
10
11
|
|
11
|
-
APP_RAKEFILE = File.expand_path('
|
12
|
+
APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
|
12
13
|
load('rails/tasks/engine.rake')
|
13
14
|
|
14
15
|
Bundler::GemHelper.install_tasks
|
@@ -0,0 +1,15 @@
|
|
1
|
+
$(document)
|
2
|
+
.on "click", ".continuous-delivery-schedule [data-action='copy-to-all']", (event) ->
|
3
|
+
form = event.target.closest("form");
|
4
|
+
|
5
|
+
mondayStart = form.elements.namedItem("continuous_delivery_schedule[monday_start]").value
|
6
|
+
mondayEnd = form.elements.namedItem("continuous_delivery_schedule[monday_end]").value
|
7
|
+
|
8
|
+
Array.from(form.elements).forEach (formElement) ->
|
9
|
+
return unless formElement.type == "time"
|
10
|
+
|
11
|
+
if formElement.name.endsWith("_start]")
|
12
|
+
formElement.value = mondayStart
|
13
|
+
|
14
|
+
if formElement.name.endsWith("_end]")
|
15
|
+
formElement.value = mondayEnd
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Api
|
4
5
|
module Paginable
|
@@ -23,8 +24,8 @@ module Shipit
|
|
23
24
|
resource,
|
24
25
|
self,
|
25
26
|
order: default_order,
|
26
|
-
max_page_size
|
27
|
-
default_page_size:
|
27
|
+
max_page_size:,
|
28
|
+
default_page_size:
|
28
29
|
)
|
29
30
|
headers[LINK] = render_links(paginator.links)
|
30
31
|
super(paginator.to_a)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Pagination
|
4
5
|
extend ActiveSupport::Concern
|
@@ -20,8 +21,8 @@ module Shipit
|
|
20
21
|
relation,
|
21
22
|
self,
|
22
23
|
order: default_order,
|
23
|
-
max_page_size
|
24
|
-
default_page_size:
|
24
|
+
max_page_size:,
|
25
|
+
default_page_size:
|
25
26
|
)
|
26
27
|
end
|
27
28
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Api
|
4
5
|
class BaseController < ActionController::Base
|
@@ -35,7 +36,7 @@ module Shipit
|
|
35
36
|
|
36
37
|
private
|
37
38
|
|
38
|
-
def
|
39
|
+
def basic_credentials?(request)
|
39
40
|
request.authorization.present? && (auth_scheme(request).downcase == "basic")
|
40
41
|
end
|
41
42
|
end
|
@@ -46,14 +47,15 @@ module Shipit
|
|
46
47
|
|
47
48
|
def authenticate_api_client
|
48
49
|
@current_api_client = if Shipit.disable_api_authentication
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
50
|
+
UnlimitedApiClient.new
|
51
|
+
else
|
52
|
+
BasicAuth.authenticate(request) do |*parts|
|
53
|
+
token = parts.select(&:present?).join('--')
|
54
|
+
ApiClient.authenticate(token)
|
55
|
+
end
|
56
|
+
end
|
56
57
|
return if @current_api_client
|
58
|
+
|
57
59
|
headers['WWW-Authenticate'] = 'Basic realm="Authentication token"'
|
58
60
|
render(status: :unauthorized, json: { message: 'Bad credentials' })
|
59
61
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Api
|
4
5
|
class CCMenuController < BaseController
|
@@ -20,7 +21,7 @@ module Shipit
|
|
20
21
|
|
21
22
|
def show
|
22
23
|
latest_deploy = stack.deploys_and_rollbacks.last || NoDeploy.new
|
23
|
-
render('shipit/ccmenu/project', formats: [:xml], locals: { stack
|
24
|
+
render('shipit/ccmenu/project', formats: [:xml], locals: { stack:, deploy: latest_deploy })
|
24
25
|
end
|
25
26
|
|
26
27
|
private
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Api
|
4
5
|
class CommitsController < BaseController
|
@@ -6,9 +7,7 @@ module Shipit
|
|
6
7
|
|
7
8
|
def index
|
8
9
|
commits = stack.commits.reachable.includes(:statuses)
|
9
|
-
if params[:undeployed]
|
10
|
-
commits = commits.newer_than(stack.last_deployed_commit)
|
11
|
-
end
|
10
|
+
commits = commits.newer_than(stack.last_deployed_commit) if params[:undeployed]
|
12
11
|
|
13
12
|
render_resources(commits)
|
14
13
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Api
|
4
5
|
class DeploysController < BaseController
|
@@ -22,7 +23,7 @@ module Shipit
|
|
22
23
|
|
23
24
|
allow_concurrency = params.allow_concurrency.nil? ? params.force : params.allow_concurrency
|
24
25
|
deploy = stack.trigger_deploy(commit, current_user, env: params.env, force: params.force,
|
25
|
-
|
26
|
+
allow_concurrency:)
|
26
27
|
render_resource(deploy, status: :accepted)
|
27
28
|
end
|
28
29
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Api
|
4
5
|
class HooksController < BaseController
|
5
|
-
require_permission :read, :hook, only: %i
|
6
|
-
require_permission :write, :hook, only: %i
|
6
|
+
require_permission :read, :hook, only: %i[index show]
|
7
|
+
require_permission :write, :hook, only: %i[create update destroy]
|
7
8
|
|
8
9
|
def index
|
9
10
|
render_resources(hooks)
|
@@ -43,7 +44,7 @@ module Shipit
|
|
43
44
|
end
|
44
45
|
|
45
46
|
def hooks
|
46
|
-
Hook.where(stack_id:
|
47
|
+
Hook.where(stack_id:)
|
47
48
|
end
|
48
49
|
|
49
50
|
def stack_id
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Api
|
4
5
|
class MergeRequestsController < BaseController
|
5
6
|
require_permission :read, :stack
|
6
|
-
require_permission :deploy, :stack, only: %i
|
7
|
+
require_permission :deploy, :stack, only: %i[update destroy]
|
7
8
|
|
8
9
|
def index
|
9
10
|
render_resources(stack.merge_requests.includes(:head).order(id: :desc))
|
@@ -19,16 +20,16 @@ module Shipit
|
|
19
20
|
head(:accepted)
|
20
21
|
elsif merge_request.merged?
|
21
22
|
render(status: :method_not_allowed, json: {
|
22
|
-
|
23
|
-
|
23
|
+
message: "This pull request was already merged."
|
24
|
+
})
|
24
25
|
else
|
25
26
|
raise "Pull Request is neither waiting nor merged, this should be impossible"
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
29
30
|
def destroy
|
30
|
-
if merge_request = stack.merge_requests.where(number: params[:id]).first
|
31
|
-
merge_request.cancel!
|
31
|
+
if (merge_request = stack.merge_requests.where(number: params[:id]).first) && merge_request.waiting?
|
32
|
+
merge_request.cancel!
|
32
33
|
end
|
33
34
|
head(:no_content)
|
34
35
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Api
|
4
5
|
class ReleaseStatusesController < BaseController
|
@@ -6,7 +7,7 @@ module Shipit
|
|
6
7
|
|
7
8
|
params do
|
8
9
|
requires :status, String
|
9
|
-
validates :status, inclusion: { in: %w
|
10
|
+
validates :status, inclusion: { in: %w[success failure] }
|
10
11
|
end
|
11
12
|
def create
|
12
13
|
deploy = stack.deploys_and_rollbacks.find(params[:deploy_id])
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Api
|
4
5
|
class StacksController < BaseController
|
5
|
-
require_permission :read, :stack, only: %i
|
6
|
-
require_permission :write, :stack, only: %i
|
6
|
+
require_permission :read, :stack, only: %i[index show]
|
7
|
+
require_permission :write, :stack, only: %i[create update destroy]
|
7
8
|
|
8
9
|
params do
|
9
10
|
accepts :repo_owner, String
|
@@ -14,10 +15,10 @@ module Shipit
|
|
14
15
|
if params[:repo_owner] && params[:repo_name]
|
15
16
|
full_repo_name = [repo_owner, repo_name].join('/')
|
16
17
|
@stacks = if (repository = Repository.from_github_repo_name(full_repo_name))
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
stacks.where(repository:)
|
19
|
+
else
|
20
|
+
Stack.none
|
21
|
+
end
|
21
22
|
end
|
22
23
|
render_resources(@stacks)
|
23
24
|
end
|
@@ -75,7 +76,7 @@ module Shipit
|
|
75
76
|
private
|
76
77
|
|
77
78
|
def create_params
|
78
|
-
params.reject { |key, _| %i
|
79
|
+
params.reject { |key, _| %i[repo_owner repo_name].include?(key) }
|
79
80
|
end
|
80
81
|
|
81
82
|
def stack
|
@@ -83,12 +84,12 @@ module Shipit
|
|
83
84
|
end
|
84
85
|
|
85
86
|
def update_archived
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
87
|
+
return unless key?(:archived)
|
88
|
+
|
89
|
+
if params[:archived]
|
90
|
+
stack.archive!(nil)
|
91
|
+
elsif stack.archived?
|
92
|
+
stack.unarchive!
|
92
93
|
end
|
93
94
|
end
|
94
95
|
|
@@ -98,7 +99,7 @@ module Shipit
|
|
98
99
|
|
99
100
|
def update_params
|
100
101
|
params.select do |key, _|
|
101
|
-
%i
|
102
|
+
%i[environment branch deploy_url ignore_ci merge_queue_enabled continuous_deployment].include?(key)
|
102
103
|
end
|
103
104
|
end
|
104
105
|
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
module Api
|
4
5
|
class TasksController < BaseController
|
5
6
|
require_permission :read, :stack
|
6
|
-
require_permission :deploy, :stack, only: %i
|
7
|
+
require_permission :deploy, :stack, only: %i[trigger abort]
|
7
8
|
|
8
9
|
def index
|
9
10
|
render_resources(stack.tasks)
|
@@ -20,8 +21,8 @@ module Shipit
|
|
20
21
|
render_resource(stack.trigger_task(params[:task_name], current_user, env: params.env), status: :accepted)
|
21
22
|
rescue Shipit::Task::ConcurrentTaskRunning
|
22
23
|
render(status: :conflict, json: {
|
23
|
-
|
24
|
-
|
24
|
+
message: 'A task is already running.'
|
25
|
+
})
|
25
26
|
end
|
26
27
|
|
27
28
|
def abort
|
@@ -30,8 +31,8 @@ module Shipit
|
|
30
31
|
head(:accepted)
|
31
32
|
else
|
32
33
|
render(status: :method_not_allowed, json: {
|
33
|
-
|
34
|
-
|
34
|
+
message: "This task is not currently running."
|
35
|
+
})
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class ApiClientsController < ShipitController
|
4
5
|
include Pagination
|
@@ -15,9 +16,7 @@ module Shipit
|
|
15
16
|
|
16
17
|
def create
|
17
18
|
@api_client = ApiClient.new(create_params.merge(creator_id: current_user.id))
|
18
|
-
unless @api_client.save
|
19
|
-
flash[:warning] = @api_client.errors.full_messages.to_sentence
|
20
|
-
end
|
19
|
+
flash[:warning] = @api_client.errors.full_messages.to_sentence unless @api_client.save
|
21
20
|
|
22
21
|
respond_with(@api_client)
|
23
22
|
end
|
@@ -29,10 +28,10 @@ module Shipit
|
|
29
28
|
def update
|
30
29
|
@api_client = ApiClient.find(params[:id])
|
31
30
|
options = if @api_client.update(update_params)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
{ flash: { success: 'Successfully updated' } }
|
32
|
+
else
|
33
|
+
{ flash: { warning: @stack.errors.full_messages.to_sentence } }
|
34
|
+
end
|
36
35
|
|
37
36
|
redirect_to(params[:return_to].presence || api_client_path(@api_client), options)
|
38
37
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'uri'
|
3
4
|
|
4
5
|
module Shipit
|
@@ -12,8 +13,8 @@ module Shipit
|
|
12
13
|
private
|
13
14
|
|
14
15
|
def client
|
15
|
-
@client ||= ApiClient.create_with(permissions: %w
|
16
|
-
|
16
|
+
@client ||= ApiClient.create_with(permissions: %w[read:stack])
|
17
|
+
.find_or_create_by!(creator: current_user, name: 'CCMenu Client')
|
17
18
|
end
|
18
19
|
|
19
20
|
def stack
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class CommitChecksController < ShipitController
|
4
5
|
def show
|
@@ -16,7 +17,7 @@ module Shipit
|
|
16
17
|
url = stack_tail_commit_checks_path(stack, sha: commit.sha, since: next_offset)
|
17
18
|
end
|
18
19
|
|
19
|
-
render(json: { url
|
20
|
+
render(json: { url:, output:, status: checks.status })
|
20
21
|
end
|
21
22
|
|
22
23
|
private
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Shipit
|
4
|
+
class ContinuousDeliverySchedulesController < ShipitController
|
5
|
+
before_action :load_stack
|
6
|
+
|
7
|
+
def show
|
8
|
+
@continuous_delivery_schedule = @stack.continuous_delivery_schedule || @stack.build_continuous_delivery_schedule
|
9
|
+
end
|
10
|
+
|
11
|
+
def update
|
12
|
+
@continuous_delivery_schedule = @stack.continuous_delivery_schedule || @stack.build_continuous_delivery_schedule
|
13
|
+
@continuous_delivery_schedule.assign_attributes(continuous_delivery_schedule_params)
|
14
|
+
|
15
|
+
if @continuous_delivery_schedule.save
|
16
|
+
flash[:success] = "Successfully updated"
|
17
|
+
redirect_to(stack_continuous_delivery_schedule_path)
|
18
|
+
else
|
19
|
+
flash.now[:warning] = "Check form for errors"
|
20
|
+
render(:show, status: :unprocessable_entity)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def load_stack
|
27
|
+
@stack = Stack.from_param!(params[:id])
|
28
|
+
end
|
29
|
+
|
30
|
+
def continuous_delivery_schedule_params
|
31
|
+
params.require(:continuous_delivery_schedule).permit(
|
32
|
+
*Shipit::ContinuousDeliverySchedule::DAYS.flat_map do |day|
|
33
|
+
[
|
34
|
+
"#{day}_start",
|
35
|
+
"#{day}_end",
|
36
|
+
"#{day}_enabled"
|
37
|
+
]
|
38
|
+
end
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class DeploysController < ShipitController
|
4
5
|
include ChunksHelper
|
5
6
|
|
6
7
|
before_action :load_stack
|
7
|
-
before_action :load_deploy, only: %i
|
8
|
+
before_action :load_deploy, only: %i[show rollback revert]
|
8
9
|
before_action :load_until_commit, only: :create
|
9
10
|
helper_method :short_commit_sha
|
10
11
|
|
@@ -26,7 +27,7 @@ module Shipit
|
|
26
27
|
@until_commit,
|
27
28
|
current_user,
|
28
29
|
env: deploy_params[:env],
|
29
|
-
force: params[:force].present
|
30
|
+
force: params[:force].present?
|
30
31
|
)
|
31
32
|
respond_with(@deploy.stack, @deploy)
|
32
33
|
rescue Task::ConcurrentTaskRunning
|
@@ -43,9 +44,9 @@ module Shipit
|
|
43
44
|
end
|
44
45
|
|
45
46
|
def short_commit_sha(task)
|
46
|
-
|
47
|
-
|
48
|
-
|
47
|
+
return unless previous_successful_deploy_commit(task)
|
48
|
+
|
49
|
+
@short_commit_sha ||= @previous_successful_deploy_commit&.short_sha
|
49
50
|
end
|
50
51
|
|
51
52
|
private
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Shipit
|
3
4
|
class GithubAuthenticationController < ActionController::Base
|
4
5
|
include Shipit::Engine.routes.url_helpers
|
@@ -11,6 +12,11 @@ module Shipit
|
|
11
12
|
|
12
13
|
session[:user_id] = sign_in_github(auth)
|
13
14
|
|
15
|
+
# We need to set this so that the /events and /sidekiq endpoint
|
16
|
+
# which leverage `UserRequiredMiddleware` will recognize the user
|
17
|
+
# is authenticated.
|
18
|
+
session[:authenticated] = true
|
19
|
+
|
14
20
|
redirect_to(return_url)
|
15
21
|
end
|
16
22
|
|