feat(R4b): reproducible builds — pin requirements.lock checksum
- Dockerfile: build-arg REQUIREMENTS_CHECKSUM verifica lo sha256 del lockfile (fallisce la build se non coincide; vuoto = skip locale) - docker-compose.yml: default = hash corrente del lock - CI: nuovo job checksum.yml che fallisce se il pin non coincide - Fix YAML preesistente in ci.yml (name: con ':' non quotati) - Docs: README, .env.example, review aggiornati
This commit is contained in:
1 parent
0f15b7958f
commit
12d2018ac5
7 files changed
+78
-10
No files matched your search
@@ -0,0 +1,34 @@
|
||||
name: deps-checksum
|
||||
|
||||
# R4b: il lockfile è "pinnato" per costruzioni riproducibili. Questo job
|
||||
# fallisce se l'hash in docker-compose.yml non coincide con requirements.lock.
|
||||
# Quando aggiorni le dipendenze:
|
||||
# pip-compile --output-file=requirements.lock requirements.in
|
||||
# sed -i "s/d13e4fb14a909e0bd06d20894860152d5334aa341dd9dec2e5e4ca368a0d2a62/$(sha256sum requirements.lock | awk '{print $1}')/" docker-compose.yml
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
checksum:
|
||||
runs-on: ubuntu-latest
|
||||
name: checksum lockfile
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Calcola hash attuale
|
||||
id: hash
|
||||
run: |
|
||||
H=$(sha256sum requirements.lock | awk '{print $1}')
|
||||
echo "hash=$H" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: hash pinned in docker-compose.yml
|
||||
run: |
|
||||
PIN=$(grep -oP 'REQUIREMENTS_CHECKSUM: \$\{REQUIREMENTS_CHECKSUM:-\K[a-f0-9]{64}' docker-compose.yml | head -1)
|
||||
[ -n "$PIN" ] || { echo "hash non pinnato in docker-compose.yml"; exit 1; }
|
||||
echo "pinned=$PIN"
|
||||
echo "atteso=${{ steps.hash.outputs.hash }}"
|
||||
[ "$PIN" = "${{ steps.hash.outputs.hash }}" ] || { echo "checksum non aggiornato — rivedi docker-compose.yml"; exit 1; }
|
||||
echo "checksum OK"
|
||||
@@ -58,7 +58,7 @@ jobs:
|
||||
docker compose logs bookish
|
||||
exit 1
|
||||
|
||||
- name: Smoke: upload epub -> epub (conversione, SSE)
|
||||
- name: "Smoke: upload epub -> epub (conversione, SSE)"
|
||||
run: |
|
||||
# finto epub (zip minimo vuoto accettato per estensione; la conversione
|
||||
# può fallire per formato, ma l'upload deve tornare 200 con task_id)
|
||||
@@ -67,11 +67,11 @@ jobs:
|
||||
echo "$RESP"
|
||||
echo "$RESP" | grep -q '"task_id"' || { echo "task_id mancante"; exit 1; }
|
||||
|
||||
- name: Smoke: CSP header presente
|
||||
- name: "Smoke: CSP header presente"
|
||||
run: |
|
||||
curl -sI http://127.0.0.1:5000/ | grep -q "Content-Security-Policy" || { echo "CSP assente"; exit 1; }
|
||||
|
||||
- name: Smoke: auth opzionale funziona (override)
|
||||
- name: "Smoke: auth opzionale funziona (override)"
|
||||
run: |
|
||||
cat > /tmp/override.yml << 'EOF'
|
||||
services:
|
||||
|
||||
Reference in new issue
Block a user