pgbus 0.19.0 → 0.19.2
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 +329 -147
- data/README.md +65 -27
- data/app/controllers/pgbus/deploy_tasks_controller.rb +38 -0
- 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/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 +98 -1
- 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_batch_callback_jobs_generator.rb +4 -1
- 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/batch_id.rb +10 -4
- data/lib/pgbus/batch/builder.rb +92 -0
- data/lib/pgbus/batch.rb +97 -22
- data/lib/pgbus/configuration/deploy_settings.rb +46 -0
- data/lib/pgbus/configuration.rb +3 -0
- 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 +17 -0
- data/lib/pgbus/generators/migration_detector.rb +12 -1
- data/lib/pgbus/instrumentation.rb +14 -0
- data/lib/pgbus/integrations/appsignal/subscriber.rb +15 -0
- 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 +12 -0
- data/lib/pgbus/outbox/poller.rb +1 -0
- data/lib/pgbus/process/consumer.rb +57 -3
- data/lib/pgbus/process/dispatcher.rb +18 -1
- data/lib/pgbus/process/heartbeat.rb +7 -2
- data/lib/pgbus/process/supervisor.rb +35 -3
- data/lib/pgbus/process/worker.rb +1 -0
- data/lib/pgbus/recurring/scheduler.rb +54 -20
- data/lib/pgbus/version.rb +1 -1
- data/lib/pgbus/web/data_source/deploy_task_list.rb +114 -0
- data/lib/pgbus/web/data_source/list_counts.rb +2 -1
- data/lib/pgbus/web/data_source.rb +1 -0
- data/lib/pgbus/web/deploy_task_state.rb +51 -0
- data/lib/pgbus.rb +11 -0
- data/sig/pgbus/configuration.rbs +10 -0
- data/sig/pgbus.rbs +9 -0
- metadata +21 -1
|
@@ -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
|
@@ -23,7 +23,7 @@ en:
|
|
|
23
23
|
finished_at: Finished At
|
|
24
24
|
not_found: Batch not found
|
|
25
25
|
on_failure: On Failure
|
|
26
|
-
on_finish: On
|
|
26
|
+
on_finish: On Complete
|
|
27
27
|
on_success: On Success
|
|
28
28
|
progress: Progress
|
|
29
29
|
properties: Properties
|
|
@@ -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
|
data/config/locales/es.yml
CHANGED
|
@@ -236,6 +236,102 @@ es:
|
|
|
236
236
|
payload: Carga útil
|
|
237
237
|
retry: Reintentar
|
|
238
238
|
title: 'Mensaje DLQ #%{id}'
|
|
239
|
+
deploy_tasks:
|
|
240
|
+
banner:
|
|
241
|
+
heading: Transición
|
|
242
|
+
lagging_html:
|
|
243
|
+
one: 'Esperando la transición: 1 proceso aún no ejecuta <code>%{revision}</code>.'
|
|
244
|
+
other: 'Esperando la transición: %{count} procesos aún no ejecutan <code>%{revision}</code>.'
|
|
245
|
+
lagging_more: "…y %{count} más"
|
|
246
|
+
lagging_process: "%{kind}@%{hostname} pid %{pid} en %{revision}"
|
|
247
|
+
live_count: "%{count} en %{revision}"
|
|
248
|
+
live_heading: 'Procesos activos:'
|
|
249
|
+
no_revision_hint_html: Define <code>config.app_revision</code>, o una de <code>PGBUS_REVISION</code>, <code>DASH_VERSION</code> o <code>KAMAL_VERSION</code>, o incluye un archivo <code>REVISION</code>. Ejecutar ahora sigue funcionando.
|
|
250
|
+
no_revision_html: 'Revisión de la aplicación no configurada: las tareas de despliegue esperan hasta que lo esté.'
|
|
251
|
+
no_revision_label: sin revisión
|
|
252
|
+
no_scheduler_html: 'No hay ningún planificador en ejecución: las tareas de despliegue solo las lanza el planificador. Este veredicto usa la revisión del propio panel.'
|
|
253
|
+
no_workers_html: 'Esperando la transición: aún no hay ningún worker en <code>%{revision}</code>.'
|
|
254
|
+
ready_html: 'Transición completa: cada proceso activo ejecuta <code>%{revision}</code>. Las tareas armadas se ejecutan en el siguiente tick del planificador.'
|
|
255
|
+
unavailable_html: No se pudo leer el estado de la transición.
|
|
256
|
+
default_queue: default
|
|
257
|
+
disable: Desactivar
|
|
258
|
+
enable: Activar
|
|
259
|
+
enqueue:
|
|
260
|
+
enqueued: Tarea de despliegue encolada
|
|
261
|
+
failed: 'La tarea de despliegue no se encoló: consulta el registro para ver el motivo'
|
|
262
|
+
every_deploy: En cada despliegue
|
|
263
|
+
index:
|
|
264
|
+
task_count:
|
|
265
|
+
one: "%{count} tarea declarada"
|
|
266
|
+
other: "%{count} tareas declaradas"
|
|
267
|
+
title: Tareas de despliegue
|
|
268
|
+
not_found: Tarea de despliegue no encontrada
|
|
269
|
+
reasons:
|
|
270
|
+
disabled_armed_html: 'Desactivada con una ejecución de transición pendiente: actívala para que se ejecute.'
|
|
271
|
+
disabled_html: 'Desactivada: el planificador la omite.'
|
|
272
|
+
due_html: 'Lista: se ejecuta en el siguiente tick del planificador.'
|
|
273
|
+
manual_html: "· se ejecutó %{ago} (manual)"
|
|
274
|
+
never_html: Nunca se ejecutó tras una transición.
|
|
275
|
+
ran_html: Se ejecutó %{ago} en <code>%{revision}</code> (transición).
|
|
276
|
+
waiting_lagging_html:
|
|
277
|
+
one: 'Esperando la transición: 1 proceso aún no ejecuta <code>%{revision}</code>.'
|
|
278
|
+
other: 'Esperando la transición: %{count} procesos aún no ejecutan <code>%{revision}</code>.'
|
|
279
|
+
waiting_no_revision_html: 'Esperando: la revisión de la aplicación no está configurada.'
|
|
280
|
+
waiting_no_scheduler_html: 'Esperando: no hay ningún planificador en ejecución.'
|
|
281
|
+
waiting_no_workers_html: Esperando un worker en <code>%{revision}</code>.
|
|
282
|
+
waiting_unknown_html: 'Esperando: no se pudo leer el estado de la transición.'
|
|
283
|
+
run_now: Ejecutar ahora
|
|
284
|
+
show:
|
|
285
|
+
armed_html: "%{armed_for}, armada %{ago}"
|
|
286
|
+
back: Volver
|
|
287
|
+
configuration: Configuración
|
|
288
|
+
labels:
|
|
289
|
+
arguments: Argumentos
|
|
290
|
+
armed: Ejecución pendiente
|
|
291
|
+
command: Comando
|
|
292
|
+
description: Descripción
|
|
293
|
+
job_class: Clase de trabajo
|
|
294
|
+
priority: Prioridad
|
|
295
|
+
queue: Cola
|
|
296
|
+
source: Origen
|
|
297
|
+
last_run: Última ejecución
|
|
298
|
+
no_runs: Aún no hay ejecuciones registradas
|
|
299
|
+
recent_runs: Ejecuciones recientes
|
|
300
|
+
run_headers:
|
|
301
|
+
enqueued_at: Encolada el
|
|
302
|
+
queue: Cola
|
|
303
|
+
revision: Revisión
|
|
304
|
+
triggered_by: Lanzada por
|
|
305
|
+
version: Versión
|
|
306
|
+
source_config: Archivo de configuración
|
|
307
|
+
source_dynamic: Dinámica
|
|
308
|
+
state: Estado
|
|
309
|
+
version: Versión
|
|
310
|
+
states:
|
|
311
|
+
disabled: Desactivada
|
|
312
|
+
due: Lista
|
|
313
|
+
never: Nunca ejecutada
|
|
314
|
+
ran: Ejecutada
|
|
315
|
+
waiting: Esperando
|
|
316
|
+
tasks_table:
|
|
317
|
+
empty_hint_html: Declara tareas puntuales en <code>config/deploy_tasks.yml</code>; <code>rails generate pgbus:add_deploy_tasks</code> crea un archivo inicial.
|
|
318
|
+
empty_title: No hay tareas de despliegue declaradas
|
|
319
|
+
headers:
|
|
320
|
+
actions: Acciones
|
|
321
|
+
last_run: Última ejecución
|
|
322
|
+
queue: Cola
|
|
323
|
+
state: Estado
|
|
324
|
+
task: Tarea
|
|
325
|
+
version: Versión
|
|
326
|
+
never: Nunca
|
|
327
|
+
toggle:
|
|
328
|
+
disabled: Tarea de despliegue desactivada
|
|
329
|
+
enabled: Tarea de despliegue activada
|
|
330
|
+
failed: No se pudo cambiar la tarea de despliegue
|
|
331
|
+
triggered_by:
|
|
332
|
+
manual: Manual
|
|
333
|
+
rollover: Transición
|
|
334
|
+
version: v%{version}
|
|
239
335
|
dialogs:
|
|
240
336
|
cancel: Cancelar
|
|
241
337
|
confirm: Confirmar
|
|
@@ -617,6 +713,7 @@ es:
|
|
|
617
713
|
nav:
|
|
618
714
|
batches: Lotes
|
|
619
715
|
dashboard: Panel de control
|
|
716
|
+
deploy_tasks: Despliegue
|
|
620
717
|
dlq: DLQ
|
|
621
718
|
events: Eventos
|
|
622
719
|
insights: Perspectivas
|