בניית מפתחות Bazel שמצליחים באופן מקומי, עשויה להיכשל בעת ביצועם מרחוק עקב הגבלות ודרישות שאינן משפיעות על גרסאות build מקומיות. הסיבות הנפוצות ביותר לכשלים כאלה מתוארות במאמר 'כללי התאמת בזל' לביצוע מרחוק.
דף זה מתאר כיצד לזהות ולפתור את הבעיות הנפוצות ביותר שמתעוררות בעת ההפעלה מרחוק באמצעות התכונה "ארגז חול של מעגן", אשר קובעת הגבלות על ה-build שווה לאלו של ההפעלה מרחוק. כך תוכלו לפתור את הבעיה ב-build ללא צורך בשירות ביצוע מרחוק.
התכונה 'ארגז חול של מעגן' מחקה את ההגבלות על ביצוע מרחוק, באופן הבא:
ביצוע פעולות בנייה במאגרים מסוג 'כלים'. ניתן להשתמש באותם כלי קיבול של כלים כדי להפעיל את ה-build באופן מקומי ובאופן מרוחק באמצעות שירות התומך בביצוע מרחוק באמצעות קונטיינר.
אין נתונים מיותרים שחוצים את הגבול של המאגר. רק קלט ופלט שהוצהר עליהם במפורש נכנסים למאגר ויוצאים ממנו, ורק לאחר שפעולת הבנייה המשויכת מסתיימת בהצלחה.
כל פעולה מתבצעת במאגר חדש. מאגר ייחודי וחדש נוצר לכל פעולת build שיוצרת.
ניתן לפתור את הבעיות האלה באמצעות אחת מהשיטות הבאות:
פתרון בעיות במקור. בשיטה הזו, Bazel ופעולות הבנייה שלה פועלות באופן מקומי במחשב המקומי שלכם. תכונת ארגז החול של Docker מגבילה את ה-build על מאפשרת זו זהה לזו של ביצוע מרחוק. עם זאת, השיטה הזו לא תזהה כלים, מצבים ונתונים מקומיים שדלפו לתוך ה-build, וזה יגרום לבעיות בהפעלה מרחוק.
פתרון בעיות במאגר של Dock. בשיטה זו, Bazel ופעולות הבנייה שלה פועלות בתוך קונטיינר של Dock, שמאפשר לך לזהות כלים, מדינות ונתונים שדלפו מהמחשב המקומי אל ה-build בנוסף להטלת הגבלות שווה לאלה המבוצעים מרחוק. שיטה זו מספקת תובנות לגבי ה-build גם אם חלקים מה-build נכשלים. שיטה זו היא ניסיונית ואינה נתמכת באופן רשמי.
דרישות מוקדמות
אם עדיין לא עשיתם זאת, יש לבצע את הפעולות הבאות לפני שמתחילים לפתור את הבעיה:
- התקנת Docker והגדרת ההרשאות הנדרשות להפעלתו.
- התקנת Bazel 0.14.1 ואילך. גרסאות קודמות אינן תומכות בתכונה 'ארגז חול' של Docker.
- יש להוסיף את הקובץ bazel-toolchains
המוצמד לגרסת הגרסה האחרונה, לקובץ
WORKSPACE
של ה-build כפי שמתואר כאן. - יש להוסיף סימונים לקובץ
.bazelrc
כדי להפעיל את התכונה. יוצרים את הקובץ בספריית השורש של פרויקט בזל, אם הוא לא קיים. הסימונים שבהמשך הם דוגמה לדוגמה. יש לעיין בקובץ העדכני.bazelrc
במאגר bazel-toolchains ולהעתיק את ערכי הסימונים המוגדרים שם עבור התצורהdocker-sandbox
.
# Docker Sandbox Mode
build:docker-sandbox --host_javabase=<...>
build:docker-sandbox --javabase=<...>
build:docker-sandbox --crosstool_top=<...>
build:docker-sandbox --experimental_docker_image=<...>
build:docker-sandbox --spawn_strategy=docker --strategy=Javac=docker --genrule_strategy=docker
build:docker-sandbox --define=EXECUTOR=remote
build:docker-sandbox --experimental_docker_verbose
build:docker-sandbox --experimental_enable_docker_sandbox
אם לכללים שלכם נדרשים כלים נוספים, יש לפעול לפי השלבים הבאים:
צור כלי עגינה מותאם אישית ל-Dock על ידי התקנת כלים באמצעות Dockerfile ובנייה של התמונה באופן מקומי.
החלף את הערך של הדגל
--experimental_docker_image
שלמעלה בשם התמונה של המאגר המותאם אישית שלך.
פתרון בעיות באופן מקורי
שיטה זו מבצעת את Bazel וכל פעולות ה-build שלה ישירות במחשב המקומי, וזו דרך אמינה לוודא אם ה-build יצליח כאשר יבוצע מרחוק.
עם זאת, בשיטה זו, כלים, בינאריים ונתונים המאוחסנים באופן מקומי עלולים לזרום לתוך ה-build, במיוחד אם נעשה שימוש בכללי WORKSPACE בסגנון הגדרה. דליפות כאלה יגרמו לבעיות בהפעלה מרחוק. כדי לזהות אותן, פותרים בעיות במאגר של Dock בנוסף לפתרון בעיות באופן מקורי.
שלב 1: הפעלת ה-build
הוסיפו את הסימון
--config=docker-sandbox
לפקודה Bazel שמבצעת את ה-build. למשל:bazel --bazelrc=.bazelrc build --config=docker-sandbox target
מריצים את ה-build וממתינים עד לסיום התהליך. ה-build יפעל עד פי ארבעה איטי יותר מהרגיל בגלל התכונה 'ארגז חול של דוקר'.
ייתכן שתיתקלו בשגיאה הבאה:
ERROR: 'docker' is an invalid value for docker spawn strategy.
אם כן, הרץ שוב את ה-build עם הסימון --experimental_docker_verbose
.
הסימון הזה מפעיל הודעות שגיאה עם דרגת מלל. שגיאה זו נגרמת בדרך כלל על ידי התקנה שגויה של אביזר עגינה, או שאין לך הרשאות לבצע אותה בחשבון המשתמש הנוכחי. מידע נוסף זמין בתיעוד של עגינה. אם הבעיות ממשיכות, דלג קדימה אל פתרון בעיות במכל של Docker.
שלב 2: פותרים בעיות שזוהו
לפניכם הבעיות הנפוצות ביותר והפתרונות העקיפים שלהן.
קובץ, כלי, בינארי או משאב שמתבצעת אליהם הפניה מעץ ההפעלה של Bazel חסר. מוודאים שכל יחסי התלות של היעדים המושפעים הוצהרו במפורש. מידע נוסף זמין במאמר ניהול יחסי תלות מרומזים.
קובץ, כלי, קובץ בינארי או משאב מפנה בנתיב מוחלט או שהמשתנה
PATH
חסר. עליך לוודא שכל הכלים הנדרשים מותקנים בתוך המאגר של 'כלי כלים' ולהשתמש בכללי ה-toolchain כדי להצהיר על יחסי תלות מסוימים שמצביעים אל המשאב החסר. מידע נוסף זמין במאמר הפעלת כלים לבניית גרסאות באמצעות כללי 'כלים'.הפעלה בינארית נכשלה. אחד מכללי ה-build מתייחס לבינארי שאינו תואם לסביבת הביצוע (המאגר של דוקר). ראה ניהול קבצים בינאריים תלויי-פלטפורמה למידע נוסף. אם לא מצליחים לפתור את הבעיה, יש לפנות אל bazel-discuss@google.com לקבלת עזרה.
קובץ מ-
@local-jdk
חסר או גורם לשגיאות. הקבצים הבינאריים של Java במכונה המקומית שלכם דולפים אל ה-build תוך אי-התאמה אליו. השתמש ב-java_toolchain
בכללים וביעדים שלך במקום ב-@local_jdk
. אם נדרשת לך עזרה נוספת, אפשר לפנות אל bazel-discuss@google.com.שגיאות אחרות. לקבלת עזרה, יש לפנות אל bazel-discuss@google.com.
פתרון בעיות במאגר ב-Dock
בשיטה הזו, Bazel פועלת בתוך מאגר מארח של Dock ארגז החול הולץ מאגר כלים חדש לגמרי לכל פעולת build, ורק פעולה אחת מתבצעת בכל מאגר כלים.
שיטה זו מספקת שליטה מפורטת יותר בכלים המותקנים בסביבה של המארח. על-ידי הפרדת ההפעלה של ה-build מביצוע פעולות ה-build שלך ושמירה על מינימום ההתקנה של ה-build, תוכל לוודא האם ל-build שלך יש תלות כלשהי בסביבת הביצוע המקומית.
שלב 1: בניית המאגר
יצירת
Dockerfile
שיוצרת את מאגר Docker ומתקינה את Bazel בקבוצה מינימלית של כלים לבניית:FROM debian:stretch RUN apt-get update && apt-get install -y apt-transport-https curl software-properties-common git gcc gnupg2 g++ openjdk-8-jdk-headless python-dev zip wget vim RUN curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" RUN apt-get update && apt-get install -y docker-ce RUN wget https://releases.bazel.build/<latest Bazel version>/release/bazel-<latest Bazel version>-installer-linux-x86_64.sh -O ./bazel-installer.sh && chmod 755 ./bazel-installer.sh RUN ./bazel-installer.sh
בניית המאגר בתור
bazel_container
:docker build -t bazel_container - < Dockerfile
שלב 2: הפעלת המאגר
הפעל את המאגר של Docker באמצעות הפקודה המוצגת למטה. בפקודה, מחליפים את הנתיב אל קוד המקור במארח שרוצים לבנות.
docker run -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /tmp:/tmp \
-v your source code directory:/src \
-w /src \
bazel_container \
/bin/bash
פקודה זו מפעילה את המאגר בתור הרמה הבסיסית (root), ממפה את שקע העגינה ותואמת
את הספרייה /tmp
. הפעולה הזו מאפשרת ל-Bazel להוביל מאגרי Docker אחרים ולהשתמש
בספריות תחת /tmp
כדי לשתף קבצים עם המאגרים האלה. קוד המקור שלך
זמין ב-/src
בתוך מאגר התגים.
הפקודה מתחילה במכוון ממאגר בסיס debian:stretch
שמכיל בינאריים שאינם תואמים למאגר rbe-ubuntu16-04
המשמש כמאגר של 'כלים'. אם בינאריים מהסביבה המקומית דולפים למכל של 'כלים', הם יגרמו לשגיאות בנייה.
שלב 3: בודקים את המאגר
הרץ את הפקודות הבאות מתוך מאגר התגים של Dock כדי לבדוק אותה:
docker ps
bazel version
שלב 4: הפעלת ה-build
הפעילו את ה-build כפי שמוצג בהמשך. הפלט של המשתמש הוא תיקיית השורש, כך שהוא תואם לספרייה שאליה ניתן לגשת עם אותו נתיב מוחלט מתוך מאגר הקיבול שבו בזל פועל, מתוך מאגרי הכלים המוצעים על ידי תכונת ארגז החול של דוקר אילו פעולות build של בזל פועלות, ומהמחשב המקומי שבו המארחים והגורמים לביצוע של פעולות פועלים.
bazel --output_user_root=/tmp/bazel_docker_root --bazelrc=.bazelrc \ build --config=docker-sandbox target
שלב 5: פתרון בעיות שזוהו
תוכלו לפתור את הכשלים ב-build באופן הבא:
אם ה-build ייכשל עם שגיאה 'שטח האחסון בדיסק', תוכל להגדיל את המגבלה הזו על ידי הפעלת מאגר המארח עם הסימון
--memory=XX
, כאשרXX
הוא שטח הדיסק שהוקצה בג'יגה-בייט. זוהי תוצאה ניסיונית והיא עלולה לגרום להתנהגות בלתי צפויה.אם ה-build ייכשל במהלך הניתוח או שלבי הטעינה, אחד או יותר מכללי ה-build שצוינו בקובץ WORKSPACE לא תואמים להפעלה מרחוק. מידע נוסף על סיבות אפשריות ופתרונות עקיפים מפורטים בכללי ההתאמה ללוחות זמנים של ביצוע מרחוק.
אם build זה נכשל מסיבה אחרת, עיינו בשלבים לפתרון בעיות בשלב 2: פתרון בעיות שזוהו.