99permissions :
1010 contents : write
1111 id-token : write
12- issues : write
1312
1413concurrency :
1514 group : ${{ github.workflow }}-${{ github.ref }}
4847 # ═══════════════════════════════════════════════════════════════════
4948 # STEP 1 — INVENTORY BUILD
5049 # ═══════════════════════════════════════════════════════════════════
51- - name : Download previous report (for signals delta)
52- if : ${{ env.GCP_WORKLOAD_IDENTITY_PROVIDER != '' && env.GCP_SERVICE_ACCOUNT != '' && env.CATALOG_INVENTORY_GCS_PREFIX != '' }}
53- run : |
54- prefix='${{ env.CATALOG_INVENTORY_GCS_PREFIX }}'
55- prefix="${prefix%/}"
56- gcloud storage cp "$prefix/catalog_inventory_report.json" previous_report.json || echo "{}" > previous_report.json
57-
5850 - name : Download previous inventory (for source-check merge)
5951 if : ${{ env.GCP_WORKLOAD_IDENTITY_PROVIDER != '' && env.GCP_SERVICE_ACCOUNT != '' && env.CATALOG_INVENTORY_GCS_PREFIX != '' }}
6052 run : |
@@ -71,97 +63,36 @@ jobs:
7163 --workers 16 \
7264 --skip-red-sources
7365
74- - name : Build catalog signals + diff
75- run : |
76- python scripts/build_catalog_signals.py \
77- --report data/catalog_inventory/generated/catalog_inventory_report.json \
78- --previous previous_report.json \
79- --radar data/radar/radar_summary.json \
80- --out data/catalog/catalog_signals.json
81-
82- if python -c "import json,sys; d=json.load(open('previous_report.json')); sys.exit(0 if d.get('sources') else 1)"; then
83- python scripts/catalog_diff.py previous_report.json \
84- data/catalog_inventory/generated/catalog_inventory_report.json --output diff.md
85- else
86- echo "NO_BASELINE" > diff.md
87- fi
88-
89- - name : Commit catalog signals
90- env :
91- GH_TOKEN : ${{ github.token }}
92- run : |
93- git config user.name "github-actions[bot]"
94- git config user.email "github-actions[bot]@users.noreply.github.com"
95- git add data/catalog/catalog_signals.json
96- if git diff --cached --quiet; then
97- echo "Nessuna variazione nei segnali."
98- else
99- git commit -m "chore(so): aggiorna catalog_signals e watch report [ci skip]"
100- git push
101- fi
102-
103- - name : Create catalog alert issue
104- env :
105- GH_TOKEN : ${{ github.token }}
106- GCS_PREFIX : ${{ secrets.CATALOG_INVENTORY_GCS_PREFIX }}
107- run : |
108- python scripts/gha/build_issue_body.py --gcs-prefix "$GCS_PREFIX"
109- if [ ! -f issue_title.txt ]; then
110- echo "Nessuna variazione o baseline assente."
111- exit 0
112- fi
113- LABEL_ARGS=$(python3 -c "import json,sys; print(' '.join('--label '+l for l in json.load(open('issue_labels.json'))))")
114- EXISTING=$(gh issue list --label "catalog-alert" --state open --json number,title --jq \
115- ".[] | select(.title | startswith(\"[Catalog]\")) | .number" | head -1)
116- if [ -n "$EXISTING" ]; then
117- echo "Aggiorno issue #$EXISTING."
118- gh issue comment "$EXISTING" --body-file issue_body.md
119- else
120- eval "gh issue create --title \"$(cat issue_title.txt)\" --body-file issue_body.md $LABEL_ARGS"
121- fi
122-
12366 # ═══════════════════════════════════════════════════════════════════
124- # STEP 3 — SOURCE-CHECK (sempre )
67+ # STEP 2 — PIPELINE (merge + validate )
12568 # ═══════════════════════════════════════════════════════════════════
126- - name : Download source-check results from GCS (for merge)
127- if : ${{ env.GCP_WORKLOAD_IDENTITY_PROVIDER != '' && env.GCP_SERVICE_ACCOUNT != '' && env.CATALOG_INVENTORY_GCS_PREFIX != '' }}
69+ - name : Clean old artifacts
12870 run : |
129- prefix='${{ env.CATALOG_INVENTORY_GCS_PREFIX }}'
130- prefix="${prefix%/}"
131- mkdir -p data/catalog_inventory/generated
132- gcloud storage cp "$prefix/source-check/source_check_results.parquet" \
133- data/catalog_inventory/generated/source_check_results.parquet 2>/dev/null || \
134- echo "No previous results — starting fresh"
71+ rm -f data/catalog/CATALOG_WATCH_REPORT.md
13572
136- - name : Run bulk source-check
73+ - name : Run pipeline (merge + validate)
13774 run : |
138- python scripts/bulk_source_check.py \
139- --skip-red-sources \
140- --no-sdmx-years \
141- --circuit-fail-threshold 2 \
142- --max-items 5000 \
75+ python scripts/pipeline/run_pipeline.py \
14376 --workers 16
14477
14578 # ═══════════════════════════════════════════════════════════════════
146- # STEP 3b — BUILD SOURCE REPORTS
79+ # STEP 3 — SOURCE REPORTS
14780 # ═══════════════════════════════════════════════════════════════════
14881 - name : Build source reports
14982 run : |
15083 python scripts/build_source_reports.py
15184
152- - name : Commit source reports + parquet
85+ - name : Commit results
15386 env :
15487 GH_TOKEN : ${{ github.token }}
15588 run : |
15689 git config user.name "github-actions[bot]"
15790 git config user.email "github-actions[bot]@users.noreply.github.com"
158- git add data/reports/
159- # Parquet: force-add perché data/catalog_inventory/generated/ è in .gitignore
91+ git add data/reports/ data/pipeline/validated.parquet data/pipeline/summary.json
16092 git add -f data/catalog_inventory/generated/catalog_inventory_latest.parquet \
161- data/catalog_inventory/generated/source_check_results.parquet \
16293 data/catalog_inventory/generated/catalog_inventory_report.json
16394 if git diff --cached --quiet; then
164- echo "Nessuna variazione nei report ."
95+ echo "Nessuna variazione."
16596 else
16697 git commit -m "chore(so): aggiorna reports e parquet [ci skip]"
16798 git push
@@ -170,18 +101,21 @@ jobs:
170101 # ═══════════════════════════════════════════════════════════════════
171102 # STEP 4 — UPLOAD GCS
172103 # ═══════════════════════════════════════════════════════════════════
173- - name : Upload source-check results to GCS
104+ - name : Upload validated results to GCS
174105 if : ${{ env.GCP_WORKLOAD_IDENTITY_PROVIDER != '' && env.GCP_SERVICE_ACCOUNT != '' && env.CATALOG_INVENTORY_GCS_PREFIX != '' }}
175106 run : |
176107 stamp=$(python3 -c "from datetime import datetime, timezone; print(datetime.now(timezone.utc).strftime('%Y%m%dT%H%M%S'))")
177108 prefix='${{ env.CATALOG_INVENTORY_GCS_PREFIX }}'
178109 prefix="${prefix%/}"
179110 python scripts/gha/gcs_upload.py \
180- data/catalog_inventory/generated/source_check_results.parquet \
181- "$prefix/source-check/source_check_results.parquet"
111+ data/pipeline/validated.parquet \
112+ "$prefix/pipeline/validated.parquet"
113+ python scripts/gha/gcs_upload.py \
114+ data/pipeline/validated.parquet \
115+ "$prefix/pipeline/snapshots/validated_${stamp}.parquet"
182116 python scripts/gha/gcs_upload.py \
183- data/catalog_inventory/generated/source_check_results.parquet \
184- "$prefix/source-check/snapshots/source_check_ ${stamp}.parquet "
117+ data/pipeline/summary.json \
118+ "$prefix/pipeline/summary_ ${stamp}.json "
185119
186120 - name : Upload inventory snapshot to GCS
187121 if : ${{ env.GCP_WORKLOAD_IDENTITY_PROVIDER != '' && env.GCP_SERVICE_ACCOUNT != '' && env.CATALOG_INVENTORY_GCS_PREFIX != '' }}
@@ -207,20 +141,19 @@ jobs:
207141 "$prefix/snapshots/catalog_inventory_report_${stamp}.json"
208142
209143 # ═══════════════════════════════════════════════════════════════════
210- # STEP 5 — ARTIFACTS + SUMMARIES
144+ # STEP 5 — ARTIFACTS
211145 # ═══════════════════════════════════════════════════════════════════
212146 - name : Upload workflow artifacts
213147 uses : actions/upload-artifact@v7
214148 with :
215149 name : observatory-results
216150 path : |
217- data/catalog_inventory/generated/source_check_results.parquet
151+ data/pipeline/validated.parquet
152+ data/pipeline/summary.json
153+ data/catalog_inventory/generated/catalog_inventory_latest.parquet
218154 data/radar/radar_summary.json
219- data/radar/radar_history.json
220155
221- - name : Publish summaries
156+ - name : Publish radar summary
222157 run : |
223158 python scripts/gha/publish_radar_summary.py
224159 cat radar_summary.md >> "$GITHUB_STEP_SUMMARY"
225- python scripts/gha/publish_source_check_summary.py
226- cat source_check_summary.md >> "$GITHUB_STEP_SUMMARY"
0 commit comments