Files
FarmaFinder/scripts/deploy-env.sh
T
Antoni Nuñez Romeu 573d2e5d35
Run Tests on Branches / Detect Changes (push) Successful in 15s
Run Tests on Branches / Backend Tests (push) Successful in 2m31s
Run Tests on Branches / Frontend Tests (push) Has been skipped
Run Tests on Branches / Frontend Mobile Tests (push) Has been skipped
Run Tests on Branches / Parapharmacy API Tests (push) Successful in 2m24s
Run Tests on Branches / PIP Platform Tests (push) Has been skipped
ci: inject .env files from Gitea variables during deploy
Replace the basic .env.example sync with a deploy script that fetches
repo variables from the Gitea API and writes them to the correct .env
files, preserving comments from .env.example templates.
2026-07-24 09:56:27 +02:00

192 lines
5.6 KiB
Bash

#!/usr/bin/env bash
# deploy-env.sh — Fetch Gitea Actions variables and write .env files.
# Called by the CI/CD deploy step on the self-hosted runner.
#
# Required env vars (injected by Gitea Actions):
# GITEA_TOKEN — API token with repo read access
# GITEA_OWNER — repo owner (e.g. Ichitux)
# GITEA_REPO — repo name (e.g. FarmaFinder)
#
# Usage:
# GITEA_TOKEN=xxx GITEA_OWNER=Ichitux GITEA_REPO=FarmaFinder ./scripts/deploy-env.sh
set -euo pipefail
GITEA_URL="${GITEA_URL:-https://git.hacecalor.net}"
WORK_DIR="${WORK_DIR:-.}"
# ---------------------------------------------------------------------------
# Helper: fetch all repo variables from Gitea API (handles pagination)
# Returns JSON array on stdout
# ---------------------------------------------------------------------------
fetch_variables() {
local page=1 limit=50 all='[]'
while true; do
local resp
resp=$(curl -sf \
-H "Authorization: token ${GITEA_TOKEN}" \
"${GITEA_URL}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/actions/variables?limit=${limit}&page=${page}")
local count
count=$(echo "$resp" | python3 -c "import sys,json; print(len(json.load(sys.stdin)))")
all=$(python3 -c "
import sys, json
a = json.loads('''${all}''')
b = json.loads(sys.stdin.read())
print(json.dumps(a + b))
" <<< "$resp")
if [ "$count" -lt "$limit" ]; then
break
fi
page=$((page + 1))
done
echo "$all"
}
# ---------------------------------------------------------------------------
# Helper: write a .env file from a JSON object of key-value pairs.
# Keys are sorted alphabetically. Comments from .env.example are preserved.
# ---------------------------------------------------------------------------
write_env() {
local env_path="$1"
local json_obj="$2"
local example_path="${env_path}.example"
# If no example file exists, write a plain KEY=VALUE file
if [ ! -f "$example_path" ]; then
python3 -c "
import json, sys
obj = json.loads('''${json_obj}''')
for k in sorted(obj):
print(f'{k}={obj[k]}')
" > "$env_path"
echo "[env] Wrote $env_path (${#json_obj} bytes, no .example template)"
return
fi
# If .example exists, produce a file that preserves comments/order
# and fills in values from the JSON
python3 -c "
import json, sys, re
example_path = '''${example_path}'''
env_path = '''${env_path}'''
values = json.loads('''${json_obj}''')
with open(example_path) as f:
lines = f.readlines()
output = []
written_keys = set()
for line in lines:
stripped = line.rstrip('\n')
# Pass through comments and blank lines
if stripped.startswith('#') or stripped.strip() == '':
output.append(stripped)
continue
# Parse KEY=VALUE lines
m = re.match(r'^([A-Za-z_][A-Za-z0-9_]*)=(.*)', stripped)
if m:
key, _ = m.group(1), m.group(2)
if key in values:
output.append(f'{key}={values[key]}')
written_keys.add(key)
else:
output.append(stripped) # keep example default
else:
output.append(stripped)
# Append any keys from values that weren't in .example
for k in sorted(values):
if k not in written_keys:
output.append(f'{k}={values[k]}')
with open(env_path, 'w') as f:
f.write('\n'.join(output) + '\n')
print(f'[env] Wrote {env_path} ({len(values)} vars)')
" 2>&1
}
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
echo "=== deploy-env.sh ==="
echo "Fetching variables from Gitea: ${GITEA_OWNER}/${GITEA_REPO}"
VARS_JSON=$(fetch_variables)
VAR_COUNT=$(echo "$VARS_JSON" | python3 -c "import sys,json; print(len(json.load(sys.stdin)))")
echo "Found ${VAR_COUNT} variables"
# Group variables by prefix
# ROOT_* → root .env (strip prefix)
# BACKEND_* → apps/backend/.env (strip prefix)
# FRONTEND_* → apps/frontend/.env (strip prefix)
# PARAPHARMACY_* → apps/parapharmacy-api/.env (strip prefix)
# No prefix → root .env (backward compat with original vars)
ROOT_VARS=$(python3 -c "
import json, sys
vars = json.loads(sys.stdin.read())
# Keys that are CI-only and should NOT appear in application .env files
skip = {'GITEA_TOKEN'}
result = {}
for v in vars:
name = v['name']
value = v['data']
if name in skip:
continue
if name.startswith('ROOT_'):
result[name[5:]] = value # strip ROOT_ prefix
elif not any(name.startswith(p) for p in ['BACKEND_', 'FRONTEND_', 'PARAPHARMACY_']):
result[name] = value # unprefixed → root
print(json.dumps(result))
" <<< "$VARS_JSON")
BACKEND_VARS=$(python3 -c "
import json, sys
vars = json.loads(sys.stdin.read())
result = {}
for v in vars:
name = v['name']
if name.startswith('BACKEND_'):
result[name[8:]] = value = v['data']
print(json.dumps(result))
" <<< "$VARS_JSON")
FRONTEND_VARS=$(python3 -c "
import json, sys
vars = json.loads(sys.stdin.read())
result = {}
for v in vars:
name = v['name']
if name.startswith('FRONTEND_'):
result[name[9:]] = v['data']
print(json.dumps(result))
" <<< "$VARS_JSON")
PARAPHARMACY_VARS=$(python3 -c "
import json, sys
vars = json.loads(sys.stdin.read())
result = {}
for v in vars:
name = v['name']
if name.startswith('PARAPHARMACY_'):
result[name[13:]] = v['data']
print(json.dumps(result))
" <<< "$VARS_JSON")
# Write each .env file
echo ""
write_env "${WORK_DIR}/.env" "$ROOT_VARS"
write_env "${WORK_DIR}/apps/backend/.env" "$BACKEND_VARS"
write_env "${WORK_DIR}/apps/frontend/.env" "$FRONTEND_VARS"
write_env "${WORK_DIR}/apps/parapharmacy-api/.env" "$PARAPHARMACY_VARS"
echo ""
echo "=== All .env files written ==="