pgbus 0.18.2 → 0.19.1
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/CHANGELOG.md +345 -142
- data/README.md +49 -0
- data/app/controllers/pgbus/deploy_tasks_controller.rb +38 -0
- data/app/controllers/pgbus/frontends_controller.rb +10 -8
- data/app/helpers/pgbus/application_helper.rb +4 -3
- data/app/helpers/pgbus/deploy_tasks_helper.rb +77 -0
- data/app/helpers/pgbus/processes_helper.rb +1 -1
- data/app/models/pgbus/deploy_task.rb +104 -0
- data/app/models/pgbus/deploy_task_run.rb +45 -0
- data/app/models/pgbus/job_stat.rb +4 -0
- data/app/models/pgbus/processed_event.rb +3 -1
- data/app/models/pgbus/stream_queue.rb +34 -3
- data/app/models/pgbus/stream_stat.rb +3 -0
- data/app/views/layouts/pgbus/application.html.erb +2 -0
- data/app/views/pgbus/deploy_tasks/_rollover_banner.html.erb +25 -0
- data/app/views/pgbus/deploy_tasks/_tasks_table.html.erb +71 -0
- data/app/views/pgbus/deploy_tasks/index.html.erb +6 -0
- data/app/views/pgbus/deploy_tasks/show.html.erb +134 -0
- data/config/i18n-tasks.yml +2 -0
- data/config/locales/da.yml +97 -0
- data/config/locales/de.yml +97 -0
- data/config/locales/en.yml +97 -0
- data/config/locales/es.yml +97 -0
- data/config/locales/fi.yml +97 -0
- data/config/locales/fr.yml +97 -0
- data/config/locales/it.yml +97 -0
- data/config/locales/ja.yml +97 -0
- data/config/locales/nb.yml +97 -0
- data/config/locales/nl.yml +97 -0
- data/config/locales/pt.yml +97 -0
- data/config/locales/sv.yml +97 -0
- data/config/routes.rb +7 -0
- data/lib/generators/pgbus/add_deploy_tasks_generator.rb +51 -0
- data/lib/generators/pgbus/templates/add_deploy_tasks_tables.rb.erb +43 -0
- data/lib/generators/pgbus/templates/deploy_tasks.yml.erb +42 -0
- data/lib/generators/pgbus/templates/migration.rb.erb +43 -0
- data/lib/pgbus/active_job/current_attributes.rb +3 -1
- data/lib/pgbus/batch.rb +17 -9
- data/lib/pgbus/cli.rb +3 -0
- data/lib/pgbus/client/read_after.rb +10 -1
- data/lib/pgbus/client.rb +54 -9
- data/lib/pgbus/concurrency.rb +3 -0
- data/lib/pgbus/configuration/deploy_settings.rb +46 -0
- data/lib/pgbus/configuration.rb +87 -9
- data/lib/pgbus/current_attributes.rb +3 -1
- data/lib/pgbus/dedup_cache.rb +15 -7
- data/lib/pgbus/deploy/revision.rb +59 -0
- data/lib/pgbus/deploy/rollover.rb +65 -0
- data/lib/pgbus/deploy/runner.rb +259 -0
- data/lib/pgbus/deploy/task.rb +105 -0
- data/lib/pgbus/engine.rb +28 -0
- data/lib/pgbus/event_bus/handler.rb +16 -4
- data/lib/pgbus/execution_pools/async_pool.rb +23 -2
- data/lib/pgbus/execution_pools/thread_pool.rb +22 -0
- data/lib/pgbus/execution_pools.rb +26 -0
- data/lib/pgbus/generators/migration_detector.rb +11 -0
- data/lib/pgbus/instrumentation.rb +3 -0
- data/lib/pgbus/integrations/appsignal/probe.rb +17 -9
- data/lib/pgbus/integrations/appsignal/subscriber.rb +30 -18
- data/lib/pgbus/integrations/appsignal.rb +26 -16
- data/lib/pgbus/mcp/rack_app.rb +1 -1
- data/lib/pgbus/mcp/server.rb +2 -1
- data/lib/pgbus/mcp/tools/deploy_tasks_tool.rb +86 -0
- data/lib/pgbus/mcp.rb +1 -0
- data/lib/pgbus/metrics/subscriber.rb +35 -21
- data/lib/pgbus/outbox/poller.rb +1 -0
- data/lib/pgbus/process/consumer.rb +2 -1
- data/lib/pgbus/process/consumer_priority.rb +1 -1
- data/lib/pgbus/process/dispatcher.rb +18 -1
- data/lib/pgbus/process/heartbeat.rb +7 -2
- data/lib/pgbus/process/lifecycle.rb +5 -5
- data/lib/pgbus/process/notify_listener.rb +32 -18
- data/lib/pgbus/process/supervisor.rb +35 -3
- data/lib/pgbus/process/wake_pipe.rb +4 -1
- data/lib/pgbus/process/worker.rb +5 -2
- data/lib/pgbus/recurring/scheduler.rb +54 -20
- data/lib/pgbus/retry_backoff.rb +3 -0
- data/lib/pgbus/shareable.rb +70 -0
- data/lib/pgbus/streams/broadcastable_override.rb +3 -0
- data/lib/pgbus/streams/presence.rb +6 -7
- data/lib/pgbus/streams.rb +38 -27
- data/lib/pgbus/testing.rb +19 -3
- data/lib/pgbus/uniqueness.rb +3 -0
- data/lib/pgbus/version.rb +1 -1
- data/lib/pgbus/visibility_heartbeat.rb +51 -34
- data/lib/pgbus/web/authentication.rb +19 -2
- data/lib/pgbus/web/data_source/deploy_task_list.rb +114 -0
- data/lib/pgbus/web/data_source/list_counts.rb +10 -7
- data/lib/pgbus/web/data_source.rb +1 -0
- data/lib/pgbus/web/deploy_task_state.rb +51 -0
- data/lib/pgbus/web/health_server.rb +4 -1
- data/lib/pgbus/web/process_activity.rb +1 -1
- data/lib/pgbus/web/streamer/heartbeat.rb +4 -1
- data/lib/pgbus/web/streamer/hub_client.rb +4 -1
- data/lib/pgbus/web/streamer/listener.rb +10 -1
- data/lib/pgbus/web/streamer/master_hub.rb +11 -5
- data/lib/pgbus/web/streamer/master_hub_boot.rb +3 -1
- data/lib/pgbus/web/streamer/outbound_pump.rb +4 -1
- data/lib/pgbus/web/streamer/peer_close_watcher.rb +4 -1
- data/lib/pgbus/web/streamer/stream_event_dispatcher.rb +13 -1
- data/lib/pgbus.rb +92 -30
- data/sig/pgbus/active_job/adapter.rbs +57 -0
- data/sig/pgbus/client.rbs +78 -0
- data/sig/pgbus/configuration.rbs +326 -0
- data/sig/pgbus/streams/stream.rbs +25 -0
- data/sig/pgbus/streams.rbs +22 -0
- data/sig/pgbus.rbs +73 -0
- metadata +27 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<turbo-frame id="deploy-tasks" data-auto-refresh data-turbo-action="advance"
|
|
2
|
+
data-src="<%= pgbus.deploy_tasks_path(request.query_parameters.merge(frame: "deploy_tasks")) %>">
|
|
3
|
+
<%= render "pgbus/deploy_tasks/rollover_banner" %>
|
|
4
|
+
<div class="rounded-lg bg-white dark:bg-gray-800 shadow ring-1 ring-gray-200 dark:ring-gray-700">
|
|
5
|
+
<table class="pgbus-table min-w-full divide-y divide-gray-200 dark:divide-gray-700">
|
|
6
|
+
<thead class="bg-gray-50 dark:bg-gray-900">
|
|
7
|
+
<tr>
|
|
8
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.tasks_table.headers.task") %></th>
|
|
9
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.tasks_table.headers.version") %></th>
|
|
10
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.tasks_table.headers.queue") %></th>
|
|
11
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.tasks_table.headers.last_run") %></th>
|
|
12
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.tasks_table.headers.state") %></th>
|
|
13
|
+
<th class="px-4 py-3 text-right text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.tasks_table.headers.actions") %></th>
|
|
14
|
+
</tr>
|
|
15
|
+
</thead>
|
|
16
|
+
<tbody class="divide-y divide-gray-100 dark:divide-gray-700">
|
|
17
|
+
<% @deploy_tasks.each do |task| %>
|
|
18
|
+
<% result = Pgbus::Web::DeployTaskState.present(task, @rollover) %>
|
|
19
|
+
<% last_run = pgbus_deploy_last_run(task) %>
|
|
20
|
+
<tr data-state="<%= result.state %>" class="hover:bg-gray-50 dark:hover:bg-gray-700/50">
|
|
21
|
+
<td data-label="<%= t("pgbus.deploy_tasks.tasks_table.headers.task") %>" class="px-4 py-3">
|
|
22
|
+
<div>
|
|
23
|
+
<%= pgbus_link_to task[:key], pgbus.deploy_task_path(task[:id]), data: { turbo_frame: "_top" } %>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="text-xs text-gray-500 dark:text-gray-400"><%= task[:class_name] || task[:command]&.truncate(40) %></div>
|
|
26
|
+
<% if task[:description] %>
|
|
27
|
+
<div class="text-xs text-gray-500 dark:text-gray-400 mt-0.5"><%= task[:description] %></div>
|
|
28
|
+
<% end %>
|
|
29
|
+
</td>
|
|
30
|
+
<td data-label="<%= t("pgbus.deploy_tasks.tasks_table.headers.version") %>" class="px-4 py-3 text-sm text-gray-900 dark:text-white">
|
|
31
|
+
<%= pgbus_deploy_version(task) %>
|
|
32
|
+
</td>
|
|
33
|
+
<td data-label="<%= t("pgbus.deploy_tasks.tasks_table.headers.queue") %>" class="px-4 py-3 text-sm text-gray-600 dark:text-gray-300">
|
|
34
|
+
<%= task[:queue_name] || t("pgbus.deploy_tasks.default_queue") %>
|
|
35
|
+
</td>
|
|
36
|
+
<td data-label="<%= t("pgbus.deploy_tasks.tasks_table.headers.last_run") %>" class="px-4 py-3 text-sm text-gray-600 dark:text-gray-300">
|
|
37
|
+
<% if last_run %>
|
|
38
|
+
<%= pgbus_time(last_run[:run_at]) %>
|
|
39
|
+
<span class="block text-xs text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.triggered_by.#{last_run[:triggered_by]}") %></span>
|
|
40
|
+
<% else %>
|
|
41
|
+
<%= t("pgbus.deploy_tasks.tasks_table.never") %>
|
|
42
|
+
<% end %>
|
|
43
|
+
</td>
|
|
44
|
+
<td data-label="<%= t("pgbus.deploy_tasks.tasks_table.headers.state") %>" class="px-4 py-3">
|
|
45
|
+
<%= pgbus_deploy_state_badge(result) %>
|
|
46
|
+
<p class="mt-1 text-xs text-gray-600 dark:text-gray-300"><%= pgbus_deploy_task_reason(result) %></p>
|
|
47
|
+
</td>
|
|
48
|
+
<td data-label="<%= t("pgbus.deploy_tasks.tasks_table.headers.actions") %>" class="px-4 py-3 text-right space-x-1">
|
|
49
|
+
<%= pgbus_button_to task[:enabled] ? t("pgbus.deploy_tasks.disable") : t("pgbus.deploy_tasks.enable"),
|
|
50
|
+
pgbus.toggle_deploy_task_path(task[:id]),
|
|
51
|
+
variant: task[:enabled] ? :warning : :success, size: :sm, form: { data: { turbo_frame: "_top" } } %>
|
|
52
|
+
<% if task[:enabled] %>
|
|
53
|
+
<%= pgbus_button_to t("pgbus.deploy_tasks.run_now"), pgbus.enqueue_deploy_task_path(task[:id]),
|
|
54
|
+
variant: :primary, size: :sm, form: { data: { turbo_frame: "_top" } } %>
|
|
55
|
+
<% end %>
|
|
56
|
+
</td>
|
|
57
|
+
</tr>
|
|
58
|
+
<% end %>
|
|
59
|
+
<% if @deploy_tasks.empty? %>
|
|
60
|
+
<%= render "pgbus/shared/empty_row", colspan: 6,
|
|
61
|
+
message: safe_join([content_tag(:p, t("pgbus.deploy_tasks.tasks_table.empty_title"), class: "text-lg font-medium"),
|
|
62
|
+
content_tag(:p, t("pgbus.deploy_tasks.tasks_table.empty_hint_html"), class: "mt-1")]) %>
|
|
63
|
+
<% end %>
|
|
64
|
+
</tbody>
|
|
65
|
+
</table>
|
|
66
|
+
<%= render "pgbus/shared/pager", page: @page, per_page: @per_page, shown: @deploy_tasks.size,
|
|
67
|
+
total_count: @deploy_tasks_count.total,
|
|
68
|
+
has_more: @deploy_tasks_count.capped? && @deploy_tasks.size == @per_page,
|
|
69
|
+
page_path: ->(n) { pgbus.deploy_tasks_path(page: n) } %>
|
|
70
|
+
</div>
|
|
71
|
+
</turbo-frame>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<div class="flex items-center justify-between mb-6">
|
|
2
|
+
<h1 class="text-2xl font-bold text-gray-900 dark:text-white"><%= t("pgbus.deploy_tasks.index.title") %></h1>
|
|
3
|
+
<span class="text-sm text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.index.task_count", count: @deploy_tasks_count.total) %></span>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<%= render "pgbus/deploy_tasks/tasks_table" %>
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
<% result = Pgbus::Web::DeployTaskState.present(@task, @rollover) %>
|
|
2
|
+
<% last_run = pgbus_deploy_last_run(@task) %>
|
|
3
|
+
<div class="mb-6">
|
|
4
|
+
<div class="flex items-center justify-between">
|
|
5
|
+
<div>
|
|
6
|
+
<h1 class="text-2xl font-bold text-gray-900 dark:text-white"><%= @task[:key] %></h1>
|
|
7
|
+
<p class="mt-1 text-sm text-gray-500 dark:text-gray-400"><%= @task[:class_name] || @task[:command] %></p>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="flex space-x-2">
|
|
10
|
+
<%= pgbus_button_to @task[:enabled] ? t("pgbus.deploy_tasks.disable") : t("pgbus.deploy_tasks.enable"),
|
|
11
|
+
pgbus.toggle_deploy_task_path(@task[:id]),
|
|
12
|
+
variant: @task[:enabled] ? :warning : :success %>
|
|
13
|
+
<% if @task[:enabled] %>
|
|
14
|
+
<%= pgbus_button_to t("pgbus.deploy_tasks.run_now"), pgbus.enqueue_deploy_task_path(@task[:id]), variant: :primary %>
|
|
15
|
+
<% end %>
|
|
16
|
+
<%= pgbus_link_to t("pgbus.deploy_tasks.show.back"), pgbus.deploy_tasks_path, variant: :secondary %>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8">
|
|
22
|
+
<div class="rounded-lg bg-white dark:bg-gray-800 p-5 shadow ring-1 ring-gray-200 dark:ring-gray-700">
|
|
23
|
+
<p class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.state") %></p>
|
|
24
|
+
<p class="mt-1"><%= pgbus_deploy_state_badge(result) %></p>
|
|
25
|
+
<p class="mt-1 text-xs text-gray-600 dark:text-gray-300"><%= pgbus_deploy_task_reason(result) %></p>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<div class="rounded-lg bg-white dark:bg-gray-800 p-5 shadow ring-1 ring-gray-200 dark:ring-gray-700">
|
|
29
|
+
<p class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.version") %></p>
|
|
30
|
+
<p class="mt-1 text-lg font-semibold text-gray-900 dark:text-white"><%= pgbus_deploy_version(@task) %></p>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
<div class="rounded-lg bg-white dark:bg-gray-800 p-5 shadow ring-1 ring-gray-200 dark:ring-gray-700">
|
|
34
|
+
<p class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.last_run") %></p>
|
|
35
|
+
<% if last_run %>
|
|
36
|
+
<p class="mt-1 text-lg font-semibold text-gray-900 dark:text-white"><%= pgbus_time(last_run[:run_at]) %></p>
|
|
37
|
+
<p class="text-xs text-gray-500 dark:text-gray-400"><%= pgbus_absolute_time(last_run[:run_at]) %> · <%= t("pgbus.deploy_tasks.triggered_by.#{last_run[:triggered_by]}") %></p>
|
|
38
|
+
<% else %>
|
|
39
|
+
<p class="mt-1 text-lg font-semibold text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.tasks_table.never") %></p>
|
|
40
|
+
<% end %>
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<div class="rounded-lg bg-white dark:bg-gray-800 shadow ring-1 ring-gray-200 dark:ring-gray-700 mb-8">
|
|
45
|
+
<div class="px-4 py-3 border-b border-gray-200 dark:border-gray-700">
|
|
46
|
+
<h2 class="text-lg font-medium text-gray-900 dark:text-white"><%= t("pgbus.deploy_tasks.show.configuration") %></h2>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="p-4">
|
|
49
|
+
<dl class="grid grid-cols-1 sm:grid-cols-2 gap-4">
|
|
50
|
+
<div>
|
|
51
|
+
<dt class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.labels.job_class") %></dt>
|
|
52
|
+
<dd class="mt-1 text-sm text-gray-900 dark:text-white"><%= @task[:class_name] || "—" %></dd>
|
|
53
|
+
</div>
|
|
54
|
+
<% if @task[:command] %>
|
|
55
|
+
<div>
|
|
56
|
+
<dt class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.labels.command") %></dt>
|
|
57
|
+
<dd class="mt-1 text-sm text-gray-900 dark:text-white font-mono text-xs"><%= @task[:command] %></dd>
|
|
58
|
+
</div>
|
|
59
|
+
<% end %>
|
|
60
|
+
<div>
|
|
61
|
+
<dt class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.labels.queue") %></dt>
|
|
62
|
+
<dd class="mt-1 text-sm text-gray-900 dark:text-white"><%= @task[:queue_name] || t("pgbus.deploy_tasks.default_queue") %></dd>
|
|
63
|
+
</div>
|
|
64
|
+
<div>
|
|
65
|
+
<dt class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.labels.priority") %></dt>
|
|
66
|
+
<dd class="mt-1 text-sm text-gray-900 dark:text-white"><%= @task[:priority] %></dd>
|
|
67
|
+
</div>
|
|
68
|
+
<% if @task[:armed_for] && @task[:armed_at] %>
|
|
69
|
+
<div>
|
|
70
|
+
<dt class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.labels.armed") %></dt>
|
|
71
|
+
<dd class="mt-1 text-sm text-gray-900 dark:text-white"><%= t("pgbus.deploy_tasks.show.armed_html", ago: pgbus_time(@task[:armed_at]),
|
|
72
|
+
armed_for: @task[:every_deploy] ? @task[:armed_for] : t("pgbus.deploy_tasks.version", version: @task[:armed_for])) %></dd>
|
|
73
|
+
</div>
|
|
74
|
+
<% end %>
|
|
75
|
+
<% if @task[:arguments]&.any? %>
|
|
76
|
+
<div class="sm:col-span-2">
|
|
77
|
+
<dt class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.labels.arguments") %></dt>
|
|
78
|
+
<dd class="mt-1 text-sm text-gray-900 dark:text-white font-mono text-xs"><%= @task[:arguments].inspect %></dd>
|
|
79
|
+
</div>
|
|
80
|
+
<% end %>
|
|
81
|
+
<% if @task[:description] %>
|
|
82
|
+
<div class="sm:col-span-2">
|
|
83
|
+
<dt class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.labels.description") %></dt>
|
|
84
|
+
<dd class="mt-1 text-sm text-gray-900 dark:text-white"><%= @task[:description] %></dd>
|
|
85
|
+
</div>
|
|
86
|
+
<% end %>
|
|
87
|
+
<div>
|
|
88
|
+
<dt class="text-sm font-medium text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.labels.source") %></dt>
|
|
89
|
+
<dd class="mt-1 text-sm text-gray-900 dark:text-white"><%= @task[:static] ? t("pgbus.deploy_tasks.show.source_config") : t("pgbus.deploy_tasks.show.source_dynamic") %></dd>
|
|
90
|
+
</div>
|
|
91
|
+
</dl>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
<div class="rounded-lg bg-white dark:bg-gray-800 shadow ring-1 ring-gray-200 dark:ring-gray-700">
|
|
96
|
+
<div class="px-4 py-3 border-b border-gray-200 dark:border-gray-700">
|
|
97
|
+
<h2 class="text-lg font-medium text-gray-900 dark:text-white"><%= t("pgbus.deploy_tasks.show.recent_runs") %></h2>
|
|
98
|
+
</div>
|
|
99
|
+
<table class="pgbus-table min-w-full divide-y divide-gray-200 dark:divide-gray-700">
|
|
100
|
+
<thead class="bg-gray-50 dark:bg-gray-900">
|
|
101
|
+
<tr>
|
|
102
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.run_headers.triggered_by") %></th>
|
|
103
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.run_headers.version") %></th>
|
|
104
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.run_headers.revision") %></th>
|
|
105
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.run_headers.queue") %></th>
|
|
106
|
+
<th class="px-4 py-3 text-left text-xs font-medium uppercase text-gray-500 dark:text-gray-400"><%= t("pgbus.deploy_tasks.show.run_headers.enqueued_at") %></th>
|
|
107
|
+
</tr>
|
|
108
|
+
</thead>
|
|
109
|
+
<tbody class="divide-y divide-gray-100 dark:divide-gray-700">
|
|
110
|
+
<% Array(@task[:runs]).each do |run| %>
|
|
111
|
+
<tr class="hover:bg-gray-50 dark:hover:bg-gray-700/50">
|
|
112
|
+
<td data-label="<%= t("pgbus.deploy_tasks.show.run_headers.triggered_by") %>" class="px-4 py-3 text-sm text-gray-900 dark:text-white">
|
|
113
|
+
<%= t("pgbus.deploy_tasks.triggered_by.#{run[:triggered_by]}") %>
|
|
114
|
+
</td>
|
|
115
|
+
<td data-label="<%= t("pgbus.deploy_tasks.show.run_headers.version") %>" class="px-4 py-3 text-sm text-gray-600 dark:text-gray-300">
|
|
116
|
+
<%= t("pgbus.deploy_tasks.version", version: run[:version]) %>
|
|
117
|
+
</td>
|
|
118
|
+
<td data-label="<%= t("pgbus.deploy_tasks.show.run_headers.revision") %>" class="px-4 py-3 text-sm font-mono text-gray-600 dark:text-gray-300">
|
|
119
|
+
<%= run[:revision] || "—" %>
|
|
120
|
+
</td>
|
|
121
|
+
<td data-label="<%= t("pgbus.deploy_tasks.show.run_headers.queue") %>" class="px-4 py-3 text-sm text-gray-600 dark:text-gray-300">
|
|
122
|
+
<%= run[:queue_name] || "—" %>
|
|
123
|
+
</td>
|
|
124
|
+
<td data-label="<%= t("pgbus.deploy_tasks.show.run_headers.enqueued_at") %>" class="px-4 py-3 text-sm text-gray-600 dark:text-gray-300">
|
|
125
|
+
<%= pgbus_time(run[:run_at]) %>
|
|
126
|
+
</td>
|
|
127
|
+
</tr>
|
|
128
|
+
<% end %>
|
|
129
|
+
<% if Array(@task[:runs]).empty? %>
|
|
130
|
+
<%= render "pgbus/shared/empty_row", colspan: 5, message: t("pgbus.deploy_tasks.show.no_runs") %>
|
|
131
|
+
<% end %>
|
|
132
|
+
</tbody>
|
|
133
|
+
</table>
|
|
134
|
+
</div>
|
data/config/i18n-tasks.yml
CHANGED
|
@@ -39,6 +39,8 @@ ignore_unused:
|
|
|
39
39
|
- "pgbus.dashboard.queue_health.words.*"
|
|
40
40
|
- "pgbus.insights.show.charts.series_name"
|
|
41
41
|
- "pgbus.recurring_tasks.index.task_count.*"
|
|
42
|
+
- "pgbus.deploy_tasks.banner.lagging_html.*"
|
|
43
|
+
- "pgbus.deploy_tasks.reasons.waiting_lagging_html.*"
|
|
42
44
|
- "pgbus.processes.state.activity.schedule.*"
|
|
43
45
|
- "pgbus.processes.state.activity.slots.*"
|
|
44
46
|
- "pgbus.processes.state.activity.threads.*"
|
data/config/locales/da.yml
CHANGED
|
@@ -236,6 +236,102 @@ da:
|
|
|
236
236
|
payload: Indhold
|
|
237
237
|
retry: Forsøg igen
|
|
238
238
|
title: 'DLQ-besked #%{id}'
|
|
239
|
+
deploy_tasks:
|
|
240
|
+
banner:
|
|
241
|
+
heading: Udrulning
|
|
242
|
+
lagging_html:
|
|
243
|
+
one: 'Venter på udrulning: 1 proces kører endnu ikke <code>%{revision}</code>.'
|
|
244
|
+
other: 'Venter på udrulning: %{count} processer kører endnu ikke <code>%{revision}</code>.'
|
|
245
|
+
lagging_more: "…og %{count} mere"
|
|
246
|
+
lagging_process: "%{kind}@%{hostname} pid %{pid} på %{revision}"
|
|
247
|
+
live_count: "%{count} på %{revision}"
|
|
248
|
+
live_heading: 'Aktive processer:'
|
|
249
|
+
no_revision_hint_html: Sæt <code>config.app_revision</code>, eller en af <code>PGBUS_REVISION</code>, <code>DASH_VERSION</code> eller <code>KAMAL_VERSION</code>, eller lever en <code>REVISION</code>-fil. Kør nu virker stadig.
|
|
250
|
+
no_revision_html: 'Appens revision er ikke konfigureret: deploy-opgaver venter, indtil den er.'
|
|
251
|
+
no_revision_label: ingen revision
|
|
252
|
+
no_scheduler_html: 'Ingen planlægger kører: deploy-opgaver startes kun af planlæggeren. Vurderingen bruger dashboardets egen revision.'
|
|
253
|
+
no_workers_html: 'Venter på udrulning: ingen worker på <code>%{revision}</code> endnu.'
|
|
254
|
+
ready_html: 'Udrullet: hver aktiv proces kører <code>%{revision}</code>. Ventende opgaver kører ved planlæggerens næste tick.'
|
|
255
|
+
unavailable_html: Udrulningsstatussen kunne ikke læses.
|
|
256
|
+
default_queue: default
|
|
257
|
+
disable: Deaktiver
|
|
258
|
+
enable: Aktiver
|
|
259
|
+
enqueue:
|
|
260
|
+
enqueued: Deploy-opgaven er sat i kø
|
|
261
|
+
failed: 'Deploy-opgaven blev ikke sat i kø: se loggen for årsagen'
|
|
262
|
+
every_deploy: Ved hver deploy
|
|
263
|
+
index:
|
|
264
|
+
task_count:
|
|
265
|
+
one: "%{count} opgave erklæret"
|
|
266
|
+
other: "%{count} opgaver erklæret"
|
|
267
|
+
title: Deploy-opgaver
|
|
268
|
+
not_found: Deploy-opgaven blev ikke fundet
|
|
269
|
+
reasons:
|
|
270
|
+
disabled_armed_html: 'Deaktiveret med en ventende udrulningskørsel: aktiver den for at lade den køre.'
|
|
271
|
+
disabled_html: 'Deaktiveret: planlæggeren springer den over.'
|
|
272
|
+
due_html: 'Klar: kører ved planlæggerens næste tick.'
|
|
273
|
+
manual_html: "· kørte %{ago} (manuelt)"
|
|
274
|
+
never_html: Har aldrig kørt efter en udrulning.
|
|
275
|
+
ran_html: Kørte %{ago} på <code>%{revision}</code> (udrulning).
|
|
276
|
+
waiting_lagging_html:
|
|
277
|
+
one: 'Venter på udrulning: 1 proces kører endnu ikke <code>%{revision}</code>.'
|
|
278
|
+
other: 'Venter på udrulning: %{count} processer kører endnu ikke <code>%{revision}</code>.'
|
|
279
|
+
waiting_no_revision_html: 'Venter: appens revision er ikke konfigureret.'
|
|
280
|
+
waiting_no_scheduler_html: 'Venter: ingen planlægger kører.'
|
|
281
|
+
waiting_no_workers_html: Venter på en worker på <code>%{revision}</code>.
|
|
282
|
+
waiting_unknown_html: 'Venter: udrulningsstatussen kunne ikke læses.'
|
|
283
|
+
run_now: Kør nu
|
|
284
|
+
show:
|
|
285
|
+
armed_html: "%{armed_for}, klargjort %{ago}"
|
|
286
|
+
back: Tilbage
|
|
287
|
+
configuration: Konfiguration
|
|
288
|
+
labels:
|
|
289
|
+
arguments: Argumenter
|
|
290
|
+
armed: Ventende kørsel
|
|
291
|
+
command: Kommando
|
|
292
|
+
description: Beskrivelse
|
|
293
|
+
job_class: Jobklasse
|
|
294
|
+
priority: Prioritet
|
|
295
|
+
queue: Kø
|
|
296
|
+
source: Kilde
|
|
297
|
+
last_run: Seneste kørsel
|
|
298
|
+
no_runs: Ingen kørsler registreret endnu
|
|
299
|
+
recent_runs: Seneste kørsler
|
|
300
|
+
run_headers:
|
|
301
|
+
enqueued_at: Sat i kø
|
|
302
|
+
queue: Kø
|
|
303
|
+
revision: Revision
|
|
304
|
+
triggered_by: Startet af
|
|
305
|
+
version: Version
|
|
306
|
+
source_config: Konfigurationsfil
|
|
307
|
+
source_dynamic: Dynamisk
|
|
308
|
+
state: Tilstand
|
|
309
|
+
version: Version
|
|
310
|
+
states:
|
|
311
|
+
disabled: Deaktiveret
|
|
312
|
+
due: Klar
|
|
313
|
+
never: Aldrig kørt
|
|
314
|
+
ran: Kørt
|
|
315
|
+
waiting: Venter
|
|
316
|
+
tasks_table:
|
|
317
|
+
empty_hint_html: Erklær engangsopgaver i <code>config/deploy_tasks.yml</code>; <code>rails generate pgbus:add_deploy_tasks</code> skriver en startfil.
|
|
318
|
+
empty_title: Ingen deploy-opgaver erklæret
|
|
319
|
+
headers:
|
|
320
|
+
actions: Handlinger
|
|
321
|
+
last_run: Seneste kørsel
|
|
322
|
+
queue: Kø
|
|
323
|
+
state: Tilstand
|
|
324
|
+
task: Opgave
|
|
325
|
+
version: Version
|
|
326
|
+
never: Aldrig
|
|
327
|
+
toggle:
|
|
328
|
+
disabled: Deploy-opgaven er deaktiveret
|
|
329
|
+
enabled: Deploy-opgaven er aktiveret
|
|
330
|
+
failed: Kunne ikke skifte deploy-opgaven
|
|
331
|
+
triggered_by:
|
|
332
|
+
manual: Manuelt
|
|
333
|
+
rollover: Udrulning
|
|
334
|
+
version: v%{version}
|
|
239
335
|
dialogs:
|
|
240
336
|
cancel: Annuller
|
|
241
337
|
confirm: Bekræft
|
|
@@ -617,6 +713,7 @@ da:
|
|
|
617
713
|
nav:
|
|
618
714
|
batches: Batches
|
|
619
715
|
dashboard: Dashboard
|
|
716
|
+
deploy_tasks: Deploy
|
|
620
717
|
dlq: DLQ
|
|
621
718
|
events: Begivenheder
|
|
622
719
|
insights: Indsigter
|
data/config/locales/de.yml
CHANGED
|
@@ -236,6 +236,102 @@ de:
|
|
|
236
236
|
payload: Nutzlast
|
|
237
237
|
retry: Erneut versuchen
|
|
238
238
|
title: 'DLQ Nachricht #%{id}'
|
|
239
|
+
deploy_tasks:
|
|
240
|
+
banner:
|
|
241
|
+
heading: Rollover
|
|
242
|
+
lagging_html:
|
|
243
|
+
one: 'Warte auf Rollover: 1 Prozess läuft noch nicht auf <code>%{revision}</code>.'
|
|
244
|
+
other: 'Warte auf Rollover: %{count} Prozesse laufen noch nicht auf <code>%{revision}</code>.'
|
|
245
|
+
lagging_more: "…und %{count} weitere"
|
|
246
|
+
lagging_process: "%{kind}@%{hostname} PID %{pid} auf %{revision}"
|
|
247
|
+
live_count: "%{count} auf %{revision}"
|
|
248
|
+
live_heading: 'Aktive Prozesse:'
|
|
249
|
+
no_revision_hint_html: Setze <code>config.app_revision</code> oder eine von <code>PGBUS_REVISION</code>, <code>DASH_VERSION</code> oder <code>KAMAL_VERSION</code>, oder liefere eine <code>REVISION</code>-Datei aus. „Jetzt ausführen“ funktioniert weiterhin.
|
|
250
|
+
no_revision_html: 'App-Revision nicht konfiguriert: Deploy-Aufgaben warten, bis sie gesetzt ist.'
|
|
251
|
+
no_revision_label: keine Revision
|
|
252
|
+
no_scheduler_html: 'Kein Scheduler läuft: Deploy-Aufgaben werden nur vom Scheduler ausgelöst. Diese Bewertung nutzt die eigene Revision des Dashboards.'
|
|
253
|
+
no_workers_html: 'Warte auf Rollover: noch kein Worker auf <code>%{revision}</code>.'
|
|
254
|
+
ready_html: 'Rollover abgeschlossen: Jeder aktive Prozess läuft auf <code>%{revision}</code>. Vorgemerkte Aufgaben laufen beim nächsten Scheduler-Tick.'
|
|
255
|
+
unavailable_html: Der Rollover-Status konnte nicht gelesen werden.
|
|
256
|
+
default_queue: default
|
|
257
|
+
disable: Deaktivieren
|
|
258
|
+
enable: Aktivieren
|
|
259
|
+
enqueue:
|
|
260
|
+
enqueued: Deploy-Aufgabe eingereiht
|
|
261
|
+
failed: 'Die Deploy-Aufgabe wurde nicht eingereiht: Den Grund findest du im Log'
|
|
262
|
+
every_deploy: Bei jedem Deploy
|
|
263
|
+
index:
|
|
264
|
+
task_count:
|
|
265
|
+
one: "%{count} Aufgabe deklariert"
|
|
266
|
+
other: "%{count} Aufgaben deklariert"
|
|
267
|
+
title: Deploy-Aufgaben
|
|
268
|
+
not_found: Deploy-Aufgabe nicht gefunden
|
|
269
|
+
reasons:
|
|
270
|
+
disabled_armed_html: 'Deaktiviert mit ausstehendem Rollover-Lauf: Aktiviere sie, damit sie ausgelöst wird.'
|
|
271
|
+
disabled_html: 'Deaktiviert: Der Scheduler überspringt sie.'
|
|
272
|
+
due_html: 'Fällig: läuft beim nächsten Scheduler-Tick.'
|
|
273
|
+
manual_html: "· lief %{ago} (manuell)"
|
|
274
|
+
never_html: Nach keinem Rollover gelaufen.
|
|
275
|
+
ran_html: Lief %{ago} auf <code>%{revision}</code> (Rollover).
|
|
276
|
+
waiting_lagging_html:
|
|
277
|
+
one: 'Warte auf Rollover: 1 Prozess läuft noch nicht auf <code>%{revision}</code>.'
|
|
278
|
+
other: 'Warte auf Rollover: %{count} Prozesse laufen noch nicht auf <code>%{revision}</code>.'
|
|
279
|
+
waiting_no_revision_html: 'Wartet: Die App-Revision ist nicht konfiguriert.'
|
|
280
|
+
waiting_no_scheduler_html: 'Wartet: Kein Scheduler läuft.'
|
|
281
|
+
waiting_no_workers_html: Wartet auf einen Worker auf <code>%{revision}</code>.
|
|
282
|
+
waiting_unknown_html: 'Wartet: Der Rollover-Status konnte nicht gelesen werden.'
|
|
283
|
+
run_now: Jetzt ausführen
|
|
284
|
+
show:
|
|
285
|
+
armed_html: "%{armed_for}, vorgemerkt %{ago}"
|
|
286
|
+
back: Zurück
|
|
287
|
+
configuration: Konfiguration
|
|
288
|
+
labels:
|
|
289
|
+
arguments: Argumente
|
|
290
|
+
armed: Ausstehende Vormerkung
|
|
291
|
+
command: Befehl
|
|
292
|
+
description: Beschreibung
|
|
293
|
+
job_class: Job-Klasse
|
|
294
|
+
priority: Priorität
|
|
295
|
+
queue: Warteschlange
|
|
296
|
+
source: Quelle
|
|
297
|
+
last_run: Letzter Lauf
|
|
298
|
+
no_runs: Noch keine Läufe aufgezeichnet
|
|
299
|
+
recent_runs: Letzte Läufe
|
|
300
|
+
run_headers:
|
|
301
|
+
enqueued_at: Eingereiht am
|
|
302
|
+
queue: Warteschlange
|
|
303
|
+
revision: Revision
|
|
304
|
+
triggered_by: Ausgelöst durch
|
|
305
|
+
version: Version
|
|
306
|
+
source_config: Konfigurationsdatei
|
|
307
|
+
source_dynamic: Dynamisch
|
|
308
|
+
state: Zustand
|
|
309
|
+
version: Version
|
|
310
|
+
states:
|
|
311
|
+
disabled: Deaktiviert
|
|
312
|
+
due: Fällig
|
|
313
|
+
never: Nie gelaufen
|
|
314
|
+
ran: Gelaufen
|
|
315
|
+
waiting: Wartet
|
|
316
|
+
tasks_table:
|
|
317
|
+
empty_hint_html: Deklariere einmalige Aufgaben in <code>config/deploy_tasks.yml</code>; <code>rails generate pgbus:add_deploy_tasks</code> erzeugt eine Startdatei.
|
|
318
|
+
empty_title: Keine Deploy-Aufgaben deklariert
|
|
319
|
+
headers:
|
|
320
|
+
actions: Aktionen
|
|
321
|
+
last_run: Letzter Lauf
|
|
322
|
+
queue: Warteschlange
|
|
323
|
+
state: Zustand
|
|
324
|
+
task: Aufgabe
|
|
325
|
+
version: Version
|
|
326
|
+
never: Nie
|
|
327
|
+
toggle:
|
|
328
|
+
disabled: Deploy-Aufgabe deaktiviert
|
|
329
|
+
enabled: Deploy-Aufgabe aktiviert
|
|
330
|
+
failed: Umschalten der Deploy-Aufgabe fehlgeschlagen
|
|
331
|
+
triggered_by:
|
|
332
|
+
manual: Manuell
|
|
333
|
+
rollover: Rollover
|
|
334
|
+
version: v%{version}
|
|
239
335
|
dialogs:
|
|
240
336
|
cancel: Abbrechen
|
|
241
337
|
confirm: Bestätigen
|
|
@@ -617,6 +713,7 @@ de:
|
|
|
617
713
|
nav:
|
|
618
714
|
batches: Stapel
|
|
619
715
|
dashboard: Dashboard
|
|
716
|
+
deploy_tasks: Deploy
|
|
620
717
|
dlq: DLQ
|
|
621
718
|
events: Ereignisse
|
|
622
719
|
insights: Einblicke
|
data/config/locales/en.yml
CHANGED
|
@@ -236,6 +236,102 @@ en:
|
|
|
236
236
|
payload: Payload
|
|
237
237
|
retry: Retry
|
|
238
238
|
title: 'DLQ Message #%{id}'
|
|
239
|
+
deploy_tasks:
|
|
240
|
+
banner:
|
|
241
|
+
heading: Rollover
|
|
242
|
+
lagging_html:
|
|
243
|
+
one: 'Waiting for rollover: 1 process is not on <code>%{revision}</code> yet.'
|
|
244
|
+
other: 'Waiting for rollover: %{count} processes are not on <code>%{revision}</code> yet.'
|
|
245
|
+
lagging_more: "…and %{count} more"
|
|
246
|
+
lagging_process: "%{kind}@%{hostname} pid %{pid} on %{revision}"
|
|
247
|
+
live_count: "%{count} on %{revision}"
|
|
248
|
+
live_heading: 'Live processes:'
|
|
249
|
+
no_revision_hint_html: Set <code>config.app_revision</code>, or one of <code>PGBUS_REVISION</code>, <code>DASH_VERSION</code> or <code>KAMAL_VERSION</code>, or ship a <code>REVISION</code> file. Run now still works.
|
|
250
|
+
no_revision_html: 'App revision not configured: deploy tasks wait until it is.'
|
|
251
|
+
no_revision_label: no revision
|
|
252
|
+
no_scheduler_html: 'No scheduler is running: deploy tasks fire only from the scheduler. This verdict uses the dashboard''s own revision.'
|
|
253
|
+
no_workers_html: 'Waiting for rollover: no worker on <code>%{revision}</code> yet.'
|
|
254
|
+
ready_html: 'Rolled over: every live process runs <code>%{revision}</code>. Armed tasks run on the scheduler''s next tick.'
|
|
255
|
+
unavailable_html: The rollover status could not be read.
|
|
256
|
+
default_queue: default
|
|
257
|
+
disable: Disable
|
|
258
|
+
enable: Enable
|
|
259
|
+
enqueue:
|
|
260
|
+
enqueued: Deploy task enqueued
|
|
261
|
+
failed: 'The deploy task was not enqueued: see the log for the reason'
|
|
262
|
+
every_deploy: Every deploy
|
|
263
|
+
index:
|
|
264
|
+
task_count:
|
|
265
|
+
one: "%{count} task declared"
|
|
266
|
+
other: "%{count} tasks declared"
|
|
267
|
+
title: Deploy Tasks
|
|
268
|
+
not_found: Deploy task not found
|
|
269
|
+
reasons:
|
|
270
|
+
disabled_armed_html: 'Disabled with a rollover run pending: enable it to let it fire.'
|
|
271
|
+
disabled_html: 'Disabled: the scheduler skips it.'
|
|
272
|
+
due_html: 'Due: runs on the scheduler''s next tick.'
|
|
273
|
+
manual_html: "· ran %{ago} (manual)"
|
|
274
|
+
never_html: Never ran after a rollover.
|
|
275
|
+
ran_html: Ran %{ago} on <code>%{revision}</code> (rollover).
|
|
276
|
+
waiting_lagging_html:
|
|
277
|
+
one: 'Waiting for rollover: 1 process is not on <code>%{revision}</code> yet.'
|
|
278
|
+
other: 'Waiting for rollover: %{count} processes are not on <code>%{revision}</code> yet.'
|
|
279
|
+
waiting_no_revision_html: 'Waiting: the app revision is not configured.'
|
|
280
|
+
waiting_no_scheduler_html: 'Waiting: no scheduler is running.'
|
|
281
|
+
waiting_no_workers_html: Waiting for a worker on <code>%{revision}</code>.
|
|
282
|
+
waiting_unknown_html: 'Waiting: the rollover status could not be read.'
|
|
283
|
+
run_now: Run Now
|
|
284
|
+
show:
|
|
285
|
+
armed_html: "%{armed_for}, armed %{ago}"
|
|
286
|
+
back: Back
|
|
287
|
+
configuration: Configuration
|
|
288
|
+
labels:
|
|
289
|
+
arguments: Arguments
|
|
290
|
+
armed: Pending arm
|
|
291
|
+
command: Command
|
|
292
|
+
description: Description
|
|
293
|
+
job_class: Job Class
|
|
294
|
+
priority: Priority
|
|
295
|
+
queue: Queue
|
|
296
|
+
source: Source
|
|
297
|
+
last_run: Last Run
|
|
298
|
+
no_runs: No runs recorded yet
|
|
299
|
+
recent_runs: Recent Runs
|
|
300
|
+
run_headers:
|
|
301
|
+
enqueued_at: Enqueued At
|
|
302
|
+
queue: Queue
|
|
303
|
+
revision: Revision
|
|
304
|
+
triggered_by: Triggered By
|
|
305
|
+
version: Version
|
|
306
|
+
source_config: Config file
|
|
307
|
+
source_dynamic: Dynamic
|
|
308
|
+
state: State
|
|
309
|
+
version: Version
|
|
310
|
+
states:
|
|
311
|
+
disabled: Disabled
|
|
312
|
+
due: Due
|
|
313
|
+
never: Never ran
|
|
314
|
+
ran: Ran
|
|
315
|
+
waiting: Waiting
|
|
316
|
+
tasks_table:
|
|
317
|
+
empty_hint_html: Declare one-time tasks in <code>config/deploy_tasks.yml</code>; <code>rails generate pgbus:add_deploy_tasks</code> writes a starter file.
|
|
318
|
+
empty_title: No deploy tasks declared
|
|
319
|
+
headers:
|
|
320
|
+
actions: Actions
|
|
321
|
+
last_run: Last Run
|
|
322
|
+
queue: Queue
|
|
323
|
+
state: State
|
|
324
|
+
task: Task
|
|
325
|
+
version: Version
|
|
326
|
+
never: Never
|
|
327
|
+
toggle:
|
|
328
|
+
disabled: Deploy task disabled
|
|
329
|
+
enabled: Deploy task enabled
|
|
330
|
+
failed: Failed to toggle the deploy task
|
|
331
|
+
triggered_by:
|
|
332
|
+
manual: Manual
|
|
333
|
+
rollover: Rollover
|
|
334
|
+
version: v%{version}
|
|
239
335
|
dialogs:
|
|
240
336
|
cancel: Cancel
|
|
241
337
|
confirm: Confirm
|
|
@@ -617,6 +713,7 @@ en:
|
|
|
617
713
|
nav:
|
|
618
714
|
batches: Batches
|
|
619
715
|
dashboard: Dashboard
|
|
716
|
+
deploy_tasks: Deploy
|
|
620
717
|
dlq: DLQ
|
|
621
718
|
events: Events
|
|
622
719
|
insights: Insights
|