Repository navigation
108 lines (94 loc) · 4.15 KB
/
Copy pathwebsite-sync.yml
File metadata and controls
108 lines (94 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
name: "Website: Trigger data sync"
on:
repository_dispatch:
types: [sync]
workflow_dispatch:
concurrency:
group: sync-production
cancel-in-progress: true
jobs:
sync:
name: Sync data on VPS
runs-on: ubuntu-latest
steps:
- name: Verify secrets are configured
run: |
missing=""
[ -z "${{ secrets.DEPLOY_HOST }}" ] && missing="$missing DEPLOY_HOST"
[ -z "${{ secrets.DEPLOY_USER }}" ] && missing="$missing DEPLOY_USER"
[ -z "${{ secrets.DEPLOY_KEY }}" ] && missing="$missing DEPLOY_KEY"
if [ -n "$missing" ]; then
echo "::error::Missing required secrets:$missing"
exit 1
fi
- name: Sync and collect results
id: result
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_KEY }}
command_timeout: 120s
capture_stdout: true
script: |
set -euo pipefail
cd /home/website/armbian
CID=$(docker compose ps -q api)
health() {
docker exec "$CID" node -e "
fetch('http://localhost:3001/api/v1/health',{headers:{'X-Armbian-Client':'ci'}})
.then(r=>r.text())
.then(t=>{process.stdout.write(t)})
.catch(()=>{process.stdout.write('{}')})
" 2>/dev/null || echo "{}"
}
echo "::before::$(health)"
./manage.sh sync
# Wait for sync to complete (lastSync changes)
BEFORE_TS=$(health | python3 -c "import sys,json;print(json.load(sys.stdin).get('lastSync',''))" 2>/dev/null || echo "")
for i in $(seq 1 30); do
sleep 2
CURRENT_TS=$(health | python3 -c "import sys,json;print(json.load(sys.stdin).get('lastSync',''))" 2>/dev/null || echo "")
if [ "$CURRENT_TS" != "$BEFORE_TS" ] && [ -n "$CURRENT_TS" ]; then
break
fi
done
echo "::after::$(health)"
- name: Build summary
if: always()
run: |
OUTPUT='${{ steps.result.outputs.stdout }}'
BEFORE=$(echo "$OUTPUT" | grep "^::before::" | sed 's/^::before:://')
AFTER=$(echo "$OUTPUT" | grep "^::after::" | sed 's/^::after:://')
parse_count() { echo "$1" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('counts',{}).get('$2','--'))" 2>/dev/null || echo "--"; }
parse_field() { echo "$1" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('$2','--'))" 2>/dev/null || echo "--"; }
parse_source() { echo "$1" | python3 -c "import sys,json; d=json.load(sys.stdin); s=d.get('sources',{}).get('$2',{}); print(s.get('status','--'))" 2>/dev/null || echo "--"; }
{
echo "## Data sync results"
echo ""
echo "### Counts"
echo ""
echo "| Metric | Before | After |"
echo "|--------|--------|-------|"
echo "| Boards | $(parse_count "$BEFORE" boards) | $(parse_count "$AFTER" boards) |"
echo "| Images | $(parse_count "$BEFORE" images) | $(parse_count "$AFTER" images) |"
echo "| Vendors | $(parse_count "$BEFORE" vendors) | $(parse_count "$AFTER" vendors) |"
echo ""
echo "### Data sources"
echo ""
echo "| Source | Status |"
echo "|--------|--------|"
for src in images partners maintainers kernels; do
echo "| $src | $(parse_source "$AFTER" $src) |"
done
echo ""
echo "### Info"
echo ""
echo "| Property | Value |"
echo "|----------|-------|"
echo "| Health | $(parse_field "$AFTER" status) |"
echo "| Last sync | $(parse_field "$AFTER" lastSync) |"
echo "| Next sync | $(parse_field "$AFTER" nextSync) |"
echo "| Trigger | ${{ github.event_name }} |"
echo "| Source repo | ${{ github.event.client_payload.repository || 'manual' }} |"
} >> "$GITHUB_STEP_SUMMARY"