107 lines
3.6 KiB
YAML
107 lines
3.6 KiB
YAML
name: vuln-osv Synchronisation (lokaler Git-Cache)
|
|
|
|
on:
|
|
schedule:
|
|
- cron: "41 */6 * * *"
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
concurrency:
|
|
group: vuln-osv-sync
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
mirror:
|
|
runs-on: vuln-runner
|
|
timeout-minutes: 360
|
|
steps:
|
|
- name: Rohdaten aktualisieren
|
|
shell: bash
|
|
env:
|
|
GITEA_JOB_TOKEN: ${{ secrets.GITEATOKEN }}
|
|
CACHE_ROOT: /var/lib/act_runner/cache/vuln-osv
|
|
run: |
|
|
set -Eeuo pipefail
|
|
umask 077
|
|
: "${GITEA_JOB_TOKEN:?GITEATOKEN fehlt}"
|
|
mkdir -p "$CACHE_ROOT"
|
|
exec 9>"$CACHE_ROOT/.sync.lock"
|
|
flock -w 300 9 || { echo "Bereits ein Lauf aktiv" >&2; exit 1; }
|
|
|
|
ASKPASS="$(mktemp "$CACHE_ROOT/.askpass.XXXXXX")"
|
|
trap 'rm -f "$ASKPASS"' EXIT
|
|
cat > "$ASKPASS" <<'ASKPASS_SCRIPT'
|
|
#!/bin/sh
|
|
case "$1" in
|
|
*Username*|*username*) printf '%s\n' 'oauth2' ;;
|
|
*Password*|*password*) printf '%s\n' "$GITEA_JOB_TOKEN" ;;
|
|
*) exit 1 ;;
|
|
esac
|
|
ASKPASS_SCRIPT
|
|
chmod 700 "$ASKPASS"
|
|
export GIT_ASKPASS="$ASKPASS" GIT_TERMINAL_PROMPT=0
|
|
|
|
REMOTE="https://git.apex-project.de/VULN/vuln-osv.git"
|
|
REPO="$CACHE_ROOT/repo"
|
|
|
|
backup_repo() {
|
|
mkdir -p "$CACHE_ROOT/backups"
|
|
local backup="$CACHE_ROOT/backups/repo.$(date -u +%Y%m%dT%H%M%SZ).$$"
|
|
echo "Repository-Cache wird gesichert: $backup"
|
|
mv -- "$REPO" "$backup"
|
|
}
|
|
|
|
clone_repo() {
|
|
git -c credential.helper= clone \
|
|
--branch main --single-branch --depth 1 \
|
|
"$REMOTE" "$REPO"
|
|
}
|
|
|
|
if [ ! -d "$REPO/.git" ]; then
|
|
if [ -e "$REPO" ]; then
|
|
backup_repo
|
|
fi
|
|
clone_repo
|
|
else
|
|
# Den Tracking-Stand VOR dem Fetch merken: bei shallow clones
|
|
# ist ein reiner rev-list-Vergleich NACH dem Fetch unzuverlaessig.
|
|
OLD_REMOTE_HEAD="$(git -C "$REPO" rev-parse -q --verify refs/remotes/origin/main 2>/dev/null || true)"
|
|
LOCAL_HEAD="$(git -C "$REPO" rev-parse -q --verify HEAD 2>/dev/null || true)"
|
|
LOCAL_STATUS="$(git -C "$REPO" status --porcelain)"
|
|
|
|
git -C "$REPO" remote set-url origin "$REMOTE"
|
|
git -C "$REPO" -c credential.helper= fetch --no-tags --depth 1 origin main
|
|
NEW_REMOTE_HEAD="$(git -C "$REPO" rev-parse FETCH_HEAD)"
|
|
|
|
if [ -n "$LOCAL_STATUS" ]; then
|
|
echo "Lokale Aenderungen gefunden; sichere Repository-Cache."
|
|
backup_repo
|
|
clone_repo
|
|
elif [ "$LOCAL_HEAD" = "$OLD_REMOTE_HEAD" ] || [ "$LOCAL_HEAD" = "$NEW_REMOTE_HEAD" ]; then
|
|
# Keine ausstehenden lokalen Commits: Aktualisierung ist sicher.
|
|
git -C "$REPO" checkout -B main "$NEW_REMOTE_HEAD"
|
|
else
|
|
echo "Moeglicherweise ungepushte lokale Commits; sichere Repository-Cache."
|
|
backup_repo
|
|
clone_repo
|
|
fi
|
|
fi
|
|
|
|
cd "$REPO"
|
|
python3 scripts/sync.py
|
|
python3 scripts/validate.py
|
|
|
|
git config user.name "Vulnerability Bot"
|
|
git config user.email "vuln-bot@users.noreply.local"
|
|
git add -A -- data/ state/
|
|
if git diff --cached --quiet; then
|
|
echo "Keine neuen Daten"
|
|
exit 0
|
|
fi
|
|
|
|
git commit -m "vuln-osv update $(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
git -c credential.helper= push origin HEAD:main
|
|
|