Riferimento CLI / API
foxstore-cli è l'API di pubblicazione non interattiva di Fox Store per CI/CD. API indica qui l'interfaccia del processo a riga di comando: parametri, file, stdout/stderr e codici di uscita, senza servizio HTTP. È un eseguibile unico collegato staticamente a foxstore-engine; non richiede di installare o avviare Desktop né legge le sue credenziali SQLite.
La CLI automatizza pubblicazioni su Apple, Google Play, Huawei, mini programmi WeChat, Tencent MyApp, HONOR, Samsung, Pgyer, vivo, Xiaomi e OPPO. Archiviazione a oggetti, recensioni, Analytics, gestione ordinaria dei certificati, ottimizzazione immagini e diagnosi IA restano in Engine e Desktop.
Inizia dalla Guida CI/CD per integrare GitHub Actions, GitLab CI o Jenkins e consulta qui i parametri.
Formato globale
foxstore-cli [--output human|json|ndjson] <command>| Parametro | Predefinito | Descrizione |
|---|---|---|
--output | human | human per il terminale; json produce un risultato strutturato; ndjson un risultato finale compatto, senza eventi di avanzamento in tempo reale. Può precedere o seguire il sottocomando. |
--help | - | Mostra la guida attuale del comando. |
--version | - | Mostra la versione del binario. |
--help / -h produce sempre testo di aiuto e --version / -V testo di versione, senza envelope anche con formato strutturato. Per ottenere la versione strutturata usa version --output json.
Tipi usati: string, testo (gli ID restano stringhe); path, percorso locale del Runner; i64 / i32, interi con segno; u64 / u8, interi non negativi; f64, virgola mobile. «Opzionale» può essere omesso senza valore predefinito. Un «interruttore» booleano usa solo il nome; un «valore» booleano richiede true o false. I comandi publish e status ereditano le credenziali del provider.
Comandi di base:
foxstore-cli version
foxstore-cli providers --output json
foxstore-cli capabilities --provider apple --output json
foxstore-cli artifact inspect --file ./build/App.ipa --output json
foxstore-cli preflight apple --file ./build/App.ipa --output json
foxstore-cli preflight android --file ./build/App.aab --expected-package-name com.example.app --output json
foxstore-cli preflight huawei --file ./build/App.app --output json| Comando | Parametri | Risultato |
|---|---|---|
version | Nessuno | Restituisce version e engineSchemaVersion. |
providers | Nessuno | Restituisce provider compilati nel binario e disponibilità. |
capabilities | Obbligatorio --provider <string> | Restituisce descrizione, cliPublish e capacità escluse, non uno schema per comando. |
artifact inspect | Obbligatorio --file <path> | Identifica tipo, dimensione e SHA-256 dell'artefatto. |
preflight apple | Obbligatorio --file <path> | Verifica un IPA Apple. |
preflight android | Obbligatorio --file <path>; opzionale --expected-package-name <string> | Verifica il pacchetto Android e, facoltativamente, il nome. |
preflight huawei | Obbligatorio --file <path> | Analizza solo HarmonyOS .app; per APK/AAB Huawei usa preflight android. |
providers elenca tutti i 15 provider statici; l'archiviazione a oggetti ha cliPublish: excluded. capabilities --provider accetta gli ID apple, google-play, huawei-appgallery, wechat-miniprogram, tencent-appstore, honor, samsung-galaxy-store, pgyer, vivo, xiaomi, oppo, aliyun, tencent-cloud, aws, minio. I sottocomandi Huawei e Samsung sono huawei e samsung, non gli ID del catalogo.
artifact inspect identifica solo tipo, dimensione e SHA-256, senza verificare firme. preflight analizza in locale senza pubblicare; Apple può restituire successo e codice 0 con data.status: blocked: controlla data.status == "ready" e data.checks[].blocksUpload. Gestisci anche i warnings Android secondo le regole del team. publish apple ripete la verifica e blocca pacchetti blocked; superarla non significa accettazione dello store.
Origine delle credenziali
I Secret non si passano come normali argomenti. *-env riceve il nome della variabile e *-file un percorso temporaneo creato da CI; si escludono a vicenda per lo stesso segreto. Tutti i *-env sono string opzionali e *-file path opzionali. Senza origine esplicita si usano queste variabili predefinite.
| Provider | Variabile predefinita | Parametri alternativi |
|---|---|---|
| Apple | APPLE_PRIVATE_KEY | --private-key-env / --private-key-file; Issuer ID e Key ID usano --issuer-id e --key-id |
| Google Play | GOOGLE_PLAY_CREDENTIALS_JSON | --credentials-env / --credentials-file |
| Huawei HarmonyOS | HUAWEI_SERVICE_ACCOUNT_JSON | --service-account-env / --service-account-file |
| Huawei Android | HUAWEI_ANDROID_API_CLIENT_JSON | --android-api-client-env / --android-api-client-file |
| Mini programmi WeChat | WECHAT_MINIPROGRAM_PRIVATE_KEY | --private-key-env / --private-key-file |
| Tencent MyApp | TENCENT_APPSTORE_USER_ID, TENCENT_APPSTORE_ACCESS_SECRET | --user-id-env / --user-id-file, --access-secret-env / --access-secret-file |
| HONOR | HONOR_CLIENT_ID, HONOR_API_SECRET | --client-id-env / --client-id-file, --api-secret-env / --api-secret-file |
| Samsung | SAMSUNG_CREDENTIALS_JSON | --credentials-env / --credentials-file |
| Pgyer | PGYER_API_KEY, PGYER_USER_KEY | --api-key-env / --api-key-file, --user-key-env / --user-key-file |
| vivo | VIVO_ACCESS_KEY、VIVO_ACCESS_SECRET | --access-key-env / --access-key-file、--access-secret-env / --access-secret-file |
| Xiaomi | XIAOMI_USER_NAME, XIAOMI_API_SECRET, XIAOMI_PUBLIC_CERTIFICATE | --user-name-env / --user-name-file, --api-secret-env / --api-secret-file, --public-certificate-env / --public-certificate-file |
| OPPO | OPPO_CLIENT_ID、OPPO_CLIENT_SECRET | --client-id-env / --client-id-file、--client-secret-env / --client-secret-file |
In Apple, --issuer-id e --key-id sono string obbligatori per doctor/publish/status. Le credenziali JSON ricevono il documento completo, non una stringa con il percorso. Google/Huawei usano il JSON esportato; Samsung usa { "serviceAccountId": "…", "privateKey": "…", "accessToken": null } (primi due string obbligatori, accessToken string opzionale). Mantieni le interruzioni PEM; non inserire segreti reali in argomenti, repository o log.
Mantieni i nomi esportati dei campi JSON, senza convertire tutto in camelCase:
| Credenziale | Campi (string, obbligatori salvo indicazione) |
|---|---|
| Google Play | type fisso a service_account, project_id, private_key_id, private_key, client_email, token_uri. |
| Huawei Service Account | key_id, private_key, sub_account, auth_uri, token_uri, auth_provider_cert_uri, client_cert_uri; project_id opzionale. |
| Huawei Android API Client | client_id、client_secret。 |
| Samsung | serviceAccountId, privateKey; accessToken opzionale. |
La CLI non legge automaticamente variabili *_FILE; indica esplicitamente, ad esempio, --private-key-file "$APPLE_KEY_FILE". Le quattro origini Huawei si escludono a vicenda: doctor/status usa HarmonyOS Service Account per impostazione predefinita; Android richiede --android-api-client-env HUAWEI_ANDROID_API_CLIENT_JSON o --android-api-client-file <path>. publish sceglie le credenziali secondo .app / .apk|.aab; consigliamo comunque di indicare l'origine per evitare confusione.
Diagnosi della connessione
doctor verifica credenziali, connessione del provider o ambiente locale senza caricare o inviare app. Normalmente effettua richieste remote; non è una validazione dei parametri offline.
foxstore-cli doctor apple --issuer-id "$APPLE_ISSUER_ID" --key-id "$APPLE_KEY_ID" --output json
foxstore-cli doctor google-play --package-name com.example.app --output json
foxstore-cli doctor huawei --output json
foxstore-cli doctor pgyer --output json
foxstore-cli doctor tencent-appstore --output json
foxstore-cli doctor vivo --package-name com.example.app --output json
foxstore-cli doctor samsung --output json
foxstore-cli doctor wechat-miniprogram --output json
foxstore-cli doctor oppo --output json
foxstore-cli doctor honor --output json
foxstore-cli doctor xiaomi --output jsonApple richiede --issuer-id e --key-id; Google Play --package-name; vivo --package-name, con --endpoint opzionale per sostituire produzione. Tencent MyApp richiede anche variabili TENCENT_APPSTORE_APP_ID e TENCENT_APPSTORE_PACKAGE_NAME (string; doctor non ha argomenti equivalenti). Gli altri usano le proprie origini di credenziali. WeChat verifica solo origine della chiave, Node.js, miniprogram-ci e miniprogram-mp-ci, reperibili nei node_modules della cartella corrente o superiore; non verifica permessi remoti. Xiaomi consulta un pacchetto fisso di prova, senza sostituire status dell'app di destinazione.
Comandi e parametri di pubblicazione
Apple App Store
foxstore-cli publish apple \
--issuer-id "$APPLE_ISSUER_ID" --key-id "$APPLE_KEY_ID" \
--app-id 1234567890 --file ./build/App.ipa --output ndjsonString obbligatori: --issuer-id, --key-id, --app-id; path obbligatorio: --file, oltre alla variabile o al file della chiave privata. La CLI carica IPA con Build Upload API; il successo è { "provider": "apple", "buildUploadId": "…" }. Non richiede revisione App Store né garantisce che elaborazione Apple o distribuzione TestFlight siano concluse.
Google Play
foxstore-cli publish google-play \
--package-name com.example.app --file ./build/App.aab \
--track internal --release-status completed \
--release-notes-file ./release-notes.json --output ndjson| Parametro | Obbligatorio / predefinito | Descrizione |
|---|---|---|
--package-name, --file | string / path obbligatori | Nome pacchetto Play e percorso APK/AAB. |
--track | string, internal | Track di destinazione. |
--release-status | string, completed | Solo draft, inProgress, completed; non accetta halted. |
--user-fraction | f64 opzionale | Obbligatorio in inProgress, con 0 < valore < 1; vietato per altri stati. |
--release-name | string, stringa vuota | Nome della pubblicazione. |
--release-notes-file | path opzionale | Array JSON; ogni elemento richiede string language e text; se omesso, array vuoto. |
Esempio di release-notes.json:
[{ "language": "zh-CN", "text": "修复已知问题" }, { "language": "en-US", "text": "Bug fixes" }]Huawei AppGallery
foxstore-cli publish huawei \
--app-id 123456 --expected-package-name com.example.app \
--file ./build/App.app --submit true --timeout-seconds 240 --output ndjson| Parametro | Obbligatorio / predefinito | Descrizione |
|---|---|---|
--app-id, --expected-package-name, --file | string / string / path obbligatori | Supporta .app, .apk, .aab; credenziali e piattaforma del pacchetto devono corrispondere. |
--chinese-mainland-flag | i32 opzionale | Indicatore regionale di caricamento solo HarmonyOS: 0 o 1. |
--submit | valore bool, true | Se inviare alla pubblicazione dopo il caricamento. |
--release-time, --remark | string opzionali | Ora in yyyy-MM-ddTHH:mm:ssZZ; remark solo HarmonyOS, 10–300 caratteri se presente. |
--release-phase | i64, 0 | Solo HarmonyOS: 0 completa, 3 graduale. |
--phased-release-description | string opzionale | Solo HarmonyOS; obbligatorio nella fase 3, massimo 500 caratteri. |
--timeout-seconds | u64, 240 | Budget di polling compilazione solo Android, > 0; numero di query calcolato ogni circa 2 s, durata richieste esclusa. Non è un termine totale; HarmonyOS non lo usa. |
Pgyer
foxstore-cli publish pgyer \
--file ./build/App.ipa --update-description "CI build" \
--timeout-seconds 180 --output ndjson--file è path obbligatorio (IPA/APK/HAP); --build-type, string opzionale: ios/ipa, android/apk, harmonyos/hap, dedotto dall'estensione per default; --update-description, string opzionale; --timeout-seconds, u64, predefinito 180 e > 0, copre il termine totale di autenticazione, ticket, caricamento e polling.
Tencent MyApp
foxstore-cli publish tencent-appstore \
--package-name com.example.app --app-id 1000123 --file ./build/App.apk \
--release-notes "修复已知问题" --deploy-type 1 --output ndjson--package-name e --app-id sono string obbligatori; --file, path APK obbligatorio; --release-notes, string vuota per default; --deploy-type, i64 predefinito 1, valori 1/2 (programmato); --deploy-time, i64 opzionale, timestamp in secondi obbligatorio per tipo 2; --apk-64-only, interruttore bool false per default. Aggiorna app esistenti.
vivo
foxstore-cli publish vivo \
--package-name com.example.app --file ./build/App.apk --version-code 42 \
--online-type 1 --update-description "修复已知问题" --output ndjson--package-name è string obbligatorio; --file, path APK obbligatorio; --version-code, i64 obbligatorio. --online-type, i64 predefinito 1, accetta 1/2 (programmato); --scheduled-online-time, string opzionale obbligatorio per tipo 2; --update-description, string opzionale. --endpoint è string, predefinito https://developer-api.vivo.com.cn/router/rest; accetta solo l'alternativa https://sandbox-developer-api.vivo.com.cn/router/rest.
Samsung Galaxy Store
foxstore-cli publish samsung \
--content-id 000007654321 --file ./build/App.apk \
--uses-gms true --submit true --output ndjson--content-id è string obbligatorio e --file path APK obbligatorio. --uses-gms è valore bool opzionale (es. --uses-gms false); omettendolo conserva GMS del binario esistente. --release-at è i64 opzionale, timestamp Unix futuro in millisecondi, configurabile in questo aggiornamento solo se il contenuto è FOR_SALE. --submit è valore bool predefinito true; usa --submit false per caricare soltanto.
Mini programmi WeChat
foxstore-cli publish wechat-miniprogram \
--appid wx1234567890 --project-path ./miniprogram --version 1.2.3 \
--description "CI build" --robot 1 --output ndjson--appid e --version sono string obbligatori; --project-path, path obbligatorio; --description, string vuota per default; --robot, u8 opzionale, 1–30; --project-type, string predefinita miniProgram, valori miniProgram, miniProgramPlugin, miniGame, miniGamePlugin. Carica una versione di codice senza revisione o pubblicazione automatica; richiede Node.js e i due pacchetti npm precedenti.
OPPO / HeyTap
foxstore-cli publish oppo --request-file ./oppo-release.json --output ndjson--request-file è un path obbligatorio. Il file è un oggetto JSON di primo livello; questi sono tutti i campi, sensibili alle maiuscole.
| Campo | Tipo JSON / obbligatorio | Vincoli |
|---|---|---|
packageKind | string, obbligatorio | ordinary o multi; va indicato esplicitamente. |
apkFiles | object[], obbligatorio | Ogni elemento richiede string filePath e integer cpuCode; pacchetto ordinario: uno con cpuCode=0; multiplo: due, con 32 e 64. |
packageName, versionCode, appName | string, obbligatori | versionCode è un intero positivo come string e deve corrispondere al pacchetto. |
secondCategoryId, thirdCategoryId | integer, obbligatori | ID di categoria validi dello store. |
summary | string, obbligatorio | Massimo 13 caratteri, senza spazi o punteggiatura. |
detailDescription, updateDescription | string, obbligatori | Minimo 20 / 5 caratteri, rispettivamente. |
privacyPolicyUrl, iconUrl, copyrightUrl | string, obbligatori | URL di privacy, icona già caricata e materiali sul copyright. |
screenshotUrls | string[], obbligatorio | 2–5 URL di screenshot verticali già caricati. |
testDescription | string, obbligatorio | Note aggiuntive di test, non vuote. |
businessContactName, businessContactEmail, businessContactMobile | string, obbligatori | Contatto commerciale. |
ageLevel | integer, obbligatorio | Classificazione di età valida > 0. |
adaptiveEquipment | integer, obbligatorio | 4, 5 o 6. |
onlineType | integer, obbligatorio | 1 o 2 (programmato). |
scheduledOnlineTime | string, opzionale | Obbligatorio quando onlineType=2. |
landscapeScreenshotUrls | string[], opzionale | URL di screenshot orizzontali già caricati. |
icpUrl, specialCertificateUrl, specialCertificateFileUrl | string, opzionali | URL di registrazione o autorizzazioni speciali secondo i requisiti dell'app. |
adaptiveType | integer, opzionale | Tipo di adattamento. |
Esempio base: sostituisci categorie, URL delle risorse, contatti e classificazione con dati reali. apkFiles indica APK già compilati; la CLI non converte automaticamente immagini locali in URL remoti.
{
"packageKind": "ordinary",
"apkFiles": [{ "filePath": "./build/App.apk", "cpuCode": 0 }],
"packageName": "com.example.app", "versionCode": "42", "appName": "示例应用",
"secondCategoryId": 1, "thirdCategoryId": 1,
"summary": "便捷记录日常生活",
"detailDescription": "这是一款用于记录日常生活与管理个人事项的示例应用。",
"updateDescription": "修复已知问题并改善使用体验",
"privacyPolicyUrl": "https://example.com/privacy",
"iconUrl": "https://example.com/uploaded/icon.png",
"screenshotUrls": ["https://example.com/uploaded/1.png", "https://example.com/uploaded/2.png"],
"copyrightUrl": "https://example.com/uploaded/copyright.png",
"testDescription": "无需登录即可使用基础功能",
"businessContactName": "应用联系人", "businessContactEmail": "[email protected]",
"businessContactMobile": "13800000000", "ageLevel": 1,
"adaptiveEquipment": 4, "onlineType": 1
}HONOR App Market
foxstore-cli publish honor \
--app-id 123456 --package-name com.example.app --file ./build/App.apk \
--audit-file ./honor-audit.json --output ndjson--app-id è i64 obbligatorio; --package-name, string obbligatorio; --file (APK) e --audit-file, path obbligatori. Il JSON di revisione è un oggetto di primo livello:
| Campo | Tipo JSON / obbligatorio | Vincoli |
|---|---|---|
releaseType | integer, obbligatorio | 1 normale, 2 programmato, 3 graduale. |
forceUpdate | boolean, obbligatorio | Usa true/false, non numeri. |
testAccount, testPassword | string, opzionali | Account e password per revisione; CI deve creare temporaneamente file con password. |
testComment | string, opzionale | Massimo 500 caratteri. |
releaseTime | string, opzionale | Obbligatorio quando releaseType=2. |
phasedReleasePercentage | string, opzionale | Obbligatorio quando releaseType=3; valore > 0 e ≤ 100. |
phasedReleaseStart, phasedReleaseEnd | string, opzionali | Obbligatori quando releaseType=3. |
phasedReleaseNote | string, opzionale | Obbligatorio quando releaseType=3; massimo 500 caratteri. |
releaseNotesLanguage, releaseNotes | string, opzionali | releaseNotes non vuoto richiede ID lingua; massimo 500 caratteri. |
Usa yyyy-MM-ddTHH:mm:ssZZ, ad esempio 2026-10-01T09:00:00+0800. Pubblicazione normale minima in honor-audit.json:
{ "releaseType": 1, "forceUpdate": false }Xiaomi App Store
foxstore-cli publish xiaomi --request-file ./xiaomi-release.json --output ndjson--request-file è path obbligatorio. JSON è un oggetto di primo livello, senza involucro appInfo / RequestData:
| Campo | Tipo JSON / obbligatorio | Vincoli |
|---|---|---|
synchroType | integer, obbligatorio | 0 crea, 1 aggiorna versione, 2 aggiorna dati; soggetto ai permessi di account e app. |
appName, packageName, privacyUrl, iconPath | string, obbligatori | Non vuoti; iconPath è un percorso locale. |
publisherName, versionName | string, opzionali | Nome sviluppatore e versione. |
category, keyWords, description, brief | string, opzionali | Tutti obbligatori quando synchroType=0. |
updateDescription | string, opzionale | Obbligatorio quando synchroType=1. |
testAccount | string, opzionale | Stringa JSON serializzata; vedi sotto. |
onlineTime | integer, opzionale | Ora di pubblicazione. |
suitableType | integer, opzionale | 0, 1 o 2. |
apkPath | string, opzionale | Obbligatorio quando synchroType=0/1; APK locale. |
secondApkPath | string, opzionale | Secondo APK locale. |
screenshotPaths | string[], predefinito [] | Massimo 5; una nuova app richiede almeno 3 screenshot locali. |
tabletScreenshotPaths | string[], predefinito [] | Massimo 5; creazione con suitableType=1/2 richiede almeno 4. |
Esempio di aggiornamento xiaomi-release.json; i file devono esistere e rispettare i requisiti dell'app:
{
"synchroType": 1, "appName": "示例应用", "packageName": "com.example.app",
"privacyUrl": "https://example.com/privacy", "iconPath": "./store/icon.png",
"apkPath": "./build/App.apk", "updateDescription": "修复已知问题"
}testAccount è una stringa con JSON annidato codificato, es. "{\"zh_CN\":{\"auditNotes\":\"无需登录\"}}". Ogni chiave lingua corrisponde a un oggetto con auditNotes opzionale (massimo 500 caratteri) e array accounts (massimo 5). Ogni account è un oggetto con integer obbligatorio t (1 o 2) e string opzionali a (account), p (password), c (valore aggiuntivo), massimo 50 caratteri ciascuno; account e password vanno compilati o lasciati vuoti insieme. Non passare un oggetto JSON direttamente a testAccount.
Consultazione dello stato
La CI locale restituisce in modo sincrono l'esito dei caricamenti WeChat; non esiste status indipendente. Se sconosciuto, verifica nella console. Le altre consultazioni richiedono credenziali dello stesso provider. I parametri sono obbligatori salvo indicazione, con tipo string predefinito. Tutti gli status consultano una sola volta, senza attesa continua.
| Comando | Parametri |
|---|---|
status apple | --issuer-id, --key-id e origine della chiave; Build visibili in ordine di caricamento decrescente; senza filtro --app-id o ricerca diretta per buildUploadId. |
status google-play | --package-name; restituisce Tracks. |
status huawei | --app-id; HarmonyOS usa Service Account; Android usa API Client e almeno un --package-id ripetibile. |
status pgyer | --app-key; --build-key opzionale. |
status tencent-appstore | --package-name、--app-id。 |
status vivo | --package-name; --endpoint opzionale. |
status samsung | --content-id。 |
status oppo | --package-name; --version-code opzionale; aggiungi --multi-package per più pacchetti (interruttore bool, false per default). |
status honor | --app-id e uno o più --release-id (app-id i64; ogni release-id string, ripetibile). |
status xiaomi | --package-name。 |
Output strutturato e codici di uscita
schemaVersion è attualmente string "1". json è indentato; ndjson è una riga compatta. Entrambi emettono solo il risultato finale, senza flusso di avanzamento. L'envelope di successo va a stdout; quello di errore, inclusi argomenti, a stderr. Non analizzare solo stdout né mescolare entrambi in un file JSON.
Esempio di successo: caricamento Apple, non approvazione o pubblicazione:
{ "schemaVersion": "1", "status": "success", "data": { "provider": "apple", "buildUploadId": "example-upload-id" } }Esempio di errore, solo per mostrare la struttura:
{ "schemaVersion": "1", "status": "error", "error": { "code": "CLI_ARGUMENT_INVALID", "category": "input", "message": "缺少必填参数", "retryable": false } }data dipende dal comando: oggetto o array, senza garanzia del campo provider. error.code è string, category uno degli string fissi della tabella, message la spiegazione e retryable boolean. Vengono rimossi segreti e dati di autenticazione del provider; proteggi percorsi di input e testi aziendali del JSON secondo le regole dei log del team.
| Codice | Categoria | Gestione nella pipeline |
|---|---|---|
0 | Successo | Comando riuscito; valuta dati di verifica/pubblicazione, non significa approvazione o disponibilità nello store. |
2 | input: input o pacchetto errati | Correggi parametri o artefatti. |
3 | credential: credenziali errate | Verifica nomi dei Secret, file temporanei e permessi. |
4 | network: errore di rete | Riprova secondo le regole solo con retryable: true. |
5 | provider: rifiuto o risposta errata | Leggi il codice privo di dati sensibili e correggi permessi, materiali o stato della piattaforma. |
6 | unsupported: capacità non supportata | Non considerarlo un successo. |
7 | result-unknown: risultato sconosciuto | Potrebbe esserci stata una scrittura remota; riconcilia con status prima di ripetere la pubblicazione. |
10 | internal: errore interno CLI | Conserva versione e log senza dati sensibili e segnalalo. |
Limiti di tentativi e riconciliazione
Il codice 7 / result-unknown indica una possibile scrittura remota, normalmente con retryable: false. In Pgyer, un timeout prima del caricamento può restituire 4; dopo l'invio della richiesta restituisce 7. Esaurire il polling di compilazione Huawei Android dà anch'esso 7. È una classificazione nota, non garantisce un envelope completo per ogni interruzione. In caso di timeout del Runner, processo terminato o blackout, riconcilia prima.
Conserva versione del comando, hash dell'artefatto, app/pacchetto, versione, numero build e ID remoti restituiti. Confrontali con status; il codice 0 non dimostra che quella versione sia pubblicata. Apple richiede il confronto di app e Build nella lista, Google Play di Track e versionCodes; HONOR richiede releaseId e Huawei Android packageId. Se non hai ricevuto gli ID o la versione non compare ancora, verifica la console; non inventare ID né ripetere subito publish.
Non esistono comandi wait, cancel, reconcile, --timeout o --dry-run comuni a tutti i provider. Anche retryable: true non garantisce che ripetere publish sia sicuro; verifica se c'è già stata una scrittura remota. Consulta un esempio completo di iniezione dei Secret, conservazione dei risultati e gestione del fallimento nella Guida CI/CD.
