ci: tmp do pytest em tmpfs (RAM) no job backend do reusable [INFRA-70569] #131

Merged
tmf-ia merged 1 commit from infra/INFRA-70569-tmpfs-ci into develop 2026-10-19 12:54:17 -03:00
Owner

Contexto

A v0.5.0 pôs o Postgres de CI em tmpfs + fsync=off (INFRA-70569/70471), mas o gargalo medido do python-backs da Platform (46 min contra 90 s local) é o SQLite em ARQUIVO do service-desk: o harness grava em tmp_path do pytest, que no disco disputado do runner do tmf-qa pagava fsync a cada teste. O Postgres em tmpfs não cobre isso.

O que muda (global-first, no reusable ci.yml)

  • O job backend monta um tmpfs /ramtmp no container (--tmpfs ...,mode=1777,size=2g; tmpfs vazio não reserva RAM, mode=1777 para imagem de CI não-root).
  • O passo Testes (completo) aponta TMPDIR e --basetemp do pytest para /ramtmp — por padrão.
  • Knob pytest_tmpfs no ci-config (boolean, padrão true); false volta ao disco e exige pytest_tmpfs_motivo (validado no ci_config.py).
  • Fallback: se o tmpfs faltar no container, o passo cai para disco com ::warning::, sem quebrar.

Cobre HelpCor, DANI e Hub (usam o reusable) sem nenhuma sessão de produto mexer. O tmf-platform (ci.yml local) recebe o equivalente em PR à parte, depois da release v1.125.0.

Prova

  • Suíte tests/ci-config: 168 passed, 1 skipped, 79 subtests. Os testes locais pegaram 3 regressões antes do PR (mkdir sem fallback; output pytest_tmpfs_motivo faltando no changes; off ambíguo no leitor YAML → virou boolean).
  • A prova de tempo é o relatório slowest durations do python-backs do SD no CI, antes e depois (fica com o Lineu, que lê o log no disco do Forgejo).

Aceite (INFRA-70569)

  • Knob default-on + desligável com motivo escrito.
  • Tempo antes/depois registrado (slowest-durations no CI).
  • RAM do tmf-qa medida com 3 jobs simultâneos (parte do runner, com o operador).

[INFRA-70569] [INFRA-70471]

## Contexto A v0.5.0 pôs o **Postgres** de CI em tmpfs + `fsync=off` (INFRA-70569/70471), mas o gargalo medido do `python-backs` da Platform (46 min contra 90 s local) é o **SQLite em ARQUIVO** do service-desk: o harness grava em `tmp_path` do pytest, que no **disco disputado** do runner do tmf-qa pagava `fsync` a cada teste. O Postgres em tmpfs não cobre isso. ## O que muda (global-first, no reusable `ci.yml`) - O job **backend** monta um tmpfs `/ramtmp` no container (`--tmpfs ...,mode=1777,size=2g`; tmpfs vazio não reserva RAM, `mode=1777` para imagem de CI não-root). - O passo **Testes (completo)** aponta `TMPDIR` e `--basetemp` do pytest para `/ramtmp` — por padrão. - Knob **`pytest_tmpfs`** no ci-config (boolean, padrão `true`); `false` volta ao disco e **exige** `pytest_tmpfs_motivo` (validado no `ci_config.py`). - **Fallback**: se o tmpfs faltar no container, o passo cai para disco com `::warning::`, sem quebrar. Cobre **HelpCor, DANI e Hub** (usam o reusable) sem nenhuma sessão de produto mexer. O **tmf-platform** (ci.yml local) recebe o equivalente em PR à parte, depois da release v1.125.0. ## Prova - Suíte `tests/ci-config`: **168 passed, 1 skipped, 79 subtests**. Os testes locais pegaram 3 regressões antes do PR (mkdir sem fallback; output `pytest_tmpfs_motivo` faltando no `changes`; `off` ambíguo no leitor YAML → virou boolean). - A prova de **tempo** é o relatório *slowest durations* do `python-backs` do SD no CI, antes e depois (fica com o Lineu, que lê o log no disco do Forgejo). ## Aceite (INFRA-70569) - [x] Knob default-on + desligável com motivo escrito. - [ ] Tempo antes/depois registrado (slowest-durations no CI). - [ ] RAM do tmf-qa medida com 3 jobs simultâneos (parte do runner, com o operador). [INFRA-70569] [INFRA-70471]
ci: tmp do pytest em tmpfs (RAM) no job backend do reusable [INFRA-70569]
All checks were successful
PR checks (ci-shared) / testes (pull_request) Successful in 4m33s
e65fa5c4f7
A 0.5.0 pôs o PGDATA do Postgres de CI em tmpfs + fsync off, mas o service-desk
grava SQLite EM ARQUIVO no tmp_path do pytest — que continuava no disco disputado
do runner do tmf-qa, pagando fsync a cada teste (46min de python-backs, local 90s).

Monta um tmpfs /ramtmp no container do job backend (mode=1777 p/ imagem não-root;
tmpfs vazio não reserva RAM) e o passo "Testes (completo)" aponta TMPDIR e
--basetemp do pytest para lá. Knob pytest_tmpfs no ci-config (padrão true; false
volta ao disco e exige pytest_tmpfs_motivo). Fallback a disco com aviso se o tmpfs
faltar, sem quebrar o passo. Cobre HelpCor/DANI/Hub (reusable); tmf-platform aplica
o equivalente no ci.yml local à parte.

Suíte ci-config: 168 passed, 1 skipped, 79 subtests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tmf-ia merged commit 4e0fee34f3 into develop 2026-10-19 12:54:17 -03:00
Sign in to join this conversation.
No reviewers
No labels
seguranca
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
TMF/ci-shared!131
No description provided.