4 בניית יכולות

Codespaces — סביבות פיתוח בענן

בפרק הזה תלמדו להגדיר סביבות פיתוח מלאות בענן עם GitHub Codespaces. תבנו devcontainer.json שמגדיר הכל — שפה, כלים, extensions ו-settings. תגדירו prebuilds שהסביבה תהיה מוכנה תוך שניות, תנהלו port forwarding ו-dotfiles, ותדעו לחשב עלויות ולמנוע הפתעות בחשבון.

מה יהיה לך בסוף הפרק הזה
מה תוכלו לעשות בסוף הפרק הזה
דרישות קדם
חוט הפרויקט

מאיפה באנו: בפרק 3 (Pages) פרסמתם אתר סטטי ב-GitHub Pages — עם workflow של Actions שבונה ומעלה אוטומטית. עכשיו ניקח את אותו ריפוזיטורי ונבנה עבורו סביבת פיתוח שלמה בענן. ה-devcontainer.json שתכתבו יבטיח שכל מי שפותח את הפרויקט מקבל את אותה סביבה — עם כל הכלים, ה-extensions וההגדרות. זה הצעד הטבעי: אחרי שיש לכם deploy אוטומטי (Actions + Pages), הגיע הזמן לייצר גם development environment אוטומטי.

לאן הולכים: בפרק 5 (Projects) תלמדו לנהל את הפרויקט שבניתם — boards, שדות מותאמים, אוטומציות. ה-codespace שתגדירו כאן ישמש אתכם לפיתוח שוטף בפרקים הבאים.

מילון מונחים
Codespace
סביבת פיתוח מלאה בענן — Docker container על מכונה וירטואלית באז'ור, עם VS Code מחובר. כל codespace הוא מופע עצמאי עם קוד, כלים והגדרות
devcontainer.json
קובץ הגדרות שמגדיר את הסביבה: image בסיסי, כלים, extensions, ports, פקודות התקנה. חלק מסטנדרט Dev Containers הפתוח
Dev Container
סטנדרט פתוח (containers.dev) להגדרת סביבות פיתוח בקונטיינרים — לא רק ל-Codespaces אלא גם ל-VS Code מקומי עם Docker
Feature
יחידת התקנה מודולרית — מוסיפה כלי (Node, Python, Docker) ל-dev container בשורת JSON אחת. Features נשמרים ברגיסטרי ומתוחזקים בנפרד
Prebuild
image מוכן מראש עם קוד, תלויות ו-extensions — נבנה ברקע בכל push, מקצר פתיחת codespace מ-5 דקות ל-15 שניות
Machine Type
גודל המכונה הוירטואלית — מ-2 ליבות ($0.18/שעה, 8GB RAM) עד 32 ליבות ($2.88/שעה, 128GB RAM)
Port Forwarding
מנגנון שמנגיש שרתים שרצים ב-codespace לדפדפן המקומי שלכם דרך URL מאובטח של github.dev
Dotfiles
ריפוזיטורי עם קבצי הגדרות אישיות (.zshrc, .gitconfig, .aliases) שמסתנכרן אוטומטית לכל codespace חדש שאתם פותחים
Idle Timeout
זמן חוסר פעילות עד כיבוי אוטומטי — ברירת מחדל 30 דקות, ניתן לשנות ל-5-240 דקות. כיבוי = עצירת compute, אבל לא מחיקה
Retention Period
כמה זמן codespace עצור נשמר לפני מחיקה אוטומטית — ברירת מחדל 30 יום. codespace עצור עדיין צורך storage
Core-Hours
יחידת המדידה לחיוב compute — 1 שעה על מכונת 4-core = 4 core-hours. ה-free tier נותן 120 core-hours לחודש
Spending Limit
תקרת הוצאות חודשית ל-Codespaces — ברירת מחדל $0 (רק free tier). ניתן להגדיר סכום מוגבל או unlimited

4.1 מה זה Codespaces ולמה זה משנה את המשחק

GitHub Codespaces הוא סביבת פיתוח מלאה שרצה בענן. לא עוד "VS Code בדפדפן" — אלא מכונה וירטואלית שלמה עם Docker container שמכיל את הקוד, כל הכלים, כל ה-extensions, וכל ההגדרות. אתם פותחים את הדפדפן (או VS Code Desktop) ותוך שניות יש לכם סביבה זהה לזו של כל חבר צוות.

חישבו על זה כמו Google Docs לקוד: במקום שכל אחד יתקין הכל על המחשב שלו (וישלח הודעה ב-Slack כל שבוע "אצלי זה לא עובד"), כולם עובדים על מכונה זהה שמוגדרת בקובץ אחד. המכונה נמצאת בענן של Azure, ואתם ניגשים אליה דרך VS Code — בדפדפן או באפליקציית Desktop. הקוד מסונכרן עם הריפוזיטורי, ה-extensions מותקנים אוטומטית, והתלויות כבר שם.

למה Codespaces משנה את המשחק? שלוש סיבות:

  1. סוף ל-"אצלי זה עובד". כולם עובדים על אותה סביבה בדיוק. אותה מערכת הפעלה (Linux), אותן גרסאות של Node/Python/Java, אותם כלים. מפתח אחד על macOS ואחר על Windows? לא משנה — ה-codespace רץ על Linux container. שינוי ב-devcontainer.json נכנס ל-repo, כל מי שיפתח codespace מקבל את השינוי אוטומטית. אין עוד שעות של debugging שנגרם בגלל הבדלי סביבה.
  2. אפס זמן הקמה. מפתח חדש מצטרף לצוות? הוא לוחץ על כפתור אחד ויש לו סביבה עובדת. לא עוד "תקרא את ה-README, תתקין Python 3.11, אל תשכח את pyenv, תעשה pip install, תוריד את ה-.env מ-Notion, ואם אתה על Windows תתקין גם WSL". כל זה נעלם. לחיצה אחת — סביבה מוכנה. עם prebuilds (סעיף 4.4) — תוך 15 שניות.
  3. עבודה מכל מקום. Chromebook עם 4GB RAM? iPad עם מקלדת? מחשב של בית הספר שלא נותנים להתקין עליו כלום? מחשב של לקוח שהגעתם לפגישה? כל מה שצריך זה דפדפן ואינטרנט. כל הכוח החישובי הוא בענן — מכונות עם עד 128GB RAM ו-32 ליבות. המחשב המקומי שלכם רק מציג את ה-UI.

מתי Codespaces באמת שימושי בפרקטיקה? הנה חמישה תרחישים שבהם Codespaces חוסך זמן אמיתי:

ארבע דרכים לפתוח Codespace:

  1. מריפוזיטורי: כפתור Code הירוק → לשונית CodespacesCreate codespace on main — הדרך הנפוצה ביותר. אפשר גם לבחור branch ספציפי או machine type. אם יש devcontainer.json עם מספר הגדרות — תוכלו לבחור איזו.
  2. מ-template: כנסו ל-github.com/codespaces ובחרו template מוכן (React, Next.js, Python, Jupyter, Rust, Preact ועוד). מתאים לפרויקטים חדשים — לא צריך ריפוזיטורי קיים. Template יוצר ריפוזיטורי זמני שאפשר לפרסם אחר כך.
  3. מ-PR: בכל PR יש אפשרות לפתוח codespace על הבראנץ' — מושלם ל-code review עם הרצת קוד. לוחצים על Code בדף ה-PR ובוחרים Codespace. אפשר לריץ tests, לראות את ה-UI, לבדוק performance — הכל מתוך ה-review.
  4. מ-CLI: gh codespace create -r owner/repo -b main -m basicLinux32gb — מהטרמינל, בלי לפתוח דפדפן. שימושי לסקריפטים ואוטומציות. בפרק 2 למדתם את gh — עכשיו משתמשים בו ליצירת סביבות עבודה.

מה קורה מאחורי הקלעים? כשאתם יוצרים codespace, הנה התהליך המלא:

  1. GitHub מקצה מכונה וירטואלית באז'ור (באיזור שבחרתם או הקרוב אליכם גיאוגרפית)
  2. בונה Docker container לפי ה-devcontainer.json שלכם (או image ברירת מחדל אם אין devcontainer)
  3. מריץ Features — כל תוסף שהגדרתם מותקן בסדר שנקבע לפי תלויות
  4. משכפל את הריפוזיטורי לתוך ה-container, כולל submodules אם מוגדר
  5. מריץ onCreateCommand — פעולות ראשוניות (database setup, seeding)
  6. מריץ postCreateCommand — בדרך כלל npm install או pip install
  7. טוען VS Code extensions שהגדרתם ב-customizations
  8. מחבר את VS Code (דפדפן או Desktop) ל-container ומפעיל postAttachCommand

כל זה יכול לקחת 30 שניות עד 5 דקות — תלוי בגודל הריפוזיטורי, מספר התלויות, ובעיקר: האם יש prebuilds (נגיע לזה בסעיף 4.4). עם prebuild — רק שלב 7-8 צריכים לרוץ בפתיחה, וכל השאר כבר מוכן.

ארכיטקטורת Codespaces המפתח/ת דפדפן / VS Code HTTPS Codespace Container VS Code Server קוד + תלויות כלים + Extensions devcontainer.json image features extensions postCreateCommand GitHub Repository Secrets Prebuilds Azure VM — Machine Type: 2-core / 4-core / 8-core / 16-core / 32-core Dotfiles Repo → העדפות אישיות Port Forwarding → localhost:3000 חיוב: compute + storage

Codespace = VS Code, אבל איפה?

אפשר להתחבר ל-codespace בשלוש דרכים, וחשוב להבין את ההבדלים כי זה משפיע על חוויית העבודה היומית:

מונחון קצר לפני שממשיכים: codespace שפועל נקרא active — הוא צורך compute. כשאין פעילות למשך idle timeout, הוא עובר ל-stopped — לא צורך compute, אבל עדיין צורך storage (הקוד, התלויות, הקבצים נשמרים). codespace שנמחק — נעלם לגמרי, כולל שינויים שלא נדחפו ל-remote. לכן: תמיד commit ו-push לפני מחיקה.

עשו עכשיו

פתחו את הריפוזיטורי שבניתם בפרק 3 (Pages) — או כל ריפוזיטורי אחר שלכם עם קוד. לחצו על כפתור Code הירוק, עברו ללשונית Codespaces, ולחצו על "Create codespace on main". חכו שייפתח — תוך 30 שניות עד 2 דקות יש לכם VS Code מלא בדפדפן. עשו את הבדיקות הבאות: (1) נווטו בקבצים. (2) פתחו טרמינל עם Ctrl+`. (3) הריצו whoami ו-uname -a — שימו לב שאתם על Linux, לא על המערכת המקומית שלכם. (4) הריצו cat /etc/os-release כדי לראות איזו הפצת Linux רצה. (5) בדקו nproc ו-free -h — כמה ליבות וזיכרון יש למכונה. זו הסביבה שנגדיר לאורך הפרק.

4.2 devcontainer.json — הקובץ שקובע הכל

בלי devcontainer.json, GitHub בוחר image ברירת מחדל — מכונת Linux עם כמה כלים בסיסיים (Git, Node, Python, כמה כלי CLI). זה עובד לניסוי מהיר, אבל זה לא הסביבה שלכם. חסרים ה-extensions שאתם רגילים אליהם, חסרה הגרסה הספציפית של השפה, חסרים הכלים שהפרויקט צריך, ו-ports לא מוגדרים. כל מפתח שפותח codespace מקבל סביבה "גנרית" שצריך להתאים ידנית.

קובץ devcontainer.json הוא ההגדרה המרכזית שאומרת ל-Codespaces (ול-VS Code Dev Containers מקומי) בדיוק מה לבנות. חשבו עליו כמו package.json לסביבת הפיתוח: הוא מגדיר את ה-base image (מערכת ההפעלה + שפה), את הכלים הנוספים (Features), את ה-extensions שצריך, את הגדרות ה-editor, את ה-ports שהפרויקט משתמש בהם, ואת הפקודות שרצות אחרי ההקמה. הקובץ נכנס ל-version control ביחד עם הקוד — מה שאומר שכל שינוי בסביבה עובר review כמו כל שינוי אחר בקוד.

חשוב: devcontainer.json הוא לא רק ל-Codespaces. זה סטנדרט פתוח שנקרא Dev Containers. אם אתם משתמשים ב-VS Code מקומי עם Docker, אותו קובץ בדיוק יבנה לכם container זהה על המחשב שלכם. סטנדרט אחד, שני מצבי עבודה. זה אומר שההשקעה בכתיבת devcontainer.json משתלמת גם אם לא תשתמשו ב-Codespaces — כל המפתחים בצוות יקבלו סביבה זהה.

איפה שמים את הקובץ?

המיקום הסטנדרטי הוא .devcontainer/devcontainer.json בשורש הריפוזיטורי. GitHub מחפש קודם כל שם, ואם לא מוצא — מחפש .devcontainer.json בשורש (בלי תיקייה). אם יש לכם מונוריפו עם מספר סביבות שונות, אפשר ליצור תיקיות נפרדות: .devcontainer/frontend/devcontainer.json ו-.devcontainer/backend/devcontainer.json — כשפותחים codespace, GitHub ישאל איזו הגדרה לבחור. המלצה: גם אם יש לכם הגדרה אחת בלבד, שימו אותה בתיקייה .devcontainer/ — זה מאפשר להוסיף קבצים נלווים (כמו Dockerfile) בצורה מאורגנת.

הנה devcontainer.json מלא לפרויקט Node.js — עם הסבר לכל שורה:

{
  // שם הסביבה — מופיע ב-UI כשפותחים codespace
  "name": "My Project Dev Environment",

  // Base image — מכיל מערכת הפעלה + כלים בסיסיים
  "image": "mcr.microsoft.com/devcontainers/javascript-node:1-22",

  // Features — תוספות מודולריות (סעיף 4.3)
  "features": {
    "ghcr.io/devcontainers/features/docker-in-docker:2": {},
    "ghcr.io/devcontainers/features/github-cli:1": {}
  },

  // VS Code extensions שיותקנו אוטומטית בכל codespace
  "customizations": {
    "vscode": {
      "extensions": [
        "dbaeumer.vscode-eslint",
        "esbenp.prettier-vscode",
        "ms-azuretools.vscode-docker",
        "eamodio.gitlens"
      ],
      "settings": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "esbenp.prettier-vscode",
        "terminal.integrated.defaultProfile.linux": "zsh"
      }
    }
  },

  // Ports שייפתחו אוטומטית
  "forwardPorts": [3000, 5432],
  "portsAttributes": {
    "3000": {"label": "App", "onAutoForward": "openBrowser"},
    "5432": {"label": "Database", "onAutoForward": "silent"}
  },

  // פקודה שרצה אחרי יצירת ה-container
  "postCreateCommand": "npm install",

  // פקודה שרצה בכל פעם שנכנסים ל-codespace
  "postAttachCommand": "npm run dev &",

  // משתמש ברירת מחדל — לא root (מומלץ מבחינת אבטחה)
  "remoteUser": "node"
}

בואו נפרק את החלקים החשובים בפירוט:

image — ה-base image שעליו הסביבה בנויה. Microsoft מתחזקת images רשמיים עבור כל שפה נפוצה, תחת הכתובת mcr.microsoft.com/devcontainers/. ה-images האלה מבוססים על Debian/Ubuntu ומכילים את השפה + כלים בסיסיים + Git + כמה CLI tools שימושיים:

שפהImageמה כלול
Node.jsjavascript-node:1-22Node 22 + npm + yarn + nvm
Pythonpython:1-3.12Python 3.12 + pip + venv
Javajava:1-21JDK 21 + Maven + Gradle
Gogo:1-1.22Go 1.22 + common tools
.NETdotnet:1-8.0.NET 8 SDK + runtime
Rustrust:1Rust + Cargo + rustfmt + clippy
TypeScripttypescript-node:1-22Node 22 + TypeScript + ts-node
Universaluniversal:2Node + Python + Java + Go + .NET + Rust + PHP — הכל ביחד (כבד, ~15GB)

טיפ על גרסאות: המספר אחרי הנקודתיים הוא תג הגרסה. 1-22 = גרסה 1 של ה-image עם Node 22. אפשר גם לציין :latest (תמיד הכי חדש) או :1 (major version בלבד — מקבל עדכונים שלא שוברים). ההמלצה: ציינו גרסה ספציפית של השפה (כמו 1-22) כדי שה-build יהיה reproducible.

אם ה-images המוכנים לא מספיקים, אפשר להשתמש ב-Dockerfile משלכם: "build": {"dockerfile": "Dockerfile"}. ה-Dockerfile שמים בתיקיית .devcontainer/ ליד ה-devcontainer.json. הוא יכול לרשת מ-image רשמי ולהוסיף כלים ספציפיים — למשל ספריות C שצריכים קומפילציה, או כלים ייעודיים שלא קיימים כ-Feature.

customizations.vscode — ההגדרות של VS Code בתוך ה-codespace. שני חלקים חשובים:

forwardPorts + portsAttributes — ports שהסביבה צריכה לשרתי פיתוח, בסיסי נתונים, ושירותים אחרים. forwardPorts מגדיר אילו ports לפתוח. portsAttributes מגדיר התנהגות לכל port: openBrowser (פותח דפדפן אוטומטית כשהשרת עולה), notify (מראה notification), silent (פותח בשקט), ignore (מתעלם לגמרי). נרחיב על port forwarding בסעיף 4.6.

Lifecycle commands — פקודות שרצות בשלבים שונים:

זה אחד החלקים שהכי חשוב להבין טוב, כי ההבדלים דקים אבל קריטיים — במיוחד כשעובדים עם prebuilds:

פקודהמתי רצהשימוש טיפוסינכלל ב-prebuild?
onCreateCommandפעם אחת — כשה-container נוצרהגדרת database, seeding, npm installכן
updateContentCommandאחרי clone/pull של קוד חדשnpm install (אם package.json השתנה)כן
postCreateCommandאחרי יצירה (ואחרי rebuild)migrations, setup שצריך secretsלא
postStartCommandכל פעם שה-codespace עולההפעלת שירותים ברקעלא
postAttachCommandכל פעם ש-editor מתחברnpm run dev &לא

ההבדל חשוב: onCreateCommand רץ פעם אחת — ונכלל ב-prebuild. postCreateCommand רץ אחרי שהמפתח פותח את ה-codespace — לא נכלל ב-prebuild. אם אתם רוצים dev server שעולה אוטומטית כל פעם — שימו אותו ב-postAttachCommand. אם אתם רוצים שההתקנות הכבדות יהיו חלק מה-prebuild — שימו אותן ב-onCreateCommand. זה ההבדל בין 15 שניות ל-5 דקות פתיחה.

remoteUser — באיזה משתמש לרוץ בתוך ה-container. ברירת המחדל ברוב ה-images היא משתמש שאינו root (כמו node, vscode). זה מומלץ מבחינת אבטחה — לא לעבוד כ-root בתוך ה-container. אם צריכים root לפקודה ספציפית, השתמשו ב-sudo.

טעות נפוצה: secrets ב-devcontainer.json

לעולם אל תשימו secrets ב-devcontainer.json. הקובץ נמצא בריפוזיטורי — כל מי שיש לו גישה לקוד יראה אותם. גם אם הריפוזיטורי פרטי — כל collaborator, כל fork, כל backup יכיל את ה-secrets. השתמשו ב-Codespaces Secrets (סעיף 4.7) לכל ערך רגיש: API keys, tokens, database passwords, connection strings. אם ראיתם secret ב-devcontainer.json בפרויקט שלכם — החליפו אותו מיידית והחליפו את ה-key אצל הספק.

עשו עכשיו

בריפוזיטורי שלכם (הפרויקט מפרק 3, או כל פרויקט אחר), צרו תיקייה .devcontainer וקובץ devcontainer.json בתוכה. התחילו עם הדוגמה למעלה — שנו את ה-image לשפה שלכם (ראו טבלה), את ה-extensions ל-4 שאתם משתמשים בהם יומיומית, ואת postCreateCommand לפקודת ההתקנה של הפרויקט (npm install, pip install -r requirements.txt, וכדומה). דחפו ל-main ופתחו codespace חדש כדי לבדוק. שימו לב שה-extensions שהגדרתם מותקנים וש-postCreateCommand רץ.

תרגיל 1: devcontainer.json מלא לפרויקט שלכם (20 דקות)

משימה: בנו devcontainer.json מלא לפרויקט אמיתי שלכם — לא רק העתקה מהדוגמה, אלא התאמה מלאה.

  1. בחרו את ה-base image המתאים לשפת הפרויקט מ-mcr.microsoft.com/devcontainers/. אם הפרויקט multi-language (למשל Node frontend + Python backend) — בחרו base image לשפה העיקרית ו-Feature לשפה המשנית.
  2. הוסיפו לפחות 4 extensions שאתם משתמשים בהם יומיומית. ציינו את ה-Extension ID המדויק (לא שם תצוגה).
  3. הוסיפו לפחות 3 VS Code settings שחשובים לפרויקט: formatter, tab size, lint on save.
  4. הגדירו onCreateCommand שמתקין את כל התלויות (כדי שייכלל ב-prebuild).
  5. הגדירו postAttachCommand שמפעיל dev server.
  6. הגדירו לפחות port אחד עם forwardPorts ו-portsAttributes מתאימים.
  7. דחפו ל-main, פתחו codespace חדש, ובדקו: (א) ה-extensions מותקנים (ב) הכלים זמינים (ג) ה-dev server רץ (ד) ה-port forwarding עובד.

תוצאה מצופה: codespace שנפתח עם כל הכלים מותקנים, extensions טעונים, dev server שרץ אוטומטית, ודפדפן שנפתח על האפליקציה.

4.3 Features — תוספות מוכנות בקליק

במקום לכתוב 20 שורות ב-Dockerfile כדי להתקין Python, Docker-in-Docker או kubectl — אתם מוסיפים שורת JSON אחת. Dev Container Features הן יחידות התקנה מודולריות שמריצות סקריפט התקנה מוכן ומוגדרות דרך features ב-devcontainer.json.

למה Features ולא Dockerfile? שלוש סיבות: (1) פשטות — שורת JSON אחת במקום סקריפט התקנה שצריך לדבג. (2) קומפוזביליות — אפשר לשלב כמה features ביחד בלי קונפליקטים, כי הם תוכננו לעבוד יחד. (3) תחזוקה — הצוות שמתחזק את ה-feature מעדכן אותו לגרסאות חדשות, אתם מקבלים אותן אוטומטית. לא צריך לעדכן סקריפטי התקנה כל פעם שיוצאת גרסה חדשה של Node או Python.

הרגיסטרי הראשי: ghcr.io/devcontainers/features/ — מתוחזק על ידי Microsoft עם מאות features. מעבר לזה, יש רגיסטרי קהילתי ב-github.com/devcontainers-extra/features, וכל אחד יכול לפרסם features משלו. כל feature חי בריפוזיטורי GitHub, עם תיעוד, issues, ו-changelog.

Features נפוצים:

Featureמה מתקיןJSON
nodeNode.js + npm"ghcr.io/devcontainers/features/node:1": {"version": "22"}
pythonPython + pip"ghcr.io/devcontainers/features/python:1": {"version": "3.12"}
docker-in-dockerDocker daemon בתוך container"ghcr.io/devcontainers/features/docker-in-docker:2": {}
kubectl-helm-minikubeKubernetes CLI tools"ghcr.io/devcontainers/features/kubectl-helm-minikube:1": {}
aws-cliAWS CLI v2"ghcr.io/devcontainers/features/aws-cli:1": {}
azure-cliAzure CLI"ghcr.io/devcontainers/features/azure-cli:1": {}
github-cligh CLI (מפרק 2)"ghcr.io/devcontainers/features/github-cli:1": {}
common-utilszsh, Oh My Zsh, כלי Linux בסיסיים"ghcr.io/devcontainers/features/common-utils:2": {}
terraformTerraform CLI"ghcr.io/devcontainers/features/terraform:1": {}
javaJDK + Maven/Gradle"ghcr.io/devcontainers/features/java:1": {"version": "21"}

איך Features עובדים מאחורי הקלעים: כל feature הוא תיקייה עם שני קבצים עיקריים: devcontainer-feature.json (מטאדטה, אופציות, תלויות) ו-install.sh (סקריפט ההתקנה). כשה-container נבנה, Codespaces מריץ את סקריפטי ההתקנה של כל ה-features לפי סדר מוגדר. אפשר להעביר אופציות — לדוגמה "version": "22" ל-Node או "installMaven": "true" ל-Java. כל אופציה מתועדת ב-feature.json ומופיעה גם ב-IntelliSense של VS Code כשעורכים את devcontainer.json.

דוגמה קונקרטית: פרויקט Full-stack שצריך Node לפרונט, Python ל-API, ו-Docker ל-database:

"features": {
  "ghcr.io/devcontainers/features/node:1": {
    "version": "22"
  },
  "ghcr.io/devcontainers/features/python:1": {
    "version": "3.12",
    "installTools": true
  },
  "ghcr.io/devcontainers/features/docker-in-docker:2": {
    "dockerDashComposeVersion": "v2"
  },
  "ghcr.io/devcontainers/features/github-cli:1": {}
}

שימו לב: ה-base image יכול להיות mcr.microsoft.com/devcontainers/base:ubuntu (מכונת Linux בסיסית), וה-features מוסיפים את כל הכלים. זה מאפשר שילובים מותאמים שלא קיימים כ-images מוכנים. זה גם מאפשר לכם לשלוט בגרסה המדויקת של כל כלי בנפרד.

Features מתקדמים שכדאי להכיר:

טיפ: אם אתם צריכים feature שלא קיים ברגיסטרי — בדקו ב-github.com/devcontainers/features ואם לא מוצאים, אפשר ליצור feature משלכם ולפרסם אותו. כל feature הוא בעצם תיקייה עם סקריפט Bash — זה לא מסובך. המבנה: devcontainer-feature.json (מטאדטה) + install.sh (התקנה). אפשר לפרסם ברגיסטרי GHCR כדי שאחרים ישתמשו.

עשו עכשיו

פתחו את ה-devcontainer.json שיצרתם בסעיף הקודם והוסיפו 2 features שרלוונטיים לפרויקט שלכם. לדוגמה: github-cli (כי כולם צריכים gh — למדתם בפרק 2) ו-docker-in-docker (אם אתם עובדים עם containers). רבילדו את ה-codespace: Command Palette (Ctrl+Shift+P) → Codespaces: Rebuild Container. בדקו שה-features מותקנים: gh --version ו-docker --version.

4.4 Prebuilds — הכנה מראש להפעלה מיידית

בלי prebuilds, כל פתיחת codespace עוברת את כל התהליך: clone → build image → install features → install dependencies → configure extensions. על ריפוזיטורי של חברה עם 500 dependencies ב-package.json ו-Dockerfile מורכב, זה יכול לקחת 3 עד 5 דקות. זה לא נשמע הרבה, אבל תחשבו: כל PR review, כל פעם שצריכים codespace חדש, כל סדנה עם 20 משתתפים — 5 דקות של חיכוי כפול 20 אנשים = 100 דקות מבוזבזות. עם prebuilds — 15 שניות לכל אחד.

מה prebuild עושה: GitHub מריץ את כל שלבי ההקמה מראש — ברקע, בכל push ל-branch שהגדרתם. התוצאה היא image מוכן שכולל את הקוד, התלויות, ה-extensions, וכל מה ש-onCreateCommand ו-updateContentCommand עושים. כשמפתח פותח codespace, הוא מקבל את ה-image המוכן מיידית — בלי להמתין לשום התקנה. רק postCreateCommand, postStartCommand ו-postAttachCommand רצים בפתיחה — ואלה בדרך כלל מהירים.

בלי Prebuild vs עם Prebuild בלי Prebuild: Clone repo 30 שנ' Build image + Features 60-120 שנ' Install dependencies 60-120 שנ' Load extensions 30-60 שנ' מוכן 3-5 דקות עם Prebuild: הוכן מראש ברקע טען image מוכן! 15 שניות פי 10-20 יותר מהר

איך מגדירים prebuild — שלב אחר שלב:

  1. נכנסים ל-Settings של הריפוזיטורי (צריך admin access)
  2. בתפריט הצד: Codespaces
  3. תחת Prebuilds לוחצים "Set up prebuild"
  4. בוחרים branch (בדרך כלל main) ו-configuration file (אם יש יותר מאחד)
  5. בוחרים מתי לרענן: Every push (מומלץ לרוב), On configuration change (רק כש-devcontainer.json משתנה), או Schedule (בזמנים קבועים)
  6. בוחרים region/s (בחרו את האיזור הקרוב לרוב המפתחים שלכם — US East, Europe West, וכדומה)
  7. לוחצים Create ומחכים ש-prebuild ראשון ירוץ

מה קורה מאחורי הקלעים: כל push ל-branch שהגדרתם מפעיל GitHub Actions workflow (בלי שאתם צריכים לכתוב אותו — GitHub יוצר אותו אוטומטית). ה-workflow מקצה מכונה, בונה container, מריץ את onCreateCommand ו-updateContentCommand, ושומר את ה-image כ-prebuild artifact. כשמפתח פותח codespace — הוא מקבל את ה-image המוכן, בלי לחכות לשום build. אם הייתם בפרק 1 (Actions), זה אותו עיקרון — workflow שרץ ברקע.

מה נכלל ב-prebuild ומה לא:

נכלל ב-prebuild (רץ ברקע)לא נכלל (רץ בפתיחה)
Build של Docker imagepostCreateCommand
התקנת FeaturespostStartCommand
onCreateCommandpostAttachCommand
updateContentCommandטעינת Extensions (חלקית)
Clone של הקודDotfiles sync

טיפ קריטי: שימו את ההתקנות הכבדות (npm install, pip install) ב-onCreateCommand — לא ב-postCreateCommand. זה ההבדל בין prebuild שחוסך 4 דקות לבין prebuild שחוסך 30 שניות בלבד. חישבו: מה צריך secrets? רק זה הולך ל-postCreateCommand. כל השאר — ל-onCreateCommand.

טעות נפוצה: prebuilds על כל branch

Prebuilds משתמשים ב-Actions minutes (לבנייה) ו-storage (לשמירת ה-image). על ריפוזיטורי עם הרבה pushes זה יכול להצטבר — כל push מפעיל build חדש של כמה דקות. פתרון: הגדירו prebuild רק ל-main (לא לכל branch), ובחרו "On configuration change" במקום "Every push" אם ה-devcontainer.json משתנה לעתים רחוקות. אפשר גם להגדיר prebuild רק ל-region אחד במקום לכל ה-regions.

עשו עכשיו

נכנסו ל-Settings → Codespaces → Prebuilds בריפוזיטורי שלכם. הגדירו prebuild ל-main branch עם trigger של "Every push". חכו שה-Actions workflow יסיים (1-5 דקות — עקבו בטאב Actions). אחרי זה, מחקו את ה-codespace הנוכחי (github.com/codespaces → שלוש נקודות → Delete) ופתחו חדש — שימו לב להבדל במהירות הפתיחה.

תרגיל 2: Prebuild שעובד — עם מדידת ביצועים (25 דקות)

משימה: הגדירו prebuild ומדדו את ההבדל בצורה כמותית.

  1. פתחו codespace חדש בלי prebuild ומדדו כמה זמן לוקח עד שהטרמינל מוכן. רשמו את הזמן.
  2. העבירו את npm install (או פקודת ההתקנה שלכם) מ-postCreateCommand ל-onCreateCommand.
  3. הגדירו prebuild לפי ההוראות למעלה.
  4. חכו שה-prebuild יסיים (בדקו ב-Actions tab — תראו workflow בשם "Create Codespaces Prebuilds").
  5. מחקו את ה-codespace הקיים ופתחו חדש.
  6. מדדו את זמן הפתיחה עם prebuild.
  7. רשמו את ההבדל — מצפים לפי 10 לפחות.

תוצאה מצופה: ירידה מ-3-5 דקות ל-15-30 שניות. אם ההבדל קטן, בדקו שההתקנות הכבדות אכן ב-onCreateCommand.

4.5 Machine Types — בחירת המכונה הנכונה

כשאתם פותחים codespace, אתם בוחרים את גודל המכונה. הבחירה משפיעה על ביצועים ועל עלות — ההבדל בין 2-core ל-32-core הוא פי 16 במחיר. רוב המפתחים בוחרים מכונה גדולה מדי "ליתר ביטחון" ומשלמים כפול על ביצועים שהם לא צריכים. הסעיף הזה יעזור לכם לבחור נכון.

Machine TypeRAMStorageעלות לשעה120 core-hours =
2-core8 GB32 GB$0.1860 שעות
4-core16 GB32 GB$0.3630 שעות
8-core32 GB64 GB$0.7215 שעות
16-core64 GB128 GB$1.447.5 שעות
32-core128 GB128 GB$2.883.75 שעות

הערה חשובה על GPU: עד אוגוסט 2025 הייתה אפשרות ל-GPU machine type (ניסיוני, לא זמין באופן כללי). האפשרות בוטלה עקב הפסקת סדרת Azure NCv3 VMs. נכון ל-2026, אין GPU option ב-Codespaces. אם אתם צריכים GPU לעבודה עם ML/AI, הגישה המומלצת היא: כתבו קוד ב-Codespaces (שלא צריך GPU), הריצו training ב-Google Colab, Azure ML, או AWS SageMaker. או פשוט השתמשו במחשב מקומי עם GPU.

איך ה-machine type משפיע על העבודה בפועל? כמה דוגמאות מהשטח:

איך לשנות machine type של codespace קיים? לא חייבים למחוק ולפתוח מחדש. יש שתי דרכים:

איך לקבוע machine type ברירת מחדל לריפוזיטורי: אפשר להגדיר ב-devcontainer.json את ה-machine type המינימלי: "hostRequirements": {"cpus": 4, "memory": "16gb"}. ככה כשמפתח פותח codespace, GitHub לא ייתן לו לבחור מכונה קטנה מדי. זה שימושי לפרויקטים שבאמת דורשים משאבים מינימליים — למשל Docker Compose עם 4 services.

מסגרת החלטה: איזה Machine Type לבחור
סוג עבודהMachine Type מומלץלמה
עריכת קוד, code review, תיקוני באגים קטנים2-coreמספיק ל-VS Code + terminal, הכי זול
פיתוח web (React, Next.js, Express)4-coredev server + browser preview + lint/format
Docker Compose, microservices, בדיקות מקביליות8-coreמספיק RAM ל-containers מרובים
מונוריפו גדול, Android build, Webpack כבד16-corebuild מהיר של פרויקטים כבדים
CI/CD מקומי, data processing כבד32-coreמקסימום ביצועים — שימו לב למחיר!

כלל אצבע: תמיד התחילו עם 2-core. אם מרגישים איטיות — שדרגו. אפשר לשנות machine type של codespace קיים דרך gh codespace edit --machine או מה-UI. לא צריך למחוק ולפתוח מחדש.

לוגיקת if/then:

  • אם יש לכם dev server אחד בלבד → אז 2-core מספיק
  • אם אתם מריצים Docker Compose עם 3+ services → אז 8-core מינימום
  • אם build times מעל 2 דקות → אז שדרגו machine type אחד למעלה
  • אם free -h מראה שימוש של 80%+ בזיכרון → אז עלו למכונה הבאה
עשו עכשיו

בדקו על איזה machine type ה-codespace שלכם רץ: פתחו טרמינל והריצו nproc (מספר ליבות) ו-free -h (זיכרון). הריצו גם df -h / כדי לבדוק כמה storage יש ומה תפוס. האם ה-machine type מתאים לעבודה שלכם, או שאתם משלמים על יותר ממה שצריך? אם יש לכם 4-core וכל מה שאתם עושים זה עריכת קוד — שקלו לרדת ל-2-core.

4.6 Port Forwarding — גישה לשרתים מהדפדפן

כשאתם מריצים npm run dev ב-codespace והשרת עולה על port 3000 — אתם לא יכולים לפתוח localhost:3000 בדפדפן המקומי שלכם. למה? כי הקוד לא רץ על המחשב שלכם — הוא רץ על מכונה וירטואלית באז'ור. כאן נכנס port forwarding: Codespaces יוצר URL מיוחד (משהו כמו https://username-repo-abc123-3000.app.github.dev) שמנתב ל-port 3000 ב-container. אתם פותחים את ה-URL בדפדפן ורואים את האפליקציה כאילו היא רצה מקומית.

זה עובד גם ל-preview של אתרים, גם ל-API testing (Postman / Insomnia / Thunder Client נגד ה-URL של Codespaces), וגם לשיתוף מהיר: שולחים ל-PM את ה-URL והוא רואה את ה-feature בזמן אמת. זה כלי שיווקי מדהים — במקום "תמתין שנעלה ל-staging", אפשר להראות feature תוך שניות.

שלושה אופנים של port forwarding:

  1. אוטומטי: Codespaces מזהה כש-process מקשיב על port ומציע forwarding. מופיע כ-toast notification ב-VS Code עם כפתור "Open in Browser". רוב השרתים מזוהים אוטומטית — React dev server, Express, Django, Flask.
  2. ידני: בפאנל Ports (בתחתית VS Code, ליד Terminal) לוחצים "Forward a Port" ומקלידים מספר. שימושי כשיש port שלא מזוהה אוטומטית.
  3. הגדרה קבועה: ב-devcontainer.json עם forwardPorts — הכי מומלץ כי כולם מקבלים את אותם ports, עם label ו-behavior מוגדרים.

Visibility — מי יכול לגשת ל-URL:

הגדרה ב-devcontainer.json:

"forwardPorts": [3000, 8080, 5432],
"portsAttributes": {
  "3000": {
    "label": "Frontend",
    "onAutoForward": "openBrowser",
    "protocol": "https"
  },
  "8080": {
    "label": "API",
    "onAutoForward": "notify"
  },
  "5432": {
    "label": "PostgreSQL",
    "onAutoForward": "silent"
  }
}

onAutoForward שולט במה שקורה כשה-port נפתח: openBrowser פותח דפדפן אוטומטית (מומלץ ל-dev server ראשי), notify מראה notification עם לינק ללחוץ (מומלץ ל-APIs), silent פותח בשקט בלי להודיע, ignore מתעלם לגמרי (לשירותי רקע כמו database — כי אתם לא פותחים PostgreSQL בדפדפן).

טיפ מעשי: אם יש לכם Frontend + API + Database, הגדירו את ה-Frontend כ-openBrowser, את ה-API כ-notify, ואת ה-Database כ-ignore. ככה בכל פעם שתעלו את ה-codespace, הדפדפן ייפתח אוטומטית על הפרונט, תקבלו notification עם לינק ל-API, וה-database יעבוד ברקע בשקט.

Port forwarding מ-CLI: אפשר גם לשלוט ב-ports מהטרמינל המקומי (לא מתוך ה-codespace): gh codespace ports forward 3000:3000 — מנגיש את port 3000 ב-codespace ל-localhost:3000 על המחשב המקומי שלכם. שימושי כשעובדים עם VS Code Desktop ורוצים לגשת ל-port כאילו הוא מקומי.

בעיות נפוצות ופתרונות:

עשו עכשיו

ב-codespace שלכם, הריצו שרת פיתוח. אם אין לכם שרת — הריצו python3 -m http.server 8000 או npx serve .. שימו לב ל-notification שמופיע. לחצו עליו ובדקו שאתם רואים את התוכן בדפדפן. עכשיו לכו לפאנל Ports, לחצו קליק ימני על ה-port, ושנו את ה-visibility ל-public. שלחו את ה-URL לעמית (או פתחו בחלון incognito) ובדקו שהוא נגיש. אחר כך — שנו חזרה ל-private.

4.7 Dotfiles ו-Secrets — העדפות אישיות וערכים רגישים

כל פעם שאתם פותחים codespace חדש — הטרמינל נראה "גנרי". אין את ה-aliases שלכם (איפה gs ל-git status?), אין את ה-zsh theme שאתם רגילים אליו, אין את ה-Git config עם השם והמייל, אין את ה-vim settings. כל codespace חדש = הגדרה מחדש. אלא אם כן הגדרתם Dotfiles.

Dotfiles ("קבצי נקודה") הם קבצי הגדרות שמתחילים בנקודה — .zshrc, .bashrc, .gitconfig, .vimrc, .aliases. הרעיון: אתם יוצרים ריפוזיטורי אחד עם כל ההגדרות האישיות שלכם, ו-Codespaces משכפל אותו אוטומטית לכל codespace חדש שאתם פותחים. הריפוזיטורי הזה שייך לכם — לא לפרויקט. ככה devcontainer.json מגדיר את סביבת הפרויקט (כלים, extensions, ports), ו-dotfiles מגדירים את ההעדפות האישיות שלכם (aliases, shell theme, editor config). ההפרדה הזאת חשובה: הפרויקט לא צריך לדעת שאתם מעדיפים Oh My Zsh עם theme ספציפי.

הגדרת dotfiles — שלב אחר שלב:

  1. צרו ריפוזיטורי בשם dotfiles (או כל שם אחר — my-dotfiles, .config) בחשבון שלכם. מומלץ שהריפוזיטורי יהיה public — אין בו secrets, וככה אתם גם עוזרים לאחרים לקבל רעיונות.
  2. הוסיפו קבצי הגדרות: .zshrc, .gitconfig, .aliases, .vimrc — מה שחשוב לכם. התחילו קטן — 3-4 קבצים מספיקים.
  3. הוסיפו סקריפט התקנה: install.sh (או setup.sh / bootstrap.sh) — Codespaces יריץ אותו אוטומטית. הסקריפט צריך ליצור symlinks מהקבצים בריפוזיטורי לנתיב הנכון ב-home directory.
  4. כנסו ל-GitHub Settings → Codespaces → סמנו "Automatically install dotfiles" ובחרו את הריפוזיטורי.
  5. פתחו codespace חדש ובדקו שה-aliases עובדים, ה-shell נראה כמו שאתם רוצים, וה-git config תקין.

דוגמה ל-install.sh מינימלי:

#!/bin/bash
# Symlink dotfiles to home directory
DOTFILES_DIR="$(cd "$(dirname "$0")" && pwd)"

ln -sf "$DOTFILES_DIR/.zshrc" ~/.zshrc
ln -sf "$DOTFILES_DIR/.gitconfig" ~/.gitconfig
ln -sf "$DOTFILES_DIR/.aliases" ~/.aliases

# Source aliases in current shell
if [ -f ~/.aliases ]; then
  echo "source ~/.aliases" >> ~/.zshrc
fi

# Set default shell to zsh (if not already)
if [ "$SHELL" != "/bin/zsh" ]; then
  sudo chsh -s /bin/zsh $(whoami) 2>/dev/null || true
fi

echo "Dotfiles installed successfully!"

דוגמה ל-.aliases שימושי:

# Git shortcuts
alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline -20'
alias gd='git diff'

# Navigation
alias ..='cd ..'
alias ...='cd ../..'
alias ll='ls -la'

# GitHub CLI
alias ghpr='gh pr create'
alias ghprl='gh pr list'
alias ghcs='gh codespace list'

Secrets — ערכים רגישים:

API keys, tokens, סיסמאות, connection strings — כל אלה צריכים להיות נגישים ב-codespace אבל לא בקוד. כזכור, ב-Warning בסעיף 4.2 הזהרנו שלא לשים secrets ב-devcontainer.json. אז איך מעבירים ערכים רגישים? Codespaces Secrets הם משתני סביבה מוצפנים שנשמרים בהגדרות GitHub שלכם (לא בריפוזיטורי!) וזמינים בכל codespace.

הגדרת secret — שלב אחר שלב:

  1. כנסו ל-GitHub Settings (לחיצה על אווטר → Settings)
  2. בתפריט הצד: Codespaces
  3. תחת "Codespaces secrets" לחצו "New secret"
  4. הקלידו שם (DATABASE_URL) וערך (postgresql://user:pass@host:5432/db)
  5. בחרו לאילו ריפוזיטורים ה-secret נגיש — אפשר "All repositories" או רשימה ספציפית. המלצה: בחרו רשימה ספציפית — כל secret צריך להיות נגיש רק לריפוזיטורים שבאמת צריכים אותו.
  6. ב-codespace, ה-secret זמין כ-$DATABASE_URL בטרמינל ובקוד. בדקו עם echo $DATABASE_URL.

שלושה סוגי secrets:

טיפ מתקדם: אפשר להגדיר ב-devcontainer.json ש-secrets ספציפיים נדרשים באמצעות "secrets" property. אם מפתח יפתח codespace בלי להגדיר אותם, Codespaces יציג התראה עם הוראות. ככה אתם מבטיחים שכל מי שפותח codespace לפרויקט ידע שהוא צריך להגדיר AWS_ACCESS_KEY וכדומה.

טעות נפוצה: ערבוב secrets אישיים וארגוניים

אם יש לכם API key אישי (למשל ל-personal OpenAI account) — הגדירו אותו כ-User secret ותגבילו אותו לריפוזיטורים ספציפיים. לעולם אל תשימו secret אישי כ-Organization secret — כל חברי הארגון יוכלו לראות את הערך (ולהשתמש בו). ובכיוון ההפוך — אם יש לכם secret ארגוני (staging database URL), אל תשכפלו אותו כ-User secret — זה יצור בעיה כשהערך ישתנה.

עשו עכשיו

צרו ריפוזיטורי dotfiles בחשבון שלכם (או שכפלו מ-template). הוסיפו לפחות .aliases עם 5 aliases שימושיים (ראו דוגמה למעלה) ו-install.sh שיוצר symlinks. הפעילו את Dotfiles ב-Settings → Codespaces → "Automatically install dotfiles". פתחו codespace חדש — בדקו שה-aliases עובדים (הריצו gs לבדיקה). אם עובד — מעולה. אם לא — בדקו שה-install.sh executable (chmod +x install.sh) וש-symlinks נוצרו נכון.

תרגיל 3: Dotfiles + Secrets מלאים (20 דקות)

משימה: הגדירו סביבה אישית מלאה שמסתנכרנת לכל codespace.

  1. צרו (או עדכנו) ריפוזיטורי dotfiles עם לפחות 3 קבצי הגדרות: .aliases, .gitconfig, ועוד אחד לבחירתכם.
  2. צרו install.sh שמגדיר symlinks ומריץ הגדרות. ודאו שהוא executable.
  3. הפעילו dotfiles ב-Settings → Codespaces.
  4. צרו לפחות secret אחד (למשל MY_API_KEY עם ערך לדוגמה) ותגבילו אותו לריפוזיטורי ספציפי.
  5. פתחו codespace חדש ובדקו: (א) ה-aliases עובדים (ב) echo $MY_API_KEY מחזיר את הערך (ג) git config user.name מחזיר את השם שלכם.

תוצאה מצופה: כל codespace חדש שתפתחו מרגיש כמו הבית — עם ההגדרות שלכם ועם secrets נגישים. אפס הגדרה ידנית.

4.8 עלויות וכיבוי אוטומטי — כל שקל חשוב

Codespaces הוא לא חינמי ללא הגבלה. יש free tier נדיב שמספיק לרוב המשתמשים הקזואליים, אבל מי שלא שם לב יכול להיתקע בהפתעות — במיוחד אם משאיר codespace דלוק על מכונה גדולה או שוכח codespaces ישנים שתופסים storage. בואו נבין בדיוק מה חינמי, מה עולה, איך לחשב, ואיך למנוע בזבוז.

שני סוגי עלות:

  1. Compute (חישוב) — לפי שעת ריצה x מספר ליבות. נמדד ב-core-hours. זה העלות העיקרית — כל רגע שה-codespace פעיל (גם idle!) צורך core-hours. הקלדתם שורה ולכתם לארוחת צהריים? ה-codespace עדיין רץ ועדיין צורך. עד שה-idle timeout נכנס לפעולה.
  2. Storage (אחסון) — לפי GB שה-codespace תופס על הדיסק. נמדד ב-GB-months ($0.07 ל-GB בחודש). זה כולל קוד, תלויות (node_modules יכול להיות 1-2GB לבדו!), Docker images, וכל מה שנמצא ב-container — גם כשהוא כבוי. כלומר: codespace עצור לא צורך compute, אבל כן צורך storage.

Free tier — מה מקבלים בחינם:

תוכניתCore-Hours בחודשStorageשווה ערך (2-core)שווה ערך (4-core)
GitHub Free12015 GB60 שעות30 שעות
GitHub Pro ($4/חודש)18020 GB90 שעות45 שעות

מה זה core-hours? שעה אחת על מכונת 4-core = 4 core-hours. אם יש לכם 120 core-hours ואתם עובדים על 4-core, יש לכם 30 שעות עבודה בחודש. על 2-core — 60 שעות. על 8-core — רק 15 שעות. הנוסחה פשוטה: שעות = core-hours / מספר ליבות. לכן בחירת machine type קטן יותר לא רק חוסכת כסף — היא גם נותנת לכם יותר שעות עבודה מה-free tier.

תרחישי עלות חודשית — מספרים אמיתיים:

תרחישMachineשעות/חודשCore-Hoursעלות (מעל free tier)
חובבן / סטודנט2-core4080$0 (בתוך 120)
סטודנט חרוץ2-core60120$0 (בדיוק ה-free tier)
מפתח פרילנסר4-core80320200 x $0.09 = $18
מפתח full-time4-core160640520 x $0.09 = $46.80
מכונה מנופחת32-core1605,1205,000 x $0.09 = $450

* $0.09 = עלות per-core-hour ($0.18/hr / 2 cores)

שימו לב לתרחיש האחרון: מפתח שעובד full-time על 32-core (בלי סיבה מוצדקת) משלם $450 בחודש. אותו מפתח על 4-core משלם $47. ההבדל: $400+ בחודש, $4,800 בשנה. לכן בחירת machine type נכונה היא לא רק עניין טכני — זה עניין כספי.

כיבוי אוטומטי — idle timeout:

Retention period — כמה זמן codespace עצור נשמר:

Spending limit — הגדרת תקרה:

ברירת מחדל: $0. זה אומר שכשה-free tier נגמר, אי אפשר ליצור codespaces חדשים ו-codespaces פעילים ייעצרו. אם אתם רוצים להמשיך — הגדירו spending limit ב-Settings → Billing → Codespaces. אפשר סכום מוגבל ($10, $50) או unlimited. לעולם אל תגדירו unlimited אלא אם אתם ארגון עם תקציב מוגדר וניטור — זה מתכון להפתעות.

עשו עכשיו

כנסו ל-Settings → Codespaces ושנו שלושה דברים: (1) הורידו idle timeout ל-15 דקות. (2) הורידו retention period ל-7 ימים. (3) בדקו שה-spending limit הוא $0 (אלא אם אתם מודעים לצורך בתשלום). עכשיו כנסו ל-Settings → Billing → Usage → Codespaces ובדקו: כמה core-hours צרכתם החודש? כמה storage תופסים? השלושה האלה ביחד יכולים לחסוך לכם עשרות דולרים בחודש.

מסגרת: חישוב עלות Codespaces

כדי לחשב את העלות החודשית שלכם:

  1. חשבו core-hours: שעות עבודה ביום x ימים בחודש x מספר ליבות
  2. חסרו free tier: 120 core-hours (Free) או 180 (Pro)
  3. חשבו compute: core-hours מעל free tier x $0.09
  4. חשבו storage: GB ממוצע x $0.07 (אל תשכחו codespaces עצורים!)
  5. סכום: compute + storage = עלות חודשית

דוגמה: מפתח שעובד 5 שעות ביום, 20 יום בחודש, על 4-core:
5 x 20 x 4 = 400 core-hours. פחות 120 free = 280. עלות: 280 x $0.09 = $25.20 + ~$2 storage = ~$27/חודש.

דוגמה 2: סטודנט שעובד 2 שעות ביום, 15 יום בחודש, על 2-core:
2 x 15 x 2 = 60 core-hours. בתוך ה-free tier (120). עלות: $0.

לוגיקת if/then:

  • אם הצריכה שלכם מתחת ל-120 core-hours → אז תישארו ב-Free tier, אין צורך בשינוי
  • אם הצריכה בין 120 ל-180 core-hours → אז שקלו שדרוג ל-Pro ($4/חודש, 180 core-hours)
  • אם הצריכה מעל 180 core-hours → אז הגדירו spending limit ברמה שנוחה לכם
  • אם אתם מוצאים הפתעות בחשבון → אז בדקו codespaces עצורים ו-machine types מנופחים

8 טיפים לחיסכון בעלויות:

  1. הורידו idle timeout ל-15 דקות או פחות. ברירת מחדל של 30 דקות זו חצי שעה שאתם משלמים על כלום כל פעם שאתם הולכים לקפה. 15 דקות מספיק לשיחת טלפון קצרה בלי שה-codespace ייכבה.
  2. הורידו retention period ל-7 ימים. codespace עצור עדיין תופס storage (ומשלמים!). עם prebuilds, פתיחת codespace חדש היא כמעט מיידית — אין צורך לשמור ישנים.
  3. התחילו עם 2-core. לרוב העבודות (עריכת קוד, code review, dev server בודד) 2-core מספיק בהחלט. שדרגו רק אם מרגישים איטיות ממשית — לא "ליתר ביטחון".
  4. עצרו ידנית בסוף היום. אל תסגרו את הטאב בדפדפן — זה לא עוצר את ה-codespace! סגירת טאב = ה-codespace ממשיך לרוץ ולצרוך core-hours עד ל-idle timeout. השתמשו ב-Codespaces: Stop Current Codespace מה-Command Palette, או gh codespace stop מהטרמינל.
  5. מחקו codespaces שלא בשימוש. נכנסו ל-github.com/codespaces ומחקו את מה שלא צריך. כל codespace ברשימה תופס storage — גם אם הוא עצור.
  6. שקלו Pro ($4/חודש). אם אתם מתקרבים ל-120 core-hours, שדרוג ל-Pro נותן 180 core-hours + 20GB storage — ההבדל של 60 core-hours שווה $5.40 (60 x $0.09), כלומר Pro חוסך לכם $1.40 בחודש כבר מהרגע הראשון שעוברים את ה-free tier.
  7. הגדירו spending limit. גם אם החלטתם לשלם מעבר ל-free tier, הגדירו תקרה ($20, $50) כדי שלא תהיינה הפתעות בסוף החודש.
  8. נטרו ב-Billing. בדקו את דף ה-Billing פעם בשבוע. אם אתם צורכים יותר ממה שציפיתם — חפשו codespaces שנשכחו פתוחים או machine types מנופחים.
טעות נפוצה: סגירת טאב במקום עצירת codespace

זו הטעות הנפוצה ביותר. סגירת הטאב בדפדפן לא עוצרת את ה-codespace — הוא ממשיך לרוץ בענן ולצרוך core-hours עד ל-idle timeout. אם שכחתם codespace פתוח על מכונת 32-core ל-24 שעות, זה 768 core-hours = $69 ביום אחד. תמיד עצרו ידנית: Ctrl+Shift+PCodespaces: Stop Current Codespace. או מהטרמינל: gh codespace stop.

4.9 Codespaces vs Local — מתי שווה ענן ומתי מקומי

אחרי כל מה שלמדנו, שאלה טבעית: האם כדאי לעבור ל-Codespaces לצמיתות? התשובה הקצרה: זה תלוי. Codespaces הוא כלי מצוין למקרים מסוימים, אבל הוא לא מחליף פיתוח מקומי בכל מצב. הגישה הנכונה לרוב המפתחים היא hybrid — פיתוח מקומי יומיומי, Codespaces למקרים ספציפיים שבהם הוא מנצח.

הנה המקרים שבהם כל גישה מנצחת:

Codespaces vs Local — עץ החלטה צריכים סביבה אחידה לצוות? כן Codespaces מנצח לא יש אינטרנט יציב? לא Local חובה כן workload כבד (GPU, ML, monorepo)? כן Local עדיף לא מוכנים לשלם על נוחות? כן Codespaces לא Hybrid / Free tier בלבד
מסגרת החלטה: Codespaces vs Local Development
קריטריוןCodespacesLocal
Onboarding חבר צוות חדשכפתור אחד — מוכן תוך דקהשעות של הגדרה ו-README
Code review עם הרצת קודפתיחה מ-PR — מושלםצריך checkout ידני + build
מחשב חלש / Chromebookהכוח בענן — עובד מעולהלא אפשרי
עבודה בלי אינטרנטבלתי אפשריעובד מושלם
GPU / ML workloadsלא זמין (בוטל 2025)אם יש GPU מקומי — עדיף
מונוריפו ענק (>5GB)I/O איטי, storage יקרSSD מקומי מהיר יותר
עקביות סביבה בצוות100% — כולם על אותו imageקשה לאכוף (גם עם devcontainer מקומי)
עלות (מפתח יחיד)~$27/חודש (4-core, 5h/day)$0 (מעבר לחומרה שכבר יש)
סדנאות / workshopsכולם מתחילים עם סביבה זהה"מי צריך עזרה בהתקנה?"
Open source contributionsפותח codespace מ-fork — מיידיclone + setup יכול לקחת שעה
Latencyתלוי בחיבור אינטרנט שלכםאפס latency — הכל מקומי
פרטיותקוד בענן של Microsoft/Azureקוד על המחשב שלכם בלבד

גישת Hybrid מומלצת: פיתוח יומיומי — מקומי (חוסך כסף, אפס latency, עובד offline). Code reviews, onboarding, סדנאות, תרומות open source, עבודה מ-iPad/Chromebook — Codespaces.

לוגיקת if/then לבחירת גישה:

  • אם יש צוות של 3+ מפתחים עם בעיות "אצלי זה עובד" → אז devcontainer.json חובה, Codespaces מומלץ
  • אם עובדים על מחשב חלש או מ-iPad → אז Codespaces הוא הפתרון היחיד
  • אם אין אינטרנט יציב (מטוס, שטח, אזורים כפריים) → אז local בלבד
  • אם צריכים GPU → אז local (אין GPU ב-Codespaces מ-2025)
  • אם רוצים לנסות framework חדש בלי לזהם את המחשב → אז Codespaces template

חשוב לזכור: devcontainer.json שווה גם בלי Codespaces. אם כתבתם devcontainer.json טוב, כל מפתח בצוות יכול להשתמש בו מקומית עם VS Code Dev Containers extension ו-Docker Desktop. אותו קובץ, אותה סביבה — רק שהיא רצה על המחשב המקומי במקום בענן. ככה אתם מקבלים את יתרון העקביות (כולם על אותה סביבה) בלי עלויות הענן.

תרחיש אופטימלי לצוות: כולם משתמשים באותו devcontainer.json. מפתחים עם מחשבים חזקים עובדים מקומית עם Dev Containers. מפתחים עם מחשבים חלשים או שעובדים מרחוק — ב-Codespaces. חבר צוות חדש? Codespace מוכן תוך 15 שניות (עם prebuilds). PR review מורכב? Codespace על הבראנץ'. סדנה או הדגמה? Codespace לכל המשתתפים.

תרגיל 4: טבלת החלטה לפרויקט שלכם (15 דקות)

משימה: בנו טבלת החלטה מותאמת לפרויקט ולצוות שלכם.

  1. רשמו 5 תרחישי עבודה שלכם (פיתוח יומיומי, code review, onboarding, demo ללקוח, וכדומה).
  2. לכל תרחיש — קבעו האם Codespaces או Local עדיף, ולמה.
  3. חשבו את העלות החודשית הצפויה (לפי המסגרת מסעיף 4.8).
  4. כתבו המלצה מסכמת לצוות: מתי להשתמש ב-Codespaces ומתי ב-local.
  5. שתפו את הטבלה ב-README של הריפוזיטורי או ב-Wiki.

תוצאה מצופה: מסמך החלטה ברור שכל חבר צוות יכול לקרוא ולדעת מתי לפתוח codespace ומתי לעבוד מקומית.

4.10 סיכום ומבט קדימה

סיכום הפרק

בפרק הזה למדנו לבנות סביבת פיתוח שלמה בענן עם GitHub Codespaces. התחלנו מהיסודות — מה זה codespace, איך הוא עובד מאחורי הקלעים, ואיך פותחים אחד בלחיצת כפתור. מהר עברנו לפרקטיקה: כתבנו devcontainer.json שמגדיר סביבה שלמה בקובץ אחד, הוספנו features מודולריות שמתקינות כלים בשורת JSON, והגדרנו prebuilds שמקצרים פתיחה מ-5 דקות ל-15 שניות.

למדנו לבחור machine type נכון (ולחסוך מאות דולרים בחודש), להגדיר port forwarding כדי לגשת לשרתי פיתוח מהדפדפן, ליצור dotfiles repo שמסנכרן העדפות אישיות, ולנהל secrets בצורה מאובטחת. חישבנו עלויות, הגדרנו idle timeout ו-retention period, ובנינו עץ החלטה למתי Codespaces ומתי local.

הנקודה המרכזית: devcontainer.json הוא סטנדרט פתוח שעובד גם ב-Codespaces וגם מקומית. ההשקעה בכתיבתו משתלמת בכל מקרה — כל מפתח שיעבוד על הריפוזיטורי יקבל סביבה אחידה ומוכנה.

גשר לפרק הבא: עכשיו שיש לכם סביבת פיתוח מוגדרת (devcontainer.json) ו-deploy אוטומטי (Actions + Pages מפרקים 1 ו-3), הגיע הזמן לנהל את העבודה עצמה. בפרק 5 תלמדו על GitHub Projects — boards, שדות מותאמים, תצוגות, ואוטומציות. ה-codespace שהגדרתם כאן ישמש אתכם לפיתוח שוטף מתוך ה-project board — תפתחו issue, תיצרו branch, תעבדו ב-codespace, ותסגרו את ה-issue עם PR.

אם אתם עושים רק דבר אחד מהפרק הזה

צרו קובץ .devcontainer/devcontainer.json בריפוזיטורי שלכם עם image, לפחות 3 extensions, ו-postCreateCommand שמתקין תלויות. דחפו ל-main ופתחו codespace אחד כדי לבדוק. זה לוקח 10 דקות ונותן לכם (ולכל מי שיעבוד על הריפוזיטורי) סביבת פיתוח אחידה ומוכנה, לנצח. כל השאר — prebuilds, dotfiles, cost optimization — אפשר להוסיף בהמשך.

בדקו את עצמכם
  1. מה ההבדל בין onCreateCommand ל-postCreateCommand, ולמה זה חשוב לעניין prebuilds?
    רמז: חשבו מה רץ ברקע לפני שהמפתח פותח את ה-codespace ומה רץ רק אחרי.
  2. כמה שעות עבודה יש לכם על 4-core עם 120 core-hours? ועל 2-core?
    רמז: הנוסחה היא core-hours / מספר ליבות = שעות זמינות.
  3. מה הסכנה של port forwarding עם visibility public?
    רמז: חשבו מי יכול לגשת ל-URL ומה יכול לראות.
  4. למה dotfiles מוגדרים ברמת user ולא ברמת ריפוזיטורי?
    רמז: חשבו על ההבדל בין העדפות של הפרויקט (כלים, extensions) לבין העדפות אישיות (theme, aliases).
  5. נניח שמפתח עובד 6 שעות ביום על 8-core, 22 ימים בחודש, עם GitHub Free. כמה ישלם?
    רמז: חשבו core-hours (6 x 22 x 8), חסרו 120 free tier, והכפילו ב-$0.09.
שגרת עבודה מומלצת
  • יומית (5 דקות): וודאו שאתם עוצרים את ה-codespace כשאתם מסיימים — לא סוגרים טאב, אלא עוצרים (Codespaces: Stop Current Codespace או gh codespace stop). הפכו את זה להרגל כמו נעילת המחשב. בדקו שעשיתם commit ו-push לפני עצירה — כדי שלא תאבדו שינויים אם ה-retention period יעבור.
  • שבועית (10 דקות): בדקו Settings → Billing → Codespaces — כמה core-hours צרכתם? האם אתם בתוך ה-free tier? יש codespaces עצורים שאפשר למחוק? מחקו כל codespace שלא השתמשתם בו יותר מ-3 ימים — עם prebuilds, פתיחת codespace חדש היא כמעט מיידית. בדקו גם ש-prebuilds רצים בהצלחה בטאב Actions.
  • חודשית (15 דקות): בדקו אם ה-machine type שלכם מתאים — אולי אפשר לרדת ל-2-core? עדכנו את ה-devcontainer.json אם נוספו כלים חדשים לפרויקט או אם גרסאות של שפות וכלים עודכנו. בדקו אם ה-prebuild עדיין רלוונטי ושהוא לא צורך Actions minutes מיותרים. עדכנו את ה-dotfiles repo אם הוספתם aliases או הגדרות חדשות.

מכסות שחשוב לזכור: free tier = 120 core-hours בחודש (GitHub Free). זה 60 שעות על 2-core או 30 שעות על 4-core. אם אתם עובדים 5 ימים בשבוע ב-Codespaces, זה 6 שעות ביום על 2-core. מספיק לרוב — אבל נטרו.

צ'קליסט — מה עשינו בפרק הזה
  • ☐ פתחתי codespace ראשון מריפוזיטורי ובדקתי שהוא רץ על Linux
  • ☐ יצרתי .devcontainer/devcontainer.json עם image, extensions ו-postCreateCommand
  • ☐ הוספתי לפחות 2 Features ל-devcontainer.json ובדקתי שהם מותקנים
  • ☐ הגדרתי prebuild ומדדתי את ההבדל בזמן פתיחה
  • ☐ העברתי התקנות כבדות ל-onCreateCommand כדי שייכללו ב-prebuild
  • ☐ בדקתי את ה-machine type שלי עם nproc ו-free -h
  • ☐ הרצתי שרת והשתמשתי ב-port forwarding עם visibility מתאים
  • ☐ יצרתי dotfiles repo עם install.sh ובדקתי שה-aliases עובדים
  • ☐ הגדרתי לפחות Codespaces secret אחד
  • ☐ הורדתי idle timeout ל-15 דקות או פחות
  • ☐ הורדתי retention period ל-7 ימים או פחות
  • ☐ חישבתי את העלות החודשית שלי לפי מסגרת חישוב העלויות
  • ☐ בניתי טבלת החלטה: מתי Codespaces ומתי local
  • ☐ קראתי את כל 12 מונחי המילון
  • ☐ עניתי על 5 שאלות "בדקו את עצמכם"

בפרק הבא: נעבור מסביבת הפיתוח לניהול הפרויקט — עם GitHub Projects. תלמדו ליצור boards, שדות מותאמים, תצוגות, ואוטומציות שמנהלים את הפרויקט בלי מאמץ. ה-codespace שהגדרתם כאן ישמש אתכם לפיתוח שוטף מתוך ה-project board.