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
@@ -0,0 +1 @@
|
|
1
|
+
<%# Placeholder to be used by the host application %>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<% subscribe events_path(channels: ["stack.#{@stack.id}"]), '#layout-content' %>
|
2
|
+
|
3
|
+
<%= render partial: 'shipit/stacks/header', locals: {stack: @stack} %>
|
4
|
+
<%= render partial: 'shipit/stacks/banners', locals: {stack: @stack} %>
|
5
|
+
|
6
|
+
<div class="wrapper">
|
7
|
+
<section>
|
8
|
+
<header class="section-header">
|
9
|
+
<h2>Available tasks</h2>
|
10
|
+
</header>
|
11
|
+
<ul class="task-list">
|
12
|
+
<% @stack.task_definitions.each do |definition| %>
|
13
|
+
<li class="task" id="task-<%= definition.id %>">
|
14
|
+
<%= link_to "#{definition.action}", new_stack_tasks_path(@stack, definition_id: definition.id), class: "trigger-deploy" %>
|
15
|
+
</li>
|
16
|
+
<% end %>
|
17
|
+
</ul>
|
18
|
+
</section>
|
19
|
+
|
20
|
+
<section>
|
21
|
+
<header class="section-header">
|
22
|
+
<h2>Previous Tasks</h2>
|
23
|
+
</header>
|
24
|
+
<ul class="commit-list">
|
25
|
+
<%= render @tasks %>
|
26
|
+
</ul>
|
27
|
+
</section>
|
28
|
+
</div>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<% content_for :page_title do %>
|
2
|
-
<h1
|
2
|
+
<h1><%= Shipit.app_name %></h1>
|
3
3
|
<% end %>
|
4
4
|
<% content_for :primary_navigation do %>
|
5
5
|
<%= link_to 'Add a stack', new_stack_path, class: 'btn secondary' %>
|
@@ -18,7 +18,7 @@
|
|
18
18
|
</ul>
|
19
19
|
<ul class="stack-lst">
|
20
20
|
<% @stacks.each do |stack| %>
|
21
|
-
<li class="search-item <%= stack.undeployed_commits? ? 'undeployed' : '' %> <%= @user_stacks.include?(stack.id) ? 'contributor' : 'not-matching' %>" data-search="<%= stack.repo_name %> <%= stack.environment %> <%= stack.deploy_url %>" data-stack-id="<%= stack.id %>">
|
21
|
+
<li class="stack search-item <%= stack.archived? ? 'archived' : '' %> <%= stack.undeployed_commits? ? 'undeployed' : '' %> <%= @user_stacks.include?(stack.id) ? 'contributor' : 'not-matching' %>" data-search="<%= stack.repo_name %> <%= stack.environment %> <%= stack.deploy_url %>" data-stack-id="<%= stack.id %>">
|
22
22
|
<%= link_to stack_path(stack), class: 'commits-path' do %>
|
23
23
|
<span class="col"><%= stack.repo_name %></span>
|
24
24
|
<small class="col"><%= stack.environment.capitalize %></small>
|
@@ -30,6 +30,11 @@
|
|
30
30
|
</ul>
|
31
31
|
|
32
32
|
<%= link_to 'show all stacks', '#', class: 'btn secondary show-all-stacks' %></p>
|
33
|
+
<% if @show_archived %>
|
34
|
+
<%= link_to 'hide archived stacks', '?', class: 'btn secondary' %></p>
|
35
|
+
<% else %>
|
36
|
+
<%= link_to 'show archived stacks', '?show_archived=1', class: 'btn secondary' %></p>
|
37
|
+
<% end %>
|
33
38
|
</section>
|
34
39
|
|
35
40
|
</div>
|
@@ -61,6 +61,7 @@
|
|
61
61
|
<%- end -%>
|
62
62
|
<% end %>
|
63
63
|
</div>
|
64
|
+
|
64
65
|
<div class="setting-section">
|
65
66
|
<h5>Resynchronize this stack</h5>
|
66
67
|
<table>
|
@@ -80,6 +81,24 @@
|
|
80
81
|
<%= button_to "Fetch URL", "", class: 'btn', data: {remote: ccmenu_url_url(stack_id: @stack.to_param)} %>
|
81
82
|
</div>
|
82
83
|
|
84
|
+
<div class="setting-section">
|
85
|
+
<% if @stack.archived? %>
|
86
|
+
<h5>Restore Stack</h5>
|
87
|
+
<p>This action will de-archive the Stack, restoring it in the stack list and unlocking it.</p>
|
88
|
+
<%= form_for @stack do |f| %>
|
89
|
+
<%= f.hidden_field :archived, value: false %>
|
90
|
+
<%= f.submit class: "btn", value: "Restore" %>
|
91
|
+
<% end %>
|
92
|
+
<% else %>
|
93
|
+
<h5>Archive Stack</h5>
|
94
|
+
<p>This action will archive the Stack, hiding it from the stack list and locking it. It can still be found if you know the URL and de-archived.</p>
|
95
|
+
<%= form_for @stack do |f| %>
|
96
|
+
<%= f.hidden_field :archived, value: true %>
|
97
|
+
<%= f.submit class: "btn", value: "Archive" %>
|
98
|
+
<% end %>
|
99
|
+
<% end %>
|
100
|
+
</div>
|
101
|
+
|
83
102
|
<div class="setting-section">
|
84
103
|
<h5>Delete this stack</h5>
|
85
104
|
<p>This action will delete the stack from Ship it permanently. Be careful.</p>
|
@@ -0,0 +1,82 @@
|
|
1
|
+
<%= render partial: 'shipit/stacks/header', locals: {stack: @stack} %>
|
2
|
+
<%= render partial: 'shipit/stacks/banners', locals: {stack: @stack} %>
|
3
|
+
|
4
|
+
<div class="wrapper">
|
5
|
+
<section>
|
6
|
+
<header class="section-header">
|
7
|
+
<h2>Statistics – Past 7 Days</h2>
|
8
|
+
</header>
|
9
|
+
|
10
|
+
<div class="row">
|
11
|
+
<div class="box">
|
12
|
+
<div class="box__body">
|
13
|
+
<div class="stats">
|
14
|
+
<div class="stats__amount"><%= @deploy_stats.count %></div>
|
15
|
+
<div class="stats__caption">Deploys</div>
|
16
|
+
<div class="stats__change">
|
17
|
+
<div class="stats__value stats__value--<%=positive_negative_class(@diffs[:count])%>"><%= number_to_percentage(@diffs[:count], precision: 1) %></div>
|
18
|
+
<div class="stats__period">this week</div>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="box">
|
25
|
+
<div class="box__body">
|
26
|
+
<div class="stats">
|
27
|
+
<div class="stats__amount"><%= number_to_percentage(@deploy_stats.success_rate, precision: 1) %></div>
|
28
|
+
<div class="stats__caption">Deploys success rate</div>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
<div class="box">
|
34
|
+
<div class="box__body">
|
35
|
+
<div class="stats">
|
36
|
+
<div class="stats__amount"><%= Shipit::Duration.new @deploy_stats.average_duration %></div>
|
37
|
+
<div class="stats__caption">Average deploy time</div>
|
38
|
+
<div class="stats__change">
|
39
|
+
<div class="stats__value stats__value--<%=positive_negative_class(@diffs[:average_duration])%>"><%= number_to_percentage(@diffs[:average_duration], precision: 1) %></div>
|
40
|
+
<div class="stats__period">this week</div>
|
41
|
+
</div>
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
</div>
|
45
|
+
</div>
|
46
|
+
|
47
|
+
<div class="row">
|
48
|
+
<div class="box">
|
49
|
+
<div class="box__body">
|
50
|
+
<div class="stats">
|
51
|
+
<div class="stats__amount"><%= Shipit::Duration.new @deploy_stats.min_duration %></div>
|
52
|
+
<div class="stats__caption">Min deploy time</div>
|
53
|
+
</div>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
|
57
|
+
<div class="box">
|
58
|
+
<div class="box__body">
|
59
|
+
<div class="stats">
|
60
|
+
<div class="stats__amount"><%= Shipit::Duration.new @deploy_stats.median_duration %></div>
|
61
|
+
<div class="stats__caption">Median deploy time</div>
|
62
|
+
<div class="stats__change">
|
63
|
+
<div class="stats__value stats__value--<%=positive_negative_class(@diffs[:median_duration])%>"><%= number_to_percentage(@diffs[:median_duration], precision: 1) %></div>
|
64
|
+
<div class="stats__period">this week</div>
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
</div>
|
69
|
+
|
70
|
+
<div class="box">
|
71
|
+
<div class="box__body">
|
72
|
+
<div class="stats">
|
73
|
+
<div class="stats__amount"><%= Shipit::Duration.new @deploy_stats.max_duration %></div>
|
74
|
+
<div class="stats__caption">Max deploy time</div>
|
75
|
+
</div>
|
76
|
+
</div>
|
77
|
+
</div>
|
78
|
+
</div>
|
79
|
+
|
80
|
+
</section>
|
81
|
+
|
82
|
+
</div>
|
data/config/locales/en.yml
CHANGED
@@ -20,10 +20,21 @@
|
|
20
20
|
# available at http://guides.rubyonrails.org/i18n.html.
|
21
21
|
|
22
22
|
en:
|
23
|
+
stack:
|
24
|
+
nav:
|
25
|
+
refresh: Refresh statuses & commits
|
26
|
+
commits: Commits & Deploys
|
27
|
+
settings: Settings
|
28
|
+
timeline: Timeline
|
29
|
+
statistics: Stats
|
30
|
+
merge_queue: "Merge Queue (%{count})"
|
31
|
+
view_on_github: View on GitHub
|
32
|
+
links: More
|
33
|
+
deploy_link: View website
|
23
34
|
commit:
|
24
|
-
lock:
|
25
|
-
unlock:
|
26
|
-
unlock_with_author: "%{author} marked this commit as unsafe to deploy. Click to mark
|
35
|
+
lock: Click to mark this commit as unsafe to deploy.
|
36
|
+
unlock: Click to mark this commit as safe to deploy.
|
37
|
+
unlock_with_author: "%{author} marked this commit as unsafe to deploy. Click to mark this commit as safe to deploy."
|
27
38
|
confirm_unlock: Mark this commit as safe to deploy?
|
28
39
|
release:
|
29
40
|
validate: Mark the release as healthy
|
@@ -72,12 +83,14 @@ en:
|
|
72
83
|
ascii: "contains non-ASCII characters"
|
73
84
|
deployment_description:
|
74
85
|
deploy:
|
75
|
-
|
86
|
+
in_progress: "%{author} triggered the deploy of %{stack} to %{sha}"
|
87
|
+
pending: "%{author} created the deploy of %{stack} to %{sha}"
|
76
88
|
success: "%{author} deployed %{stack} to %{sha}"
|
77
89
|
failure: "Deploy of %{stack} to %{sha} by %{author} failed"
|
78
90
|
error: "Deploy of %{stack} to %{sha} by %{author} failed"
|
79
91
|
rollback:
|
80
|
-
|
92
|
+
in_progress: "%{author} triggered the deploy of %{stack} to %{sha}"
|
93
|
+
pending: "%{author} created the rollback of %{stack} to %{sha}"
|
81
94
|
success: "%{author} rolled back %{stack} to %{sha}"
|
82
95
|
failure: "Rollback of %{stack} to %{sha} by %{author} failed"
|
83
96
|
error: "Rollback of %{stack} to %{sha} by %{author} failed"
|
data/config/routes.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
Shipit::Engine.routes.draw do
|
2
3
|
stack_id_format = %r{[^/]+/[^/]+/[^/]+}
|
3
4
|
sha_format = /[\da-f]{6,40}/
|
@@ -17,6 +18,7 @@ Shipit::Engine.routes.draw do
|
|
17
18
|
scope '/stacks/*id', id: stack_id_format, as: :stack do
|
18
19
|
get '/' => 'stacks#show'
|
19
20
|
delete '/' => 'stacks#destroy'
|
21
|
+
patch '/' => 'stacks#update'
|
20
22
|
end
|
21
23
|
|
22
24
|
scope '/stacks/*stack_id', stack_id: stack_id_format, as: :stack do
|
@@ -28,6 +30,7 @@ Shipit::Engine.routes.draw do
|
|
28
30
|
resources :deploys, only: %i(index create) do
|
29
31
|
resources :release_statuses, only: %i(create)
|
30
32
|
end
|
33
|
+
resources :rollbacks, only: %i(create)
|
31
34
|
resources :commits, only: %i(index)
|
32
35
|
resources :pull_requests, only: %i(index show update destroy)
|
33
36
|
post '/task/:task_name' => 'tasks#trigger', as: :trigger_task
|
@@ -47,6 +50,7 @@ Shipit::Engine.routes.draw do
|
|
47
50
|
delete '/merge_status/*stack_id/pull/:number', action: :dequeue, controller: :merge_status, id: stack_id_format, as: :dequeue_pull_request
|
48
51
|
|
49
52
|
# Humans
|
53
|
+
resources :api_clients
|
50
54
|
resources :stacks, only: %i(new create index)
|
51
55
|
|
52
56
|
scope '/github/auth/github', as: :github_authentication, controller: :github_authentication do
|
@@ -61,6 +65,8 @@ Shipit::Engine.routes.draw do
|
|
61
65
|
patch '/' => 'stacks#update'
|
62
66
|
delete '/' => 'stacks#destroy'
|
63
67
|
get :settings, controller: :stacks
|
68
|
+
get :all_tasks, controller: :stacks, as: :tasks_list
|
69
|
+
get :statistics, controller: :stacks
|
64
70
|
post :refresh, controller: :stacks
|
65
71
|
get :refresh, controller: :stacks # For easier design, sorry :/
|
66
72
|
post :clear_git_cache, controller: :stacks
|
@@ -72,7 +78,9 @@ Shipit::Engine.routes.draw do
|
|
72
78
|
|
73
79
|
scope '/*stack_id', stack_id: stack_id_format, as: :stack do
|
74
80
|
get '/commit/:sha/checks' => 'commit_checks#show', as: :commit_checks
|
75
|
-
get '/commit/:sha/checks/tail' => 'commit_checks#tail', as: :tail_commit_checks, defaults: {format: :json}
|
81
|
+
get '/commit/:sha/checks/tail' => 'commit_checks#tail', as: :tail_commit_checks, defaults: { format: :json }
|
82
|
+
|
83
|
+
get '/stats' => 'stats#show', as: :stats
|
76
84
|
|
77
85
|
resources :rollbacks, only: %i(create)
|
78
86
|
resources :commits, only: %i(update)
|
@@ -85,7 +93,7 @@ Shipit::Engine.routes.draw do
|
|
85
93
|
|
86
94
|
member do
|
87
95
|
post :abort
|
88
|
-
get :tail, defaults: {format: :json}
|
96
|
+
get :tail, defaults: { format: :json }
|
89
97
|
end
|
90
98
|
end
|
91
99
|
|
@@ -102,4 +110,8 @@ Shipit::Engine.routes.draw do
|
|
102
110
|
resources :pull_requests, only: %i(index destroy create)
|
103
111
|
end
|
104
112
|
get '/stacks/:id' => 'stacks#lookup'
|
113
|
+
|
114
|
+
scope '/*repo', repo: %r{[^/]+/[^/]+}, as: :stack_search do
|
115
|
+
get '/' => 'stacks#index'
|
116
|
+
end
|
105
117
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class CreateShipitRepositories < ActiveRecord::Migration[6.0]
|
2
|
+
def change
|
3
|
+
create_table :repositories do |t|
|
4
|
+
t.string :owner, limit: 39, null: false
|
5
|
+
t.string :name, limit: 100, null: false
|
6
|
+
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
|
10
|
+
add_index :repositories, ["owner", "name"], name: "repository_unicity", unique: true
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class AddRepositoryReferenceToStacks < ActiveRecord::Migration[6.0]
|
2
|
+
def up
|
3
|
+
change_table(:stacks) do |t|
|
4
|
+
t.references :repository
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def down
|
9
|
+
change_column :stacks, :repo_name, :string, null: false
|
10
|
+
change_column :stacks, :repo_owner, :string, null: false
|
11
|
+
change_table(:stacks) do |t|
|
12
|
+
t.remove_references :repository
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class BackfillRepositoryData < ActiveRecord::Migration[6.0]
|
2
|
+
def up
|
3
|
+
repositories = {}
|
4
|
+
Shipit::Stack.all.each do |stack|
|
5
|
+
repo_owner = stack[:repo_owner].downcase
|
6
|
+
repo_name = stack[:repo_name].downcase
|
7
|
+
|
8
|
+
repository = (repositories[[repo_owner, repo_name]] ||= Shipit::Repository.create_or_find_by!(
|
9
|
+
owner: repo_owner,
|
10
|
+
name: repo_name,
|
11
|
+
))
|
12
|
+
|
13
|
+
stack.update_column(:repository_id, repository.id)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def down
|
18
|
+
Shipit::Repository.find_each do |repository|
|
19
|
+
repository.stacks.update_all(repo_owner: repository.owner, repo_name: repository.name)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class RemoveRepositoryInformationFromStacks < ActiveRecord::Migration[6.0]
|
2
|
+
def up
|
3
|
+
change_column_null :stacks, :repository_id, false
|
4
|
+
change_table(:stacks) do |t|
|
5
|
+
t.remove_index ["repo_owner", "repo_name", "environment"]
|
6
|
+
t.remove :repo_owner
|
7
|
+
t.remove :repo_name
|
8
|
+
t.index ["repository_id", "environment"], name: "stack_unicity", unique: true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def down
|
13
|
+
change_table(:stacks) do |t|
|
14
|
+
t.column :repo_name, :string, limit: 100
|
15
|
+
t.column :repo_owner, :string, limit: 39
|
16
|
+
t.remove_index ["repository_id", "environment"]
|
17
|
+
t.index ["repo_owner", "repo_name", "environment"], name: "stack_unicity", unique: true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/shipit.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'active_support/all'
|
2
3
|
require 'active_model_serializers'
|
3
4
|
require 'state_machines-activerecord'
|
@@ -47,7 +48,8 @@ require 'shipit/deploy_commands'
|
|
47
48
|
require 'shipit/rollback_commands'
|
48
49
|
require 'shipit/environment_variables'
|
49
50
|
require 'shipit/stat'
|
50
|
-
require 'shipit/
|
51
|
+
require 'shipit/github_http_cache_middleware'
|
52
|
+
require 'shipit/same_site_cookie_middleware'
|
51
53
|
require 'shipit/cast_value'
|
52
54
|
require 'shipit/line_buffer'
|
53
55
|
|
@@ -60,7 +62,7 @@ module Shipit
|
|
60
62
|
delegate :table_name_prefix, to: :secrets
|
61
63
|
|
62
64
|
attr_accessor :disable_api_authentication, :timeout_exit_codes
|
63
|
-
attr_writer :internal_hook_receivers, :task_logger
|
65
|
+
attr_writer :internal_hook_receivers, :task_logger, :preferred_org_emails
|
64
66
|
|
65
67
|
self.timeout_exit_codes = [].freeze
|
66
68
|
|
@@ -68,6 +70,10 @@ module Shipit
|
|
68
70
|
ENV['SHIPIT_DISABLE_AUTH'].present?
|
69
71
|
end
|
70
72
|
|
73
|
+
def enable_samesite_middleware?
|
74
|
+
ENV['SHIPIT_ENABLE_SAMESITE_NONE'].present?
|
75
|
+
end
|
76
|
+
|
71
77
|
def app_name
|
72
78
|
@app_name ||= secrets.app_name || Rails.application.class.name.split(':').first || 'Shipit'
|
73
79
|
end
|
@@ -106,22 +112,6 @@ module Shipit
|
|
106
112
|
end
|
107
113
|
end
|
108
114
|
|
109
|
-
def new_faraday_stack
|
110
|
-
Faraday::RackBuilder.new do |builder|
|
111
|
-
builder.use(
|
112
|
-
Faraday::HttpCache,
|
113
|
-
shared_cache: false,
|
114
|
-
store: Rails.cache,
|
115
|
-
logger: Rails.logger,
|
116
|
-
serializer: NullSerializer,
|
117
|
-
)
|
118
|
-
builder.use StripCacheControl
|
119
|
-
builder.use Octokit::Response::RaiseError
|
120
|
-
builder.adapter Faraday.default_adapter
|
121
|
-
yield builder if block_given?
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
115
|
def api_clients_secret
|
126
116
|
secrets.api_clients_secret.presence || secrets.secret_key_base
|
127
117
|
end
|
@@ -138,6 +128,10 @@ module Shipit
|
|
138
128
|
secrets.default_merge_method || 'merge'
|
139
129
|
end
|
140
130
|
|
131
|
+
def update_latest_deployed_ref
|
132
|
+
secrets.update_latest_deployed_ref
|
133
|
+
end
|
134
|
+
|
141
135
|
def enforce_publish_config
|
142
136
|
secrets.enforce_publish_config.presence
|
143
137
|
end
|
@@ -163,7 +157,7 @@ module Shipit
|
|
163
157
|
end
|
164
158
|
|
165
159
|
def env
|
166
|
-
{'SHIPIT' => '1'}.merge(secrets.env || {})
|
160
|
+
{ 'SHIPIT' => '1' }.merge(secrets.env || {})
|
167
161
|
end
|
168
162
|
|
169
163
|
def shell_paths
|
@@ -175,7 +169,7 @@ module Shipit
|
|
175
169
|
if revision_file.exist?
|
176
170
|
revision_file.read
|
177
171
|
else
|
178
|
-
|
172
|
+
%x(git rev-parse HEAD)
|
179
173
|
end.strip
|
180
174
|
end
|
181
175
|
end
|
@@ -196,6 +190,10 @@ module Shipit
|
|
196
190
|
@internal_hook_receivers ||= []
|
197
191
|
end
|
198
192
|
|
193
|
+
def preferred_org_emails
|
194
|
+
@preferred_org_emails ||= []
|
195
|
+
end
|
196
|
+
|
199
197
|
def task_logger
|
200
198
|
@task_logger ||= Logger.new(nil)
|
201
199
|
end
|