|
5 | 5 | branches:
|
6 | 6 | - main
|
7 | 7 | schedule:
|
8 |
| - - cron: '0 0 1 * *' |
| 8 | + - cron: '0 0 1 * *' # chạy đầu tháng |
9 | 9 | workflow_dispatch:
|
10 | 10 |
|
11 | 11 | jobs:
|
|
16 | 16 | - name: Checkout source
|
17 | 17 | uses: actions/checkout@v4
|
18 | 18 |
|
| 19 | + - name: Check and build Packages |
| 20 | + shell: bash |
| 21 | + run: | |
| 22 | + set -euo pipefail |
| 23 | + rm -f Packages Packages.gz scan.log tmp.log removed.list |
| 24 | +
|
| 25 | + echo "🔎 Pre-check: remove .deb that dpkg-deb cannot read" |
| 26 | + # dùng find -print0 để an toàn với tên có dấu cách |
| 27 | + while IFS= read -r -d '' f; do |
| 28 | + echo "Checking $f ..." |
| 29 | + if ! dpkg-deb -I "$f" >/dev/null 2>&1; then |
| 30 | + echo "❌ dpkg-deb failed: removing $f" |
| 31 | + rm -f -- "$f" |
| 32 | + else |
| 33 | + echo "✅ OK: $f" |
| 34 | + fi |
| 35 | + done < <(find . -maxdepth 1 -type f -name "*.deb" -print0) |
| 36 | +
|
| 37 | + echo "📦 Build Packages with iterative per-file checks (safe)" |
| 38 | + MAX_ROUNDS=10 |
| 39 | + round=0 |
| 40 | +
|
| 41 | + while true; do |
| 42 | + round=$((round+1)) |
| 43 | + echo "Attempt #$round: running dpkg-scanpackages..." |
| 44 | + # thử build toàn bộ |
| 45 | + if dpkg-scanpackages -m . /dev/null > Packages 2> scan.log; then |
| 46 | + echo "✅ dpkg-scanpackages succeeded" |
| 47 | + break |
| 48 | + fi |
| 49 | +
|
| 50 | + echo "⚠️ dpkg-scanpackages failed on attempt #$round. Inspecting packages to find culprits..." |
| 51 | + # nếu vượt quá giới hạn vòng lặp -> in log và fail để debug |
| 52 | + if [ "$round" -gt "$MAX_ROUNDS" ]; then |
| 53 | + echo "❌ Reached max rounds ($MAX_ROUNDS). Dumping scan.log and failing." |
| 54 | + sed -n '1,200p' scan.log || true |
| 55 | + exit 1 |
| 56 | + fi |
| 57 | +
|
| 58 | + # tìm từng .deb gây lỗi bằng cách thử dpkg-scanpackages trên từng file riêng |
| 59 | + # => sẽ catch chính xác file gây lỗi (với tên có space vẫn ok) |
| 60 | + removed_any=0 |
| 61 | + while IFS= read -r -d '' debfile; do |
| 62 | + # chạy dpkg-scanpackages trên 1 file (stdout ignore). Nếu fail => xóa file |
| 63 | + if ! dpkg-scanpackages -m "$debfile" /dev/null > /dev/null 2> tmp.log; then |
| 64 | + echo "❌ Removing broken package: $debfile" |
| 65 | + rm -f -- "$debfile" |
| 66 | + echo "$debfile" >> removed.list |
| 67 | + removed_any=1 |
| 68 | + fi |
| 69 | + done < <(find . -maxdepth 1 -type f -name "*.deb" -print0) |
| 70 | +
|
| 71 | + if [ "$removed_any" -eq 0 ]; then |
| 72 | + echo "❌ No broken package detected by per-file check, but dpkg-scanpackages still fails." |
| 73 | + echo "---- scan.log ----" |
| 74 | + sed -n '1,200p' scan.log || true |
| 75 | + echo "---- tmp.log (last per-file test) ----" |
| 76 | + sed -n '1,200p' tmp.log || true |
| 77 | + exit 1 |
| 78 | + fi |
| 79 | +
|
| 80 | + echo "Removed packages listed in removed.list:" |
| 81 | + sed -n '1,200p' removed.list || true |
| 82 | + echo "Retrying dpkg-scanpackages..." |
| 83 | + done |
| 84 | +
|
| 85 | + # nén Packages cho apt |
| 86 | + gzip -c9 Packages > Packages.gz |
| 87 | + echo "✅ Packages.gz created" |
| 88 | +
|
19 | 89 | - name: Upload GitHub Pages artifact
|
20 | 90 | uses: actions/upload-pages-artifact@v3
|
21 | 91 | with:
|
|
0 commit comments