בניות וחתימה
Ploa בונה אפליקציות Expo, Flutter, React Native, Capacitor ואפליקציות נייטיב ב-Swift או ב-Kotlin, כל אחת בכלים שלה, חותמת על כל בנייה עם מפתחות שאף פעם לא יוצאים מהשרת שלה, ושולחת אותה ל-TestFlight ולבדיקה הפנימית של Google Play. הסוכן שלך מתחיל כל בנייה ועוקב אחריה עד שהיא אצל הבודקים. אפליקציות שנבנו בכל דרך אחרת עולות כמו שהן נבנו.
תריץ preflight, תתקן את מה שהחנויות היו דוחות, ואז תבנה iOS ואנדרואיד ותשלח לבודקים.
תבנה אנדרואיד ב-GitHub ממה שנדחף לענף השחרור.
הבנייה כבר ב-TestFlight? אם היא נכשלה, תמצא למה ותתקן.
תעצור את הבנייה שרצה עכשיו.
הכלים שמאחורי הבקשות האלה: כל כלי ה-MCP › בניות. הכלים של מפתח ההעלאה של אנדרואיד נמצאים תחת התחלה והגדרה, ובניות ב-GitHub תחת GitHub.
מי עושה מה
| מי | מה |
|---|---|
| הסוכן שלך | מריץ preflight ומתקן את מה שנמצא (ploa_preflight); מתחיל את הבנייה במקום שבחרת (ploa_release_start); עוקב אחריה (ploa_release_status, ploa_runs); שולח את קובצי הבנייה שאין ב-git (ploa_build_files_push); מגדיר בניות ב-GitHub (ploa_github_setup); עוצר בנייה רק אחרי שאתה מסכים (ploa_release_stop). |
| Ploa | בוחרת את מספר הבנייה הפנוי הבא, חותמת על הבנייה, מעלה אותה (או פותחת את ההעלאה למכונת הבנייה), עוקבת אחרי העיבוד של Apple, מעבירה אותה ל-TestFlight או לבדיקה הפנימית, יוצרת מפתח העלאה של אנדרואיד לאפליקציה חדשה, ומודיעה לך כשהבנייה אצל הבודקים או כשהיא נכשלה. |
| אתה | בוחר איפה הבניות רצות (דקות ב-GitHub, שעות Xcode Cloud או החשבון של ה-Google Cloud שלך הם שלך); מאשר קובצי בנייה ואת הקישור לריפו ב-GitHub; מעביר ל-Ploa פעם אחת מפתח העלאה קיים של אנדרואיד; ועושה בעצמך את הצעדים המעטים ש-Apple משאירה לך (מוצר Xcode Cloud שיוצרים ב-Xcode, יכולת שה-API של Apple לא יכול להפעיל). |
בנייה הולכת רק לבודקים. App Review ופרודקשן הם צעדים נפרדים שאתה מאשר; ראה הגשה ל-App Review ושחרור.
לפני בנייה: preflight
preflight בודק בפרויקט את מה ש-App Store Connect ו-Google Play היו דוחים, עוד לפני שמשקיעים זמן בבנייה: מספרי הגרסה והבנייה מול החנויות, ה-bundle IDs, האייקון, מחרוזות ההרשאה של iOS, ה-privacy manifest, תאימות לייצוא, ה-target SDK של Play, הרשאות רגישות, וסודות שנכנסו ל-git. לכל ממצא מצורף התיקון שלו, והסוכן שלך מריץ אותו לפני כל בנייה. הוא קורא פרויקטים של Expo; על אפליקציות Flutter, React Native בלי Expo, Capacitor, Gradle ו-Xcode הוא אומר שהוא עוד לא בודק אותן, והבנייה ממשיכה.
איפה הבניות רצות
| איפה | פלטפורמות | כדאי לדעת |
|---|---|---|
| המחשב הזה | iOS (Mac עם Xcode), אנדרואיד | ברירת המחדל לסוכן שעל המחשב שלך. בונה את מה שיש בדיסק, כולל שינויים מקומיים. אף פעם לא נספר. |
| GitHub Actions | אנדרואיד על ה-Linux של GitHub; iOS על ה-Mac שלך כ-self-hosted runner, או על מחשבי ה-Mac של GitHub כשבעלים אישר אותם | בונה את מה שנדחף, עם ה-workflow ש-Ploa כותבת לריפו. הדקות נספרות בחשבון ה-GitHub שלך, לא אצל Ploa: בחינם בריפו ציבורי; בריפו פרטי דקה של Mac נספרת כעשר (בנייה של iOS היא בערך 150 עד 200). הדרך היחידה לסוכן ברשת. עוד בעמוד GitHub. |
| Xcode Cloud | iOS | Apple בונה וחותמת ממה שנדחף (main, אלא אם נותנים שם של ענף אחר), ו-Ploa עוקבת אחריה עד TestFlight; נספר משעות ה-Xcode Cloud שלך אצל Apple. |
| ה-Google Cloud שלך | אנדרואיד | Cloud Build בפרויקט שלך, ממה שנדחף; Google מחייבת את הפרויקט הזה על הדקות, אף פעם לא את Ploa. Ploa עדיין חותמת על הבנייה: שום מפתח לא עובר ל-Google. |
הסוכן שלך שואל איפה לבנות, או בוחר בשבילך: where: "auto" בונה ב-GitHub כשהפלטפורמה מוכנה שם, ובכל מקרה אחר על המחשב הזה, ואומר איפה ולמה. בכל מקום חוץ מהמחשב הזה, בנייה לוקחת את מה שנעשה לו commit ונדחף, לא שינויים מקומיים.
הגדרת Xcode Cloud
ה-API של Apple לא יכול ליצור את מוצר ה-Xcode Cloud של האפליקציה או לחבר את הריפו, ולכן הצעד הראשון הזה נעשה ב-Xcode על Mac (כפתור הענן › Get Started). את כל מה שאחריו Ploa עושה: ploa xcode-cloud בתיקייה של האפליקציה מכין את הריפו (לאפליקציית Expo, הסקריפט שיוצר את ios/ אחרי ש-Xcode Cloud משכפל אותו) ואומר מה נשאר, ו-Ploa מכינה את ה-workflow כך שהוא יוצר ארכיון ל-TestFlight ומתחיל רק כש-Ploa מתחילה אותו. מפתח החתימה נשאר אצל Apple.
הגדרת ה-Google Cloud שלך
בעלים מגדיר את הפרויקט פעם אחת בהגדרות › בניות, שם כתוב מה להריץ ב-Cloud Shell. המכונה של השכבה החינמית חינם ל-2,500 דקות בחודש, אבל איטית ל-Gradle (חצי שעה ויותר לבנייה); מכונה גדולה יותר שבוחרים עולה לפי דקה מהדקה הראשונה, והסוכן שלך אומר איזו לפני שהוא בונה.
iOS: חתימה בלי המפתח על ה-Mac שלך
על ה-Mac שלך הבנייה רצה ב-Xcode ונחתמת במפתח ההפצה של Ploa, שנשאר אצל Ploa: ה-Mac שולח רק את החלקים שצריכים חתימה, ו-Ploa חותמת עליהם. אין מה להגדיר ב-Xcode, ואין תעודה ב-keychain שלך. Ploa יוצרת את התעודה מול Apple כשמחברים את ה-App Store, ומפעילה אצל Apple את היכולות שה-entitlements של האפליקציה צריכים (push, App Groups). יכולת שה-API של Apple לא יכול להפעיל היא צעד שלך, לפני הבנייה הראשונה שמשתמשת בה: מדריך ההגדרה נותן לך את הקישור לעמוד של ה-bundle ID אצל Apple.
ההעלאה. כברירת מחדל ה-Mac מעלה את הבנייה ישר ל-App Store Connect, עם קישורים חד-פעמיים ש-Ploa מבקשת מ-Apple: הקובץ לא מגיע ל-Ploa, ומפתח ה-App Store נשאר בשרת של Ploa. בהגדרות האפליקציה › האפליקציה › App Store אפשר להעביר את איך מעלים בניות iOS לדרך Ploa: ה-Mac שולח את הקובץ ל-Ploa, והיא מעלה אותו. אחר כך העיבוד של Apple לוקח עד חצי שעה.
מספר הבנייה הוא המספר הפנוי הבא, אלא אם אתה או הסוכן שלך מעבירים מספר. עם --sign keychain, הדרך הישנה, המפתח נכנס ל-keychain זמני על ה-Mac בזמן ש-Xcode ו-codesign חותמים.
אנדרואיד: מפתח ההעלאה בכספת
כל בנייה של אנדרואיד נחתמת עם מפתח ההעלאה של האפליקציה לפני שהיא יוצאת ל-Google Play. Ploa שומרת את המפתח הזה בכספת שלה, כך שאין keystore על המחשב שלך או ב-CI.
הקובץ עובר מהמכונה שבנתה אותו ישר ל-Google Play. המכונה מכינה את קובץ החתימה של הבנייה, Ploa חותמת רק עליו במפתח ההעלאה, והבנייה החתומה עולה ל-Google דרך סשן העלאה ש-Ploa פותחת עם הגישה שלה ל-Google Play. הסשן מאפשר למכונה להעלות רק את הבנייה הזו ושום דבר אחר, כך שלא המפתח ולא הגישה של Ploa ל-Google Play יוצאים אף פעם מ-Ploa. אחר כך Ploa בודקת שהבנייה הגיעה ל-Google עם ה-version code הנכון, ומעבירה אותה לבדיקה הפנימית. בנייה גדולה עוברת פעם אחת, לא פעמיים.
- אפליקציה חדשה (Play עוד לא ראתה אף בנייה שלה): לפני הבנייה הראשונה Ploa יוצרת מפתח חדש ישר בכספת (RSA 2048, בתוקף 30 שנה), כך שלאף אחד אין עותק שלו. Play לוקחת את המפתח של הבנייה הראשונה כמפתח ההעלאה של האפליקציה. אין לך מה לעשות.
- אפליקציה ש-Play כבר מכירה (נבנתה עם EAS או Android Studio): מעבירים ל-Ploa את ה-keystore הקיים (
.keystore,.jksאו.p12) פעם אחת, בהגדרות האפליקציה › האפליקציה › Google Play › הוספת המפתח, או דרך הסוכן שלך מנתיב במחשב שלך. הסיסמה מגיעה ממך, ואף פעם לא נכתבת לקובץ. - מפתח שאבד, או כזה שרוצים להחליף: Ploa יוצרת מפתח חדש ונותנת לך את התעודה שלו בשביל Play Console › Test and release › App integrity › Upload key › Request upload key reset.
סוכן רגיל לא יכול להוסיף או להחליף את המפתח: עושים את זה בעצמך, או דרך סוכן שהבעלים הפכו לאוטונומי. הבעלים של סביבת העבודה מקבלים הודעה בכל פעם. מפתח שכבר נמצא אצל Ploa מוחלף רק כשמבקשים, כי Play דוחה בניות שחתומות במפתח שהיא לא מכירה.
ישר ל-Google Play או דרך Ploa. ישר זו ברירת המחדל, בהגדרות האפליקציה › האפליקציה › Google Play › איך מעלים בניות Android. אם ההעלאה הישירה לא עוברת, הבנייה נשלחת במקום זה ל-Ploa, שחותמת עליה ומעלה אותה ל-Google Play; הבנייה ממשיכה, וההרצה רושמת את זה. בנייה של pull request תמיד עוברת דרך Ploa, בשביל קישור ההתקנה שלה. בתוכניות Pro ו-Team בוחרים דרך Ploa כדי לשלוח כך כל בנייה. בתוכנית Free הבניות עולות ישר, ואפליקציה שבחרה "דרך Ploa" עולה ישר כל עוד סביבת העבודה בתוכנית Free, וחוזרת לעבור דרך Ploa כשהיא עוברת ל-Pro או ל-Team.
Flutter, React Native, Capacitor ואפליקציות נייטיב
Ploa בונה אותן בכלים שלהן, בכל מקום שבו בניות רצות (ה-Mac שלך, GitHub או ה-Google Cloud שלך), וחותמת עליהן כמו על אפליקציית Expo. אין מה להגדיר מעבר למה שכבר יש בפרויקט.
- Flutter:
flutter build appbundle, ול-iOSflutter build ios --config-only, pods וארכיון לא חתום. הגרסה מגיעה מ-pubspec.yaml. במקום שבו Flutter לא מותקן (GitHub, ה-Google Cloud שלך), Ploa מורידה את הגרסה שהפרויקט קובע ב-.fvmrc, ואם אין, את stable. - React Native בלי Expo: Gradle בתיקיית
android/, pods ו-Xcode בתיקייתios/. - Capacitor ו-Ionic: החלק של הווב עם סקריפט ה-
buildשלו,npx cap sync, ואז Gradle או Xcode. מוסיפים את הפרויקטים הנייטיב פעם אחת עםnpx cap add android/iosושומרים אותם ב-git. - אנדרואיד (Kotlin או Java):
./gradlew :app:bundleReleaseבפרויקט ה-Gradle, עם הגרסה מ-versionName. - Xcode (Swift או Objective-C): ארכיון לא חתום של ה-scheme של האפליקציה, עם הגרסה מ-
MARKETING_VERSION.
מספר הבנייה עולה לבד, אחד מעל מה שיש בחנות. הקישור קורא את המזהים של האפליקציה מקובץ ה-Gradle ומפרויקט ה-Xcode, ואת ה-bundle IDs וה-entitlements לחתימה מפרויקט ה-Xcode, כך ש-push ו-App Groups עדיין מופעלים אצל Apple.
אפליקציות שנבנו בכל דרך
Unity, .NET MAUI או כל דבר אחר: בונים כרגיל, ו-Ploa שולחת את הקובץ עם הגרסה שכתובה בו.
ploa init --aab build/app.aab --ipa build/App.ipa # once, to link the app
ploa release android --aab build/app.aab
ploa release ios --ipa build/App.ipaגם על קובץ .ipa, .app או .xcarchive שעוד לא נחתם ל-App Store (פיתוח, ad hoc, לא חתום) Ploa חותמת באותה דרך, על כל מחשב. --resign חותם מחדש גם קובץ שכבר חתום. אפליקציה שהבניות שלה מגיעות לחנויות ממקום אחר לגמרי אפשר להגדיר לאיפה היא נבנית: במקום אחר (ראה חנויות ואפליקציות).
קבצים שהבנייה קוראת ואין ב-git
בנייה מריפו (GitHub, ה-Google Cloud שלך) לא רואה קבצים שלא נעשה להם commit, כמו google-services.json, GoogleService-Info.plist או קובצי ה-.env ש-Expo טוענת. Ploa מוצאת אילו חסרים לפי ההגדרות של האפליקציה בענף השחרור, וסטטוס ה-GitHub אומר את זה.
- הסוכן שלך שולח אותם מהעותק שלך עם
ploa_build_files_push. רק שמות, גדלים ושמות המשתנים של.envעוברים דרכו, אף פעם לא הערכים. - בלוח הבקרה, חלון קובצי הבנייה מבקש לבחור את התיקייה של האפליקציה, והדפדפן מחפש בה רק את הקבצים שהבנייה קוראת. שום דבר לא נשלח עד שמוסיפים את מה שנמצא.
- מהטרמינל,
ploa filesמפרט אותם ו-ploa files pushשולח אותם.
בכל הדרכים הם מחכים אטומים בכספת עד שתאשר אותם בהקשה אחת ב-ploa.dev, ונמחקים אחרי 24 שעות אם לא אושרו. מפתחות של חנויות וחתימה אף פעם לא נחשבים קובצי בנייה: הם כבר אצל Ploa. google-services.json ו-GoogleService-Info.plist לא סודיים, ולכן אפשר גם לעשות להם commit.
התחלה ועצירה של בנייה
בלוח הבקרה שום דבר לא מתחיל ולא נעצר בלחיצה אחת. יצירת בנייה, בפס הכהה בתחתית העמודים של האפליקציה, פותח את חלון הבנייה, שבו בוחרים את הפלטפורמות ואיפה לבנות; בשלב שני מופיעים האפליקציה, הפלטפורמות, איפה בונים, הקומיט או הענף, כמה זה עולה ולאן הבנייה הולכת. רק כן, להתחיל את הבנייה מתחיל אותה, ו"חזרה" שומר את מה שנבחר.
לבנייה שעדיין רצה יש כפתור עצירה באריח החי שלה, בחלון שלה ובדף הגרסה. חלון מסביר מה העצירה עושה במקום שבו היא רצה, ואז שואל שוב:
| איפה היא רצה | מה העצירה עושה |
|---|---|
| GitHub Actions | GitHub מבטל את הריצה. |
| ה-Google Cloud שלך | Cloud Build מבטל אותה. |
| Xcode Cloud | ה-API של Apple לא יכול לעצור ריצה, ולכן Ploa מפסיקה לעקוב אחריה ואומרת את זה: היא ממשיכה לרוץ עד שעוצרים אותה ב-App Store Connect או ב-Xcode. |
| מחשב עם ה-CLI | ה-CLI נעצר כש-Ploa מסרבת לדיווח ההתקדמות הבא שלו. |
- אפשר לעצור בנייה רק כל עוד היא נבנית. ברגע שהקובץ בדרך לחנות, הוא ממשיך עד הסוף.
- בנייה שנעצרה מראה נעצר על ידי מי ומתי, באפור ולא באדום, וציר הזמן שלה אומר שהיא נעצרה מ-Ploa. אי אפשר להמשיך אותה: מתחילים בנייה חדשה.
- בנייה שנעצרה במקום שבו רצה, מחוץ ל-Ploa (דף הריצה ב-GitHub, הקונסולה של Cloud Build, Xcode Cloud), מופיעה כנעצרה מחוץ ל-Ploa, ולא ככישלון.
- אם GitHub או Cloud Build לא עצרו אותה, Ploa אומרת את זה ואיפה לעצור אותה.
- הסוכן שלך עוצר בנייה בשני שלבים כמו לוח הבקרה: קודם הוא אומר לך מה העצירה עושה, ועוצר רק אחרי שאתה מסכים. לוח הבקרה מראה אחר כך איזה סוכן עצר אותה.
כשבנייה מחכה להתחיל
בנייה שעוד לא התחילה אומרת למה היא מחכה: ממתין לשרת של GitHub ב-GitHub, מכין את המכונה ב-Google Cloud (המכונה מורידה את תמונת הבנייה, בדרך כלל דקה עד שלוש), וממתין ל-Mac ב-Xcode Cloud.
מעקב אחרי בנייה
- הסוכן שלך עוקב אחריה עם
ploa_release_status(השלב, ושורות היומן האחרונות כשהיא נבנית על המחשב שלך) ו-ploa_runs(כל צעד עם הזמן שלו, ולמה צעד נכשל).ploa_shipping_reportאומר איפה הכול עומד. - בלוח הבקרה, לשונית הגרסאות של האפליקציה מציגה כל בנייה בזמן אמת, עם כל צעד והזמן שלו, והפס שמעל העמודים מראה את הבנייה שרצה. כישלון של בנייה, או סירוב של חנות, מופיעים בשורה ובחלון שלה.
- מהטרמינל,
ploa releaseמדפיס כל צעד בזמן שהוא קורה, ו-ploa statusמציג מה יש בחנויות.
בנייה גמורה כשהיא מגיעה לבודקים. בקשה בסוף שלה (App Review, פרודקשן) היא צעד בפני עצמו: אם חנות מסרבת לה, הבנייה עדיין גמורה, והבקשה מופיעה כמשהו שלך לבקש שוב. מקבלים התראה כשבנייה מגיעה לבודקים או נכשלת.
Ploa לא שומרת את הבניות שלך. בנייה נמחקת מ-Ploa ברגע שהחנות קיבלה אותה.
מהטרמינל
בלי סוכן, אותן בניות מתחילות מ-ה-CLI בתיקייה של האפליקציה:
ploa preflight # what the stores would reject ploa release ios # build on this Mac, sign, TestFlight ploa release android # build, sign, internal testing ploa release ios --build-number 42 # a build number of your choice ploa release android --gcp # in your Google Cloud ploa release ios --xcode-cloud # in Xcode Cloud ploa files push # build files git doesn't have