dx: github workflow "wiki-monitor"

Massimo Melina committed Jan 12, 2026 at 12:49 UTC e6bc43e4d5fc7ce08bf66a31d5ff2559ce6b52fa
1 file changed +138
.github/workflows/wiki-monitor.yml new
+138
@@ -0,0 +1,138 @@
1 +name: Wiki monitor
2 +
3 +on:
4 + schedule:
5 + - cron: '0 */2 * * *'
6 + workflow_dispatch:
7 +
8 +permissions:
9 + contents: read
10 +
11 +jobs:
12 + check:
13 + runs-on: ubuntu-latest
14 + steps:
15 + - name: Restore last seen commit
16 + id: cache-restore
17 + uses: actions/cache/restore@v4
18 + with:
19 + path: .wiki-monitor
20 + key: wiki-monitor-${{ github.run_id }}
21 + restore-keys: |
22 + wiki-monitor-
23 +
24 + - name: Get latest wiki commit
25 + id: wiki
26 + shell: bash
27 + run: |
28 + set -euo pipefail
29 + repo='${{ github.repository }}'
30 + url="https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${repo}.wiki.git"
31 + if ! sha=$(git ls-remote "$url" HEAD | awk '{print $1}'); then
32 + echo 'exists=false' >> "$GITHUB_OUTPUT"
33 + echo 'Wiki repo not found or inaccessible.'
34 + exit 0
35 + fi
36 + if [ -z "$sha" ]; then
37 + echo 'exists=false' >> "$GITHUB_OUTPUT"
38 + echo 'Wiki repo not found or empty.'
39 + exit 0
40 + fi
41 + echo 'exists=true' >> "$GITHUB_OUTPUT"
42 + echo "sha=$sha" >> "$GITHUB_OUTPUT"
43 +
44 + - name: Send Telegram alert
45 + if: steps.wiki.outputs.exists == 'true'
46 + env:
47 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
48 + TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
49 + TELEGRAM_CHAT_ID: '128365884'
50 + REPO: ${{ github.repository }}
51 + SKIP_EMAILS: 'a@rejetto.com'
52 + run: |
53 + set -euo pipefail
54 + if [ -z "$TELEGRAM_BOT_TOKEN" ]; then
55 + echo 'Missing TELEGRAM_BOT_TOKEN; skipping Telegram alert.'
56 + exit 0
57 + fi
58 + url="https://x-access-token:${GITHUB_TOKEN}@github.com/${REPO}.wiki.git"
59 + mkdir -p .wiki-monitor
60 + if [ ! -d .wiki-monitor/wiki ]; then
61 + git clone --quiet --depth=50 "$url" .wiki-monitor/wiki
62 + fi
63 + cd .wiki-monitor/wiki
64 + git fetch --quiet origin HEAD
65 + git -c advice.detachedHead=false checkout --quiet FETCH_HEAD
66 + latest_sha=$(git rev-parse HEAD)
67 + last_seen_file=../last_seen
68 + last_seen=''
69 + if [ -f "$last_seen_file" ]; then
70 + last_seen=$(cat "$last_seen_file")
71 + fi
72 + if [ -n "$last_seen" ] && ! git cat-file -e "$last_seen^{commit}" 2>/dev/null; then
73 + git fetch --quiet --unshallow || true
74 + fi
75 + if [ -n "$last_seen" ] && ! git cat-file -e "$last_seen^{commit}" 2>/dev/null; then
76 + echo "Last seen commit missing; resetting baseline to ${latest_sha}."
77 + echo "$latest_sha" > "$last_seen_file"
78 + exit 0
79 + fi
80 + range=''
81 + if [ -n "$last_seen" ]; then
82 + range="${last_seen}..HEAD"
83 + fi
84 + commits=$(git log --format='%H|%an|%ae' ${range:+$range})
85 + if [ -z "$last_seen" ]; then
86 + echo "$latest_sha" > "$last_seen_file"
87 + echo 'Initialized last seen commit; skipping notification.'
88 + exit 0
89 + fi
90 + echo "Last seen: ${last_seen:-<none>}"
91 + echo "Latest: ${latest_sha}"
92 + notify=''
93 + if [ -n "$commits" ]; then
94 + echo 'Commits since last seen:'
95 + echo "$commits"
96 + while IFS='|' read -r sha author_name author_email; do
97 + if [ -z "$sha" ]; then
98 + continue
99 + fi
100 + if [ -n "$SKIP_EMAILS" ]; then
101 + IFS=',' read -r -a skip_emails <<< "$SKIP_EMAILS"
102 + for email in "${skip_emails[@]}"; do
103 + if [ "${author_email}" = "${email}" ]; then
104 + sha=''
105 + break
106 + fi
107 + done
108 + if [ -z "$sha" ]; then
109 + continue
110 + fi
111 + fi
112 + short_sha=$(echo "$sha" | cut -c1-7)
113 + files=$(git diff-tree --no-commit-id --name-only -r "$sha" | tr '\n' ',' | sed 's/,$//')
114 + if [ -z "$files" ]; then
115 + files='(no file list)'
116 + fi
117 + notify="${notify}- ${short_sha} by ${author_name} files: ${files}\n"
118 + done <<< "$commits"
119 + fi
120 + echo "$latest_sha" > "$last_seen_file"
121 + if [ -z "$notify" ]; then
122 + exit 0
123 + fi
124 + message="Wiki updated by others:\n${notify}"
125 + response=$(printf '%b' "$message" | \
126 + curl -sS -w '\nHTTP_STATUS=%{http_code}\n' -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
127 + -d "chat_id=${TELEGRAM_CHAT_ID}" \
128 + --data-urlencode "text@-" \
129 + -d "disable_web_page_preview=true")
130 + echo "Telegram response:"
131 + echo "$response"
132 +
133 + - name: Save last seen commit
134 + if: steps.wiki.outputs.exists == 'true'
135 + uses: actions/cache/save@v4
136 + with:
137 + path: .wiki-monitor
138 + key: wiki-monitor-${{ github.run_id }}