Matrix Docker Ansible eploy
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 

278 líneas
15 KiB

  1. # SOME DESCRIPTIVE TITLE.
  2. # Copyright (C) 2018-2026, Slavi Pantaleev, Aine Etke, MDAD community members
  3. # This file is distributed under the same license as the matrix-docker-ansible-deploy package.
  4. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
  5. #
  6. #, fuzzy
  7. msgid ""
  8. msgstr ""
  9. "Project-Id-Version: matrix-docker-ansible-deploy \n"
  10. "Report-Msgid-Bugs-To: \n"
  11. "POT-Creation-Date: 2026-08-29 06:02+0000\n"
  12. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  13. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  14. "Language-Team: LANGUAGE <LL@li.org>\n"
  15. "MIME-Version: 1.0\n"
  16. "Content-Type: text/plain; charset=UTF-8\n"
  17. "Content-Transfer-Encoding: 8bit\n"
  18. #: ../../../docs/molecule-testing.md:7
  19. msgid "Molecule testing for roles"
  20. msgstr ""
  21. #: ../../../docs/molecule-testing.md:9
  22. msgid "Roles in `roles/custom/` can carry a [Molecule](https://ansible.readthedocs.io/projects/molecule/) scenario, which installs the role into a container and then checks that the component actually came up with the configuration the role rendered."
  23. msgstr ""
  24. #: ../../../docs/molecule-testing.md:11
  25. msgid "Not every role has one yet. Roles without a scenario are simply not tested."
  26. msgstr ""
  27. #: ../../../docs/molecule-testing.md:13
  28. msgid "Running a scenario"
  29. msgstr ""
  30. #: ../../../docs/molecule-testing.md:21
  31. msgid "The first run creates a virtualenv in `var/molecule-venv/` (gitignored) from `molecule-shared/requirements.txt`. Docker must be working, and a run takes minutes because it pulls container images."
  32. msgstr ""
  33. #: ../../../docs/molecule-testing.md:23
  34. msgid "`MOLECULE_DISTRO` selects the base image; it defaults to `ubuntu2604`."
  35. msgstr ""
  36. #: ../../../docs/molecule-testing.md:25
  37. msgid "Molecule is deliberately **not** part of the `prek` hooks. A run is far too slow to sit in front of a commit, and it needs Docker. Run it when you have touched a role; CI runs it too, asynchronously."
  38. msgstr ""
  39. #: ../../../docs/molecule-testing.md:27
  40. msgid "What CI runs"
  41. msgstr ""
  42. #: ../../../docs/molecule-testing.md:29
  43. msgid "`.github/workflows/molecule.yml` does not run every scenario on every push — with one repository holding every role, that would be unaffordable. Its first job works out which roles the push actually touched, keeps the ones that have a scenario, and builds the job matrix from those. A documentation change runs nothing."
  44. msgstr ""
  45. #: ../../../docs/molecule-testing.md:31
  46. msgid "When the diff base cannot be determined (a new branch, a force push), it falls back to running every scenario, which errs toward testing too much rather than too little. `workflow_dispatch` accepts an optional role name."
  47. msgstr ""
  48. #: ../../../docs/molecule-testing.md:33
  49. msgid "Automerge"
  50. msgstr ""
  51. #: ../../../docs/molecule-testing.md:35
  52. msgid "A role that has a scenario is listed in the Molecule automerge rule in `.github/renovate.json`, so patch bumps of its component merge on their own once the scenario has passed on them."
  53. msgstr ""
  54. #: ../../../docs/molecule-testing.md:38
  55. msgid "**Add your role to that list when you add its scenario.** `bin/check-molecule-automerge-list.py` runs from prek and fails the commit if the list and the scenarios have drifted apart. The direction that matters is a role staying in the list after losing its scenario, since its bumps would then merge with nothing exercising them."
  56. msgstr ""
  57. #: ../../../docs/molecule-testing.md:43
  58. msgid "Writing a scenario"
  59. msgstr ""
  60. #: ../../../docs/molecule-testing.md:45
  61. msgid "Start from `roles/custom/matrix-alertmanager-receiver/molecule/default/` — it is the reference. Four things differ from a standalone role's scenario, all of them consequences of these roles living inside a playbook:"
  62. msgstr ""
  63. #: ../../../docs/molecule-testing.md:47
  64. msgid "The playbook's context has to be supplied"
  65. msgstr ""
  66. #: ../../../docs/molecule-testing.md:49
  67. msgid "The role reads variables that `matrix-base` and `group_vars/matrix_servers` would normally provide. The set is small — `matrix_base_data_path`, `matrix_domain`, `matrix_user_name`, `matrix_group_name`, `matrix_user_uid`, `matrix_user_gid` — and belongs in the scenario's `group_vars`, rather than including `matrix-base`, which does much more than a role scenario needs."
  68. msgstr ""
  69. #: ../../../docs/molecule-testing.md:51
  70. msgid "The `matrix` user and group must exist first"
  71. msgstr ""
  72. #: ../../../docs/molecule-testing.md:53
  73. msgid "The roles' file tasks set `owner:` and `group:` by name, and Ansible resolves those through the passwd database, so `prepare.yml` has to create them before the role runs."
  74. msgstr ""
  75. #: ../../../docs/molecule-testing.md:55
  76. msgid "Most components need a homeserver to be present"
  77. msgstr ""
  78. #: ../../../docs/molecule-testing.md:57
  79. msgid "Many of these components contact the homeserver while starting up, and exit if it is unreachable — `matrix-alertmanager-receiver`, for example, fetches `/_matrix/client/v3/joined_rooms` to resolve its room mapping and exits with a failure if that call fails."
  80. msgstr ""
  81. #: ../../../docs/molecule-testing.md:59
  82. msgid "A stub is enough, and is what the reference scenario stands up. The point of these scenarios is to prove that **the component starts and does not choke on the configuration the role rendered** — not to exercise real bridging. A scenario should never need a credential or an account on a third-party network; that is the line where it stops being a test of this repository."
  83. msgstr ""
  84. #: ../../../docs/molecule-testing.md:61
  85. msgid "`verify.yml` is a separate play"
  86. msgstr ""
  87. #: ../../../docs/molecule-testing.md:63
  88. msgid "Role defaults are out of scope there, so any path it reads has to be pinned in the scenario's `group_vars`. Deliberately do **not** pin the component's version that way: read it from the role's `defaults/main.yml` with `include_vars`, so the assertion compares the running image against what the role ships rather than against the scenario itself."
  89. msgstr ""
  90. #: ../../../docs/molecule-testing.md:65
  91. msgid "Shared files"
  92. msgstr ""
  93. #: ../../../docs/molecule-testing.md:67
  94. msgid "`molecule-shared/` holds what would otherwise be duplicated into every role:"
  95. msgstr ""
  96. #: ../../../docs/molecule-testing.md:69
  97. msgid "`requirements.txt` — the Python packages, for both CI and `just molecule`."
  98. msgstr ""
  99. #: ../../../docs/molecule-testing.md:70
  100. msgid "`requirements.yml` — the external Ansible roles and collections the scenarios need. Each scenario symlinks its own `molecule/default/requirements.yml` at this file: Molecule checks for a requirements file at that default path before it will install anything, so pointing at the shared one through `requirements-file` alone is silently ignored."
  101. msgstr ""
  102. #: ../../../docs/molecule-testing.md:71
  103. msgid "`vars.yml` — helper container images used for probing, pinned once. They carry `# renovate:` annotations and a custom manager in `.github/renovate.json` keeps them current."
  104. msgstr ""
  105. #: ../../../docs/molecule-testing.md:73
  106. msgid "A helper image is used to reach a role's container over its own container network. That indirection is deliberate: the roles publish no host port, matching a real deployment, and publishing one for the test would collide between scenarios running in parallel."
  107. msgstr ""
  108. #: ../../../docs/molecule-testing.md:75
  109. msgid "Making a scenario worth having"
  110. msgstr ""
  111. #: ../../../docs/molecule-testing.md:77
  112. msgid "A suite that only waits for the systemd unit to become `active` proves very little: these units carry `Restart=always`, so a container crash-looping on a bad configuration still reports `active`. Check the restart counter alongside it, and probe something the component can only answer correctly if the role's configuration reached it."
  113. msgstr ""
  114. #: ../../../docs/molecule-testing.md:79
  115. msgid "Give the scenario values that differ from both the role's defaults and the component's own defaults. Otherwise a passing assertion cannot distinguish \"the role configured this\" from \"it would have happened anyway\"."
  116. msgstr ""
  117. #: ../../../docs/molecule-testing.md:81
  118. msgid "Then try to break it. If a scenario cannot be made to fail by deliberately breaking the thing it checks, it is not testing that thing."
  119. msgstr ""
  120. #: ../../../docs/molecule-testing.md:83
  121. msgid "Falsify **every** assertion, not just enough of them to see the scenario go red. An assertion that passes is not necessarily an assertion that works: one control here asserted that a component emitted no DEBUG records from a particular module, and it passed just as happily with that module set to `debug`, because the module emits none on a first run either way. It was green for the wrong reason, and only breaking it deliberately exposed that."
  122. msgstr ""
  123. #: ../../../docs/molecule-testing.md:89
  124. msgid "Make a failure identify the broken control"
  125. msgstr ""
  126. #: ../../../docs/molecule-testing.md:91
  127. msgid "Write each independently falsifiable condition as its own item under `that`. Ansible evaluates the items in order and reports the first false expression in its `assertion` result field. When several conditions are folded into one expression with `and`, it can only report that whole expression:"
  128. msgstr ""
  129. #: ../../../docs/molecule-testing.md:102
  130. msgid "Keeping related conditions in one assertion task is fine. Split them into separately named tasks when they describe different operational claims or remedies — for example, the container image, runtime identity, network attachment and published ports. `ansible.builtin.assert` runs on the controller without connecting to the target, so the extra tasks add negligible runtime compared to the probes that gathered the values."
  131. msgstr ""
  132. #: ../../../docs/molecule-testing.md:108
  133. msgid "Falsify the real control by changing an observed input or an expected value. Adding a literal `false` condition only proves that `ansible.builtin.assert` itself can fail; it does not prove that the scenario detects the defect it claims to detect."
  134. msgstr ""
  135. #: ../../../docs/molecule-testing.md:112
  136. msgid "Two traps make a falsification pass when it should fail:"
  137. msgstr ""
  138. #: ../../../docs/molecule-testing.md:114
  139. msgid "`molecule converge` against an already-running instance rewrites the configuration but only does `state: started`, so the container keeps the old one. Full `molecule test` is unaffected - this bites the local iterate-with-converge loop, which is where falsifications get run."
  140. msgstr ""
  141. #: ../../../docs/molecule-testing.md:117
  142. msgid "The failure must land on the assertion you aimed at. If it fails at an earlier gate, you have proved something about that gate instead."
  143. msgstr ""
  144. #: ../../../docs/molecule-testing.md:120
  145. msgid "Work out whether the component crashes or retries"
  146. msgstr ""
  147. #: ../../../docs/molecule-testing.md:122
  148. msgid "Some components exit when their configuration is wrong; others catch everything and retry forever. For the second kind, `ActiveState == active` and `NRestarts == 0` **both stay true while the component is completely broken** - matrix-reminder-bot and baibot both behave this way, retrying a failed login or profile step indefinitely. There the unit assertions prove nothing on their own, and something the component says about itself has to carry the scenario."
  149. msgstr ""
  150. #: ../../../docs/molecule-testing.md:128
  151. msgid "Establish which kind yours is before deciding what the weight-bearing assertion is."
  152. msgstr ""
  153. #: ../../../docs/molecule-testing.md:130
  154. msgid "Reading the journal"
  155. msgstr ""
  156. #: ../../../docs/molecule-testing.md:132
  157. msgid "Grep the whole journal rather than tailing it. Startup lines are the **oldest** entries, and a component that syncs can bury them under thousands of lines within a minute, so `--lines=N` loses exactly what you were looking for. Strip ANSI escapes too - some components colour their output, and a plain substring match against raw journal text then fails silently."
  158. msgstr ""
  159. #: ../../../docs/molecule-testing.md:137
  160. msgid "Assert against parsed documents"
  161. msgstr ""
  162. #: ../../../docs/molecule-testing.md:139
  163. msgid "Where a scenario reads a rendered configuration, parse it and assert on the structure rather than matching substrings. A value landing under the wrong key cannot then pass."
  164. msgstr ""
  165. #: ../../../docs/molecule-testing.md:142
  166. msgid "Running more than one scenario at once"
  167. msgstr ""
  168. #: ../../../docs/molecule-testing.md:144
  169. msgid "`bin/molecule.sh` points `ANSIBLE_HOME` at `var/molecule-ansible-home/<role>/`, so each role gets its own copy of the Galaxy collections and roles."
  170. msgstr ""
  171. #: ../../../docs/molecule-testing.md:147
  172. msgid "This is not an optimisation - it is a correctness fix. Scenarios install their dependencies with `force: true`, so two runs sharing `~/.ansible` re-extract the same collections underneath each other. The symptom is a collection that was working moments earlier going missing mid-play:"
  173. msgstr ""
  174. #: ../../../docs/molecule-testing.md:155
  175. msgid "If you see that, a concurrent run took the collection out from under you."
  176. msgstr ""
  177. #: ../../../docs/molecule-testing.md:157
  178. msgid "`ANSIBLE_HOME` is left alone if you have already set it, and is unset in CI - each role runs in its own job there, so there is nothing to collide with."
  179. msgstr ""
  180. #: ../../../docs/molecule-testing.md:160
  181. msgid "The directories are disposable; `var/` is gitignored. Delete `var/molecule-ansible-home/` to force a fresh install."
  182. msgstr ""
  183. #: ../../../docs/molecule-testing.md:163
  184. msgid "Databases"
  185. msgstr ""
  186. #: ../../../docs/molecule-testing.md:165
  187. msgid "Scenarios for roles that have a database run against **Postgres**, not sqlite."
  188. msgstr ""
  189. #: ../../../docs/molecule-testing.md:167
  190. msgid "That is what `group_vars/matrix_servers` selects whenever postgres is enabled, which is the default, so it is what essentially every deployment runs. sqlite is a path almost nobody is on: a bug that stopped the mautrix-meta bridges from starting at all under sqlite sat unreported for a long time, which says plainly enough whose path is worth testing."
  191. msgstr ""
  192. #: ../../../docs/molecule-testing.md:172
  193. msgid "`molecule-shared/tasks/postgres.yml` stands one up on the scenario's container network. Include it from `prepare.yml` and point the role at it with its own `_database_engine`, `_database_hostname` and credentials. Give the database and user names that differ from the role's defaults - then the component reaching the database at all proves the role built its connection string out of them."
  194. msgstr ""
  195. #: ../../../docs/molecule-testing.md:177
  196. msgid "The image is pinned in `molecule-shared/vars.yml` at the major the postgres role deploys to new installations, and Renovate carries it forward. When a new major lands, the PR bumping that pin runs every scenario against it, which is the earliest warning we get that a component does not cope with it."
  197. msgstr ""
  198. #: ../../../docs/molecule-testing.md:182
  199. msgid "Prefer asserting on the schema the component created over a file on disk: tables can only appear once it has resolved the hostname, authenticated, and run its migrations."
  200. msgstr ""
  201. #: ../../../docs/molecule-testing.md:185
  202. msgid "Reclaiming the disk space"
  203. msgstr ""
  204. #: ../../../docs/molecule-testing.md:187
  205. msgid "`just molecule-clean` removes what the runs leave under `var/`."
  206. msgstr ""
  207. #: ../../../docs/molecule-testing.md:189
  208. msgid "Two things live there. The per-role Ansible homes are ~7 MB each, rewritten on every run rather than grown, so they are bounded by the number of roles that have a scenario. The shared virtualenv is the bulk of it, over 500 MB, and is recreated on the next run at the cost of a `pip install`."
  209. msgstr ""
  210. #: ../../../docs/molecule-testing.md:193
  211. msgid "`--idle-days N` restricts it to what has not been touched in N days, which is what makes it safe to run unattended. `--yes` skips the confirmation."
  212. msgstr ""