לדלג לתוכן

פתרון מועמד לשחרור

נבחר גבול קפוא של מקור ונתונים, ונפיק חבילה בלי לגעת בהתקנה הפעילה. הסקריפט הבא מיועד ל־Linux עם כלי GNU, מתוך checkout נקי של השירות. הוא מניח שקיים packaging/amitjobs.service שהותאם למוצר, שה־binary נקרא amitjobs ושהתלויות כבר הוכנו לבנייה frozen. הערך SOURCE_DATE_EPOCH נקבע על ידי תהליך הגרסה ונשמר יחד עם commit המקור.

#!/usr/bin/env bash
set -euo pipefail
: "${SOURCE_DATE_EPOCH:?set the release source timestamp}"
case "$SOURCE_DATE_EPOCH" in
  ''|*[!0-9]*) printf '%s\n' 'invalid SOURCE_DATE_EPOCH' >&2; exit 2 ;;
esac
test -f Cargo.lock
test -f packaging/amitjobs.service
cargo test --frozen --all-targets
cargo build --frozen --release

stage=$(mktemp -d)
trap 'rm -rf -- "$stage"' EXIT
install -d "$stage/usr/libexec" "$stage/usr/lib/systemd/system" "$stage/usr/share/amitjobs"
install -m 0755 target/release/amitjobs "$stage/usr/libexec/amitjobs"
install -m 0644 packaging/amitjobs.service "$stage/usr/lib/systemd/system/amitjobs.service"
rustc -vV > "$stage/usr/share/amitjobs/rustc.txt"
cargo metadata --frozen --format-version 1 > "$stage/usr/share/amitjobs/cargo-metadata.json"
install -m 0644 Cargo.lock "$stage/usr/share/amitjobs/Cargo.lock"
(
  cd "$stage"
  find usr -type f -print0 | LC_ALL=C sort -z | xargs -0 sha256sum > SHA256SUMS
)
tar --sort=name --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 --numeric-owner \
  -C "$stage" -cf amitjobs-release.tar usr SHA256SUMS
sha256sum amitjobs-release.tar

הסקריפט מפיק staging archive לבדיקת החבילה, ולא טוען ש־tar הוא חבילת Debian או RPM מלאה. בשלב ההפצה נעטוף את אותם נתיבים במנהל החבילות שנבחר ונוסיף את metadata והפעולות המותרות שלו. חשוב גם לבדוק ש־cargo-metadata אינו מכניס נתיבי מחשב מוחלטים לתוצר שאמור להיות משוחזר או מידע שלא רוצים לפרסם. אפשר לשמור את הקובץ בראיות הבנייה במקום בתוך החבילה, או לנרמל שדות לפי מדיניות מתועדת לפני השוואת hashes.

נבצע התקנה בסביבת VM נקייה שניתנת לשחזור. המפעיל ייצור את משתמש המערכת לפי מדיניות החבילה, יתקין את הקוד ואת ה־unit, ויאתחל נתונים רק אם אינם קיימים. פעולת post-install אינה רשאית להריץ init שדורס יומן של גרסה קודמת. נריץ systemd-analyze verify, smoke test של submit/query ו־shutdown, ואז נבדוק שהשירות מוגבל לתיקיות שהוגדרו לו.

בתרחיש upgrade נתחיל מגרסה 1 עם שלוש רשומות ידועות. נעצור admission, נבצע backup מאומת ונפעיל migration לדור 2. נזריק כשל לפני פרסום manifest ואחריו. אחרי כל restart נוודא שהשירות קורא דור שלם, שהרשומות נשמרו ושאין מצב שבו binary ישן קורא schema שאינו מבין. אם downgrade אינו נתמך אחרי כתיבות חדשות, ההתקנה תדחה אותו ותציג מסלול restore מפורש.

ב־runbook נגדיר פקודות תצפית ראשונות, מיקום logs, דרך איסוף dump והרשאותיו, בדיקת capacity ושלבי שחזור. נזריק שגיאה מעשית כמו directory שאינו ניתן לכתיבה למשתמש השירות. המפעיל צריך לזהות את ה־errno ואת רכיב הבעלות, לתקן את ההרשאה המתאימה ולוודא שהשירות לא התחיל לכתוב למקום חלופי לא מתועד.

הדוח יפריד את זמן התקנת החבילה, זמן recovery וזמן עד בקשה מוצלחת. השוואת hash של שתי בניות תיעשה עם אותם קלטים מתועדים ותציג הבדלים שנשארו. בדיקה במכונה נקייה אינה רק טקס לפני release; היא מגלה תלויות שה־shell, ה־PATH או קבצי הפיתוח של המחבר הסתירו. את הראיות האלה נשמור ליד תג הגרסה, כדי שניתן יהיה לחזור אליהן בתחקיר עתידי.