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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +329 -147
  3. data/README.md +65 -27
  4. data/app/controllers/pgbus/deploy_tasks_controller.rb +38 -0
  5. data/app/helpers/pgbus/deploy_tasks_helper.rb +77 -0
  6. data/app/helpers/pgbus/processes_helper.rb +1 -1
  7. data/app/models/pgbus/deploy_task.rb +104 -0
  8. data/app/models/pgbus/deploy_task_run.rb +45 -0
  9. data/app/views/layouts/pgbus/application.html.erb +2 -0
  10. data/app/views/pgbus/deploy_tasks/_rollover_banner.html.erb +25 -0
  11. data/app/views/pgbus/deploy_tasks/_tasks_table.html.erb +71 -0
  12. data/app/views/pgbus/deploy_tasks/index.html.erb +6 -0
  13. data/app/views/pgbus/deploy_tasks/show.html.erb +134 -0
  14. data/config/i18n-tasks.yml +2 -0
  15. data/config/locales/da.yml +97 -0
  16. data/config/locales/de.yml +97 -0
  17. data/config/locales/en.yml +98 -1
  18. data/config/locales/es.yml +97 -0
  19. data/config/locales/fi.yml +97 -0
  20. data/config/locales/fr.yml +97 -0
  21. data/config/locales/it.yml +97 -0
  22. data/config/locales/ja.yml +97 -0
  23. data/config/locales/nb.yml +97 -0
  24. data/config/locales/nl.yml +97 -0
  25. data/config/locales/pt.yml +97 -0
  26. data/config/locales/sv.yml +97 -0
  27. data/config/routes.rb +7 -0
  28. data/lib/generators/pgbus/add_batch_callback_jobs_generator.rb +4 -1
  29. data/lib/generators/pgbus/add_deploy_tasks_generator.rb +51 -0
  30. data/lib/generators/pgbus/templates/add_deploy_tasks_tables.rb.erb +43 -0
  31. data/lib/generators/pgbus/templates/deploy_tasks.yml.erb +42 -0
  32. data/lib/generators/pgbus/templates/migration.rb.erb +43 -0
  33. data/lib/pgbus/active_job/batch_id.rb +10 -4
  34. data/lib/pgbus/batch/builder.rb +92 -0
  35. data/lib/pgbus/batch.rb +97 -22
  36. data/lib/pgbus/configuration/deploy_settings.rb +46 -0
  37. data/lib/pgbus/configuration.rb +3 -0
  38. data/lib/pgbus/deploy/revision.rb +59 -0
  39. data/lib/pgbus/deploy/rollover.rb +65 -0
  40. data/lib/pgbus/deploy/runner.rb +259 -0
  41. data/lib/pgbus/deploy/task.rb +105 -0
  42. data/lib/pgbus/engine.rb +17 -0
  43. data/lib/pgbus/generators/migration_detector.rb +12 -1
  44. data/lib/pgbus/instrumentation.rb +14 -0
  45. data/lib/pgbus/integrations/appsignal/subscriber.rb +15 -0
  46. data/lib/pgbus/mcp/server.rb +2 -1
  47. data/lib/pgbus/mcp/tools/deploy_tasks_tool.rb +86 -0
  48. data/lib/pgbus/mcp.rb +1 -0
  49. data/lib/pgbus/metrics/subscriber.rb +12 -0
  50. data/lib/pgbus/outbox/poller.rb +1 -0
  51. data/lib/pgbus/process/consumer.rb +57 -3
  52. data/lib/pgbus/process/dispatcher.rb +18 -1
  53. data/lib/pgbus/process/heartbeat.rb +7 -2
  54. data/lib/pgbus/process/supervisor.rb +35 -3
  55. data/lib/pgbus/process/worker.rb +1 -0
  56. data/lib/pgbus/recurring/scheduler.rb +54 -20
  57. data/lib/pgbus/version.rb +1 -1
  58. data/lib/pgbus/web/data_source/deploy_task_list.rb +114 -0
  59. data/lib/pgbus/web/data_source/list_counts.rb +2 -1
  60. data/lib/pgbus/web/data_source.rb +1 -0
  61. data/lib/pgbus/web/deploy_task_state.rb +51 -0
  62. data/lib/pgbus.rb +11 -0
  63. data/sig/pgbus/configuration.rbs +10 -0
  64. data/sig/pgbus.rbs +9 -0
  65. 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>
@@ -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.*"
@@ -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
@@ -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
@@ -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 Finish
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
@@ -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