genome_pousser : la simulation dit ce que la poussee ferait, puis s'arrete
En --check, la sonde de l'organisation (une lecture uri) etait sautee et la tache suivante echouait sur un statut absent, cache par no_log. La suite (colis, reception, poussee) est faite de command et d'ecritures que --check saute aussi : le verdict n'aurait rien prouve. Les deux sondes de la forge tournent desormais en simulation. En --check, le playbook lit la branche de la forge, la compare au poste (rev-list --left-right), nomme pour chaque depot ce que la poussee ferait, et s'arrete avant la premiere ecriture. Temoin : quatre cas nommes contre des clones jetables ; a jour partout contre les vrais depots, aux deux sites. CHANGELOG 150. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
968caed3b1
commit
ee5aad5f41
2 changed files with 113 additions and 0 deletions
18
CHANGELOG.md
18
CHANGELOG.md
|
|
@ -1,3 +1,21 @@
|
||||||
|
## 2026-10-14 (150) — La simulation de `genome-pousser` dit ce que la poussée ferait
|
||||||
|
|
||||||
|
**95 preuves.** `make verifier` passe (site de Chezlepro), `make test` passe. Témoin : contre
|
||||||
|
des clones jetables (`-e genome_freres=…`), la simulation au site de TechnoLibre a nommé les
|
||||||
|
quatre cas — à jour, un commit en avance rapide, un commit de la forge absent du poste (le
|
||||||
|
runner refusera), un commit de la forge inconnu du poste. Contre les vrais dépôts, aux deux
|
||||||
|
sites : « à jour » partout, 0 changement.
|
||||||
|
|
||||||
|
**`--check` échouait à la première lecture.** La sonde « l'organisation existe-t-elle ? »
|
||||||
|
(`uri`, une simple lecture) était sautée en simulation, et la tâche suivante tombait sur un
|
||||||
|
statut absent, en silence (`no_log`). Même réparée là, la suite n'aurait rien montré : colis,
|
||||||
|
réception et poussée sont des `command` ou des écritures `uri`, que `--check` saute, et le
|
||||||
|
verdict final aurait comparé une forge intacte à des colis jamais reçus.
|
||||||
|
- Les deux sondes de la forge tournent aussi en simulation (`check_mode: false`).
|
||||||
|
- En simulation, le playbook lit la branche que porte la forge, la compare au poste
|
||||||
|
(`git rev-list --count --left-right`), dit pour chaque dépôt ce que la poussée ferait,
|
||||||
|
puis s'arrête avant la première écriture.
|
||||||
|
|
||||||
## 2026-10-14 (149) — Le second serveur de noms, sur l'autre site, par le tunnel
|
## 2026-10-14 (149) — Le second serveur de noms, sur l'autre site, par le tunnel
|
||||||
|
|
||||||
**95 preuves.** `make verifier` passe (site de Chezlepro), `make test` passe. Témoin de bout en
|
**95 preuves.** `make verifier` passe (site de Chezlepro), `make test` passe. Témoin de bout en
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@
|
||||||
#
|
#
|
||||||
# make genome-pousser tous les depots portes par le runner
|
# make genome-pousser tous les depots portes par le runner
|
||||||
# make genome-pousser DEPOT=<nom> un seul (le nom du depot sur la forge)
|
# make genome-pousser DEPOT=<nom> un seul (le nom du depot sur la forge)
|
||||||
|
# make genome-pousser ARGS=--check ce que la poussee ferait, depot par depot, sans rien ecrire
|
||||||
#
|
#
|
||||||
# L'ECRITURE S'AUTHENTIFIE, LA LECTURE NON. `serveur_ops` clone en anonyme, par doctrine.
|
# L'ECRITURE S'AUTHENTIFIE, LA LECTURE NON. `serveur_ops` clone en anonyme, par doctrine.
|
||||||
# Pousser est un autre acte : le runner s'y presente avec SA cle — celle que `serveur_ops`
|
# Pousser est un autre acte : le runner s'y presente avec SA cle — celle que `serveur_ops`
|
||||||
|
|
@ -123,6 +124,9 @@
|
||||||
url: "https://forge.{{ domaine_interne }}/api/v1/orgs/{{ serveur_ops_forge_organisation | default('genome') }}"
|
url: "https://forge.{{ domaine_interne }}/api/v1/orgs/{{ serveur_ops_forge_organisation | default('genome') }}"
|
||||||
validate_certs: false
|
validate_certs: false
|
||||||
status_code: [200, 404]
|
status_code: [200, 404]
|
||||||
|
# UNE LECTURE, DONC AUSSI EN SIMULATION : sans elle, `--check` sautait la sonde et la
|
||||||
|
# tache suivante echouait sur un statut absent (2026-10-14).
|
||||||
|
check_mode: false
|
||||||
register: genome_org
|
register: genome_org
|
||||||
|
|
||||||
- name: Créer l'organisation du génome
|
- name: Créer l'organisation du génome
|
||||||
|
|
@ -153,8 +157,99 @@
|
||||||
loop_control:
|
loop_control:
|
||||||
label: "{{ item.depot }}"
|
label: "{{ item.depot }}"
|
||||||
no_log: true
|
no_log: true
|
||||||
|
check_mode: false
|
||||||
register: genome_depots_forge
|
register: genome_depots_forge
|
||||||
|
|
||||||
|
# LA SIMULATION DIT CE QUE LA POUSSEE FERAIT, PUIS S'ARRETE (2026-10-14).
|
||||||
|
#
|
||||||
|
# Tout ce qui suit est `uri` en ecriture ou `command` : `--check` le saute, et le verdict
|
||||||
|
# final comparait alors une forge intacte a des colis jamais recus. On ne lit donc que la
|
||||||
|
# forge et le poste, on compare, et on rend la main avant la premiere ecriture.
|
||||||
|
- name: Simulation — la branche que porte la forge
|
||||||
|
ansible.builtin.uri:
|
||||||
|
url: >-
|
||||||
|
https://forge.{{ domaine_interne }}/api/v1/repos/{{ serveur_ops_forge_organisation
|
||||||
|
| default('genome') }}/{{ item.item.depot }}/branches/{{ item.item.branche | default('main') }}
|
||||||
|
url_username: forgejo-admin
|
||||||
|
url_password: "{{ vault_forgejo_admin }}"
|
||||||
|
force_basic_auth: true
|
||||||
|
validate_certs: false
|
||||||
|
status_code: [200, 404]
|
||||||
|
loop: "{{ genome_depots_forge.results }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item.item.depot }}"
|
||||||
|
register: genome_sim_forge
|
||||||
|
retries: 4
|
||||||
|
delay: 3
|
||||||
|
until: genome_sim_forge is succeeded
|
||||||
|
check_mode: false
|
||||||
|
no_log: true
|
||||||
|
when:
|
||||||
|
- ansible_check_mode
|
||||||
|
- item.status == 200
|
||||||
|
|
||||||
|
# `--left-right` : a gauche ce que la forge porte et que le poste n'a pas (le runner
|
||||||
|
# refusera, `--ff-only`), a droite ce qui serait pousse. rc 128 : le poste ne connait
|
||||||
|
# pas le commit de la forge — l'avance rapide est impossible a juger d'ici.
|
||||||
|
- name: Simulation — l'écart entre la forge et le poste
|
||||||
|
ansible.builtin.command:
|
||||||
|
argv:
|
||||||
|
- git
|
||||||
|
- -C
|
||||||
|
- "{{ genome_freres }}/{{ item.item.item.dest }}"
|
||||||
|
- rev-list
|
||||||
|
- --count
|
||||||
|
- --left-right
|
||||||
|
- "{{ item.json.commit.id }}...refs/heads/{{ item.item.item.branche | default('main') }}"
|
||||||
|
delegate_to: localhost
|
||||||
|
become: false
|
||||||
|
loop: "{{ genome_sim_forge.results }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item.item.item.depot }}"
|
||||||
|
register: genome_sim_ecart
|
||||||
|
check_mode: false
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
when:
|
||||||
|
- ansible_check_mode
|
||||||
|
- item.status | default(0) == 200
|
||||||
|
|
||||||
|
- name: Simulation — ce que la poussée ferait
|
||||||
|
vars:
|
||||||
|
genome_sim_lignes: >-
|
||||||
|
{%- set out = [] -%}
|
||||||
|
{%- if genome_org.status == 404 -%}
|
||||||
|
{%- set _ = out.append('organisation ' ~ (serveur_ops_forge_organisation | default('genome')) ~ ' : à créer') -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- for r in genome_sim_ecart.results -%}
|
||||||
|
{%- set d = r.item.item.item.depot -%}
|
||||||
|
{%- if r.item.item.status == 404 -%}
|
||||||
|
{%- set _ = out.append(d ~ ' : dépôt à créer, puis tout poussé') -%}
|
||||||
|
{%- elif r.item.status | default(0) == 404 -%}
|
||||||
|
{%- set _ = out.append(d ~ ' : dépôt vide, tout poussé') -%}
|
||||||
|
{%- elif r.rc != 0 -%}
|
||||||
|
{%- set _ = out.append(d ~ ' : la forge porte ' ~ r.item.json.commit.id[:7]
|
||||||
|
~ ', inconnu du poste — avance rapide impossible à juger d ici') -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set lr = r.stdout.split() | map('int') | list -%}
|
||||||
|
{%- if lr[0] > 0 -%}
|
||||||
|
{%- set _ = out.append(d ~ ' : la forge a ' ~ lr[0] ~ ' commit(s) absent(s) du poste — le runner REFUSERA (--ff-only)') -%}
|
||||||
|
{%- elif lr[1] == 0 -%}
|
||||||
|
{%- set _ = out.append(d ~ ' : à jour (' ~ r.item.json.commit.id[:7] ~ ')') -%}
|
||||||
|
{%- else -%}
|
||||||
|
{%- set _ = out.append(d ~ ' : ' ~ r.item.json.commit.id[:7] ~ ' → ' ~ lr[1] ~ ' commit(s) en avance rapide') -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endif -%}
|
||||||
|
{%- endfor -%}
|
||||||
|
{{ out }}
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: "{{ genome_sim_lignes }}"
|
||||||
|
when: ansible_check_mode
|
||||||
|
|
||||||
|
- name: Simulation — s'arrêter avant la première écriture
|
||||||
|
ansible.builtin.meta: end_host
|
||||||
|
when: ansible_check_mode
|
||||||
|
|
||||||
- name: Créer les dépôts qui manquent
|
- name: Créer les dépôts qui manquent
|
||||||
ansible.builtin.uri:
|
ansible.builtin.uri:
|
||||||
url: "https://forge.{{ domaine_interne }}/api/v1/orgs/{{ serveur_ops_forge_organisation | default('genome') }}/repos"
|
url: "https://forge.{{ domaine_interne }}/api/v1/orgs/{{ serveur_ops_forge_organisation | default('genome') }}/repos"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue