PG18 de retour, mises à jour nocturnes, tests de reprise et documentation
🚀 Docker Build and Push / build-and-push (15) (push) Successful in 5m29s
🚀 Docker Build and Push / build-and-push (16) (push) Successful in 6m10s
🚀 Docker Build and Push / build-and-push (17) (push) Successful in 5m20s
🚀 Docker Build and Push / build-and-push (18) (push) Successful in 5m21s
🚀 Docker Build and Push / build-and-push (15) (push) Successful in 5m29s
🚀 Docker Build and Push / build-and-push (16) (push) Successful in 6m10s
🚀 Docker Build and Push / build-and-push (17) (push) Successful in 5m20s
🚀 Docker Build and Push / build-and-push (18) (push) Successful in 5m21s
Image - Étape `base` commune : tous les paquets sont mis à niveau (PostgreSQL à la dernière mineure, pgvector, Debian). L'image de base de VectorChord restait figée à la version de sa publication. - En-têtes du serveur épinglés sur la version du serveur installé. PG18 avait été retiré parce que TimescaleDB, compilé avec des en-têtes 18.6, était chargé par un serveur 18.3 (`undefined symbol: palloc0_mul`). - Sonde de santé avec l'utilisateur et la base du conteneur : en `postgres`, elle écrivait une erreur FATAL au journal dès que POSTGRES_USER était défini. - Label `base.name` corrigé : il reprenait la version du paquet au lieu de la version majeure. CI - PG18 ajouté à la matrice. - Exécution nocturne : apt est interrogé dans l'image publiée ; elle n'est reconstruite et republiée que s'il lui reste des mises à jour, sinon elle est seulement testée. Lancement manuel possible. - `docker-build.yml` supprimé : l'ancien workflow à actions externes tournait encore à chaque push, en double de `docker.yml`. - `paths-ignore` : un push de documentation seule ne lance pas la CI. - Labels `version`, `url` et `fr.killinger.apt-refresh`. Tests - `tests.sh`, la même commande en local et en CI : utilisateur et base autres que `postgres`, version majeure du serveur, présence des cinq extensions, redémarrage, et reprise d'une base créée par l'image publiée. Documentation - README en vitrine, CLAUDE.md, docs/architecture.md, docs/exploitation/publication.md, six décisions, docs/a-faire.md.
This commit is contained in:
18 files changed
+956
-242
No files matched your search
@@ -0,0 +1,25 @@
|
||||
-- Reprise 1 : données créées par l'image précédente, relues ensuite par la nouvelle
|
||||
-- (reprise-2-controle.sql). Une table par extension.
|
||||
\set ON_ERROR_STOP on
|
||||
|
||||
CREATE TABLE reprise_mesures (
|
||||
time TIMESTAMPTZ NOT NULL,
|
||||
capteur INTEGER,
|
||||
valeur DOUBLE PRECISION
|
||||
);
|
||||
SELECT create_hypertable('reprise_mesures', 'time');
|
||||
INSERT INTO reprise_mesures
|
||||
SELECT TIMESTAMPTZ '2026-01-01' + n * INTERVAL '1 day', 1, n FROM generate_series(1, 30) AS n;
|
||||
|
||||
CREATE TABLE reprise_vecteurs (
|
||||
id bigserial PRIMARY KEY,
|
||||
embedding vector(3)
|
||||
);
|
||||
INSERT INTO reprise_vecteurs (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'), ('[1.1, 2.1, 3.1]');
|
||||
CREATE INDEX ON reprise_vecteurs USING vchordrq (embedding vector_l2_ops);
|
||||
|
||||
CREATE TABLE reprise_lieux (
|
||||
id serial PRIMARY KEY,
|
||||
geom geometry(Point, 4326)
|
||||
);
|
||||
INSERT INTO reprise_lieux (geom) VALUES (ST_GeomFromText('POINT(7.75 48.58)', 4326));
|
||||
@@ -0,0 +1,39 @@
|
||||
-- Reprise 2 : la nouvelle image démarre sur les données de la précédente
|
||||
-- (reprise-1-semis.sql). Les extensions sont d'abord mises à niveau, comme le fait
|
||||
-- l'exploitant ; la première instruction de la session doit être celle de TimescaleDB.
|
||||
\set ON_ERROR_STOP on
|
||||
|
||||
ALTER EXTENSION timescaledb UPDATE;
|
||||
ALTER EXTENSION vector UPDATE;
|
||||
ALTER EXTENSION vchord UPDATE;
|
||||
SELECT postgis_extensions_upgrade();
|
||||
|
||||
INSERT INTO reprise_mesures VALUES (TIMESTAMPTZ '2026-03-01', 1, 99);
|
||||
INSERT INTO reprise_vecteurs (embedding) VALUES ('[7,8,9]');
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
mesures int;
|
||||
plus_proche int;
|
||||
lieux int;
|
||||
BEGIN
|
||||
SELECT count(*) INTO mesures FROM reprise_mesures;
|
||||
IF mesures != 31 THEN
|
||||
RAISE EXCEPTION 'Hypertable : 31 lignes attendues, % lues', mesures;
|
||||
END IF;
|
||||
|
||||
SET LOCAL enable_seqscan = off;
|
||||
SELECT id INTO plus_proche FROM reprise_vecteurs ORDER BY embedding <-> '[1,2,3]' LIMIT 1;
|
||||
IF plus_proche != 1 THEN
|
||||
RAISE EXCEPTION 'Index vchordrq : identifiant 1 attendu, % lu', plus_proche;
|
||||
END IF;
|
||||
|
||||
SELECT count(*) INTO lieux FROM reprise_lieux
|
||||
WHERE ST_DWithin(geom, ST_GeomFromText('POINT(7.75 48.58)', 4326), 0.01);
|
||||
IF lieux != 1 THEN
|
||||
RAISE EXCEPTION 'PostGIS : 1 lieu attendu, % lus', lieux;
|
||||
END IF;
|
||||
|
||||
RAISE NOTICE 'Reprise : OK';
|
||||
END
|
||||
$$;
|
||||
@@ -4,6 +4,19 @@
|
||||
SELECT version();
|
||||
SELECT extname, extversion FROM pg_extension;
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
missing text;
|
||||
BEGIN
|
||||
SELECT string_agg(name, ', ') INTO missing
|
||||
FROM unnest(ARRAY['timescaledb', 'vector', 'vchord', 'postgis', 'postgis_topology']) AS name
|
||||
WHERE name NOT IN (SELECT extname FROM pg_extension);
|
||||
IF missing IS NOT NULL THEN
|
||||
RAISE EXCEPTION 'Missing extensions: %', missing;
|
||||
END IF;
|
||||
END
|
||||
$$;
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
preload_libs text;
|
||||
|
||||
Reference in new issue
Block a user