Referência CLI / API
foxstore-cli é a API de publicação não interativa do Fox Store para CI/CD. API significa aqui a interface do processo de linha de comando: parâmetros, arquivos, stdout/stderr e códigos de saída, sem serviço HTTP. É um executável único vinculado estaticamente ao foxstore-engine; não exige instalar ou iniciar o Desktop nem lê suas credenciais SQLite.
A CLI automatiza publicações na Apple, Google Play, Huawei, miniprogramas WeChat, Tencent MyApp, HONOR, Samsung, Pgyer, vivo, Xiaomi e OPPO. Armazenamento de objetos, avaliações, Analytics, gestão cotidiana de certificados, otimização de imagens e diagnóstico de IA permanecem no Engine e Desktop.
Comece pelo Guia CI/CD para integrar GitHub Actions, GitLab CI ou Jenkins e consulte os parâmetros aqui.
Formato global
foxstore-cli [--output human|json|ndjson] <command>| Parâmetro | Padrão | Descrição |
|---|---|---|
--output | human | human para terminal; json produz um resultado estruturado; ndjson, um resultado final compacto, sem eventos de progresso em tempo real. Pode vir antes ou depois do subcomando. |
--help | - | Mostra a ajuda atual do comando. |
--version | - | Mostra a versão do binário. |
--help / -h sempre produz texto de ajuda e --version / -V, texto de versão, sem envelope mesmo com formato estruturado. Para obter a versão estruturada, use version --output json.
Tipos usados: string, texto (IDs continuam strings); path, caminho local do Runner; i64 / i32, inteiros com sinal; u64 / u8, inteiros não negativos; f64, ponto flutuante. «Opcional» pode ser omitido sem valor padrão. Uma «flag» booleana usa só o nome; um «valor» booleano exige true ou false. Comandos publish e status herdam as credenciais do provedor.
Comandos básicos:
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 | Parâmetros | Resultado |
|---|---|---|
version | Nenhum | Retorna version e engineSchemaVersion. |
providers | Nenhum | Retorna provedores compilados no binário e disponibilidade. |
capabilities | Obrigatório --provider <string> | Retorna descrição, cliPublish e recursos excluídos, não um schema por comando. |
artifact inspect | Obrigatório --file <path> | Identifica tipo, tamanho e SHA-256 do artefato. |
preflight apple | Obrigatório --file <path> | Verifica um IPA Apple. |
preflight android | Obrigatório --file <path>; opcional --expected-package-name <string> | Verifica o pacote Android e, opcionalmente, seu nome. |
preflight huawei | Obrigatório --file <path> | Analisa apenas HarmonyOS .app; para APK/AAB Huawei use preflight android. |
providers lista os 15 provedores estáticos; armazenamento de objetos tem cliPublish: excluded. capabilities --provider aceita os IDs apple, google-play, huawei-appgallery, wechat-miniprogram, tencent-appstore, honor, samsung-galaxy-store, pgyer, vivo, xiaomi, oppo, aliyun, tencent-cloud, aws, minio. Os subcomandos Huawei e Samsung são huawei e samsung, não os IDs do catálogo.
artifact inspect identifica apenas tipo, tamanho e SHA-256, sem verificar assinaturas. preflight analisa localmente sem publicar; Apple pode retornar sucesso e código 0 com data.status: blocked: confira data.status == "ready" e data.checks[].blocksUpload. Trate também warnings Android conforme a política da equipe. publish apple repete a verificação e bloqueia pacotes blocked; passar não significa aceitação da loja.
Origem das credenciais
Secrets não são passados como argumentos comuns. *-env recebe o nome da variável e *-file um caminho temporário criado pelo CI; são mutuamente exclusivos para o mesmo segredo. Todos os *-env são string opcionais e *-file, path opcionais. Sem origem explícita, usam-se estas variáveis padrão.
| Provedor | Variável padrão | Parâmetros alternativos |
|---|---|---|
| Apple | APPLE_PRIVATE_KEY | --private-key-env / --private-key-file; Issuer ID e Key ID usam --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 |
| Miniprogramas 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 |
Na Apple, --issuer-id e --key-id são string obrigatórios para doctor/publish/status. Credenciais JSON recebem o documento completo, não uma string com seu caminho. Google/Huawei usam o JSON exportado; Samsung usa { "serviceAccountId": "…", "privateKey": "…", "accessToken": null } (dois primeiros string obrigatórios, accessToken string opcional). Preserve quebras PEM; não coloque segredos reais em argumentos, repositórios ou logs.
Preserve os nomes exportados dos campos JSON, sem converter tudo para camelCase:
| Credencial | Campos (string, obrigatórios salvo indicação) |
|---|---|
| Google Play | type fixo em 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 opcional. |
| Huawei Android API Client | client_id、client_secret。 |
| Samsung | serviceAccountId, privateKey; accessToken opcional. |
A CLI não lê automaticamente variáveis *_FILE; indique explicitamente, por exemplo, --private-key-file "$APPLE_KEY_FILE". As quatro origens Huawei são mutuamente exclusivas: doctor/status usa HarmonyOS Service Account por padrão; Android exige --android-api-client-env HUAWEI_ANDROID_API_CLIENT_JSON ou --android-api-client-file <path>. publish escolhe credenciais conforme .app / .apk|.aab; ainda recomendamos indicar a origem para evitar confusão.
Diagnóstico de conexão
doctor verifica credenciais, conexão do provedor ou ambiente local sem enviar ou submeter aplicativos. Normalmente faz requisições remotas; não é validação de parâmetros 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 exige --issuer-id e --key-id; Google Play, --package-name; vivo, --package-name, com --endpoint opcional para substituir produção. Tencent MyApp também exige variáveis TENCENT_APPSTORE_APP_ID e TENCENT_APPSTORE_PACKAGE_NAME (string; doctor não tem argumentos equivalentes). Os demais usam suas origens de credenciais. WeChat só verifica origem da chave, Node.js, miniprogram-ci e miniprogram-mp-ci, localizáveis nos node_modules do diretório atual ou superiores; não valida permissões remotas. Xiaomi consulta um pacote fixo de teste, sem substituir status do aplicativo de destino.
Comandos e parâmetros de publicação
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 obrigatórios: --issuer-id, --key-id, --app-id; path obrigatório: --file, além da variável ou arquivo de chave privada. A CLI envia IPA pela Build Upload API; o sucesso é { "provider": "apple", "buildUploadId": "…" }. Não solicita revisão da App Store nem garante que processamento Apple ou distribuição TestFlight tenham terminado.
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| Parâmetro | Obrigatório / padrão | Descrição |
|---|---|---|
--package-name, --file | string / path obrigatórios | Nome do pacote Play e caminho APK/AAB. |
--track | string, internal | Track de destino. |
--release-status | string, completed | Apenas draft, inProgress, completed; não aceita halted. |
--user-fraction | f64 opcional | Obrigatório em inProgress, com 0 < valor < 1; proibido em outros estados. |
--release-name | string, string vazia | Nome da publicação. |
--release-notes-file | path opcional | Array JSON; cada item exige string language e text; se omitido, array vazio. |
Exemplo de 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| Parâmetro | Obrigatório / padrão | Descrição |
|---|---|---|
--app-id, --expected-package-name, --file | string / string / path obrigatórios | Aceita .app, .apk, .aab; credenciais e plataforma do pacote devem corresponder. |
--chinese-mainland-flag | i32 opcional | Indicador regional de envio somente HarmonyOS: 0 ou 1. |
--submit | valor bool, true | Se deve submeter à publicação após enviar. |
--release-time, --remark | string opcionais | Horário em yyyy-MM-ddTHH:mm:ssZZ; remark somente HarmonyOS, 10–300 caracteres se informado. |
--release-phase | i64, 0 | Somente HarmonyOS: 0 completa, 3 em fases. |
--phased-release-description | string opcional | Somente HarmonyOS; obrigatório na fase 3, máximo 500 caracteres. |
--timeout-seconds | u64, 240 | Orçamento de polling de compilação somente Android, > 0; número de consultas calculado a cada cerca de 2 s, duração das requisições à parte. Não é prazo total; HarmonyOS não o usa. |
Pgyer
foxstore-cli publish pgyer \
--file ./build/App.ipa --update-description "CI build" \
--timeout-seconds 180 --output ndjson--file é path obrigatório (IPA/APK/HAP); --build-type, string opcional: ios/ipa, android/apk, harmonyos/hap, inferido da extensão por padrão; --update-description, string opcional; --timeout-seconds, u64, padrão 180 e > 0, cobre o prazo total de autenticação, ticket, envio 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 são string obrigatórios; --file, path APK obrigatório; --release-notes, string vazia por padrão; --deploy-type, i64 padrão 1, valores 1/2 (agendado); --deploy-time, i64 opcional, timestamp em segundos obrigatório para tipo 2; --apk-64-only, flag bool false por padrão. Atualiza aplicativos existentes.
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 obrigatório; --file, path APK obrigatório; --version-code, i64 obrigatório. --online-type, i64 padrão 1, aceita 1/2 (agendado); --scheduled-online-time, string opcional obrigatório para tipo 2; --update-description, string opcional. --endpoint é string, padrão https://developer-api.vivo.com.cn/router/rest; só aceita a 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 obrigatório e --file, path APK obrigatório. --uses-gms é valor bool opcional (ex.: --uses-gms false); ao omitir, mantém GMS do binário existente. --release-at é i64 opcional, timestamp Unix futuro em milissegundos, configurável nesta atualização apenas se o conteúdo estiver FOR_SALE. --submit é valor bool padrão true; use --submit false para apenas enviar.
Miniprogramas 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 são string obrigatórios; --project-path, path obrigatório; --description, string vazia por padrão; --robot, u8 opcional, 1–30; --project-type, string padrão miniProgram, valores miniProgram, miniProgramPlugin, miniGame, miniGamePlugin. Envia uma versão de código, sem revisão ou publicação automática; exige Node.js e os dois pacotes npm anteriores.
OPPO / HeyTap
foxstore-cli publish oppo --request-file ./oppo-release.json --output ndjson--request-file é um path obrigatório. O arquivo é um objeto JSON de nível superior; estes são todos os campos, sensíveis a maiúsculas.
| Campo | Tipo JSON / obrigatório | Restrições |
|---|---|---|
packageKind | string, obrigatório | ordinary ou multi; deve ser explícito. |
apkFiles | object[], obrigatório | Cada item exige string filePath e integer cpuCode; pacote comum: um com cpuCode=0; múltiplo: dois, com 32 e 64. |
packageName, versionCode, appName | string, obrigatórios | versionCode é um inteiro positivo como string e deve corresponder ao pacote. |
secondCategoryId, thirdCategoryId | integer, obrigatórios | IDs de categoria válidos da loja. |
summary | string, obrigatório | Máximo 13 caracteres, sem espaços ou pontuação. |
detailDescription, updateDescription | string, obrigatórios | Mínimo 20 / 5 caracteres, respectivamente. |
privacyPolicyUrl, iconUrl, copyrightUrl | string, obrigatórios | URLs de privacidade, ícone já enviado e materiais de direitos autorais. |
screenshotUrls | string[], obrigatório | 2–5 URLs de capturas verticais já enviadas. |
testDescription | string, obrigatório | Notas adicionais de teste, não vazias. |
businessContactName, businessContactEmail, businessContactMobile | string, obrigatórios | Contato comercial. |
ageLevel | integer, obrigatório | Classificação etária válida > 0. |
adaptiveEquipment | integer, obrigatório | 4, 5 ou 6. |
onlineType | integer, obrigatório | 1 ou 2 (agendado). |
scheduledOnlineTime | string, opcional | Obrigatório quando onlineType=2. |
landscapeScreenshotUrls | string[], opcional | URLs de capturas horizontais já enviadas. |
icpUrl, specialCertificateUrl, specialCertificateFileUrl | string, opcionais | URLs de registro ou autorizações especiais conforme requisitos do aplicativo. |
adaptiveType | integer, opcional | Tipo de adaptação. |
Exemplo base: substitua categorias, URLs de recursos, contatos e classificação por dados reais. apkFiles aponta para APKs já compilados; a CLI não converte automaticamente imagens locais em URLs remotas.
{
"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 obrigatório; --package-name, string obrigatório; --file (APK) e --audit-file, path obrigatórios. O JSON de revisão é um objeto de nível superior:
| Campo | Tipo JSON / obrigatório | Restrições |
|---|---|---|
releaseType | integer, obrigatório | 1 normal, 2 agendado, 3 em fases. |
forceUpdate | boolean, obrigatório | Use true/false, não números. |
testAccount, testPassword | string, opcionais | Conta e senha para revisão; CI deve criar temporariamente arquivos com senhas. |
testComment | string, opcional | Máximo 500 caracteres. |
releaseTime | string, opcional | Obrigatório quando releaseType=2. |
phasedReleasePercentage | string, opcional | Obrigatório quando releaseType=3; valor > 0 e ≤ 100. |
phasedReleaseStart, phasedReleaseEnd | string, opcionais | Obrigatórios quando releaseType=3. |
phasedReleaseNote | string, opcional | Obrigatório quando releaseType=3; máximo 500 caracteres. |
releaseNotesLanguage, releaseNotes | string, opcionais | releaseNotes não vazio exige ID de idioma; máximo 500 caracteres. |
Use yyyy-MM-ddTHH:mm:ssZZ, por exemplo 2026-10-01T09:00:00+0800. Publicação normal mínima em honor-audit.json:
{ "releaseType": 1, "forceUpdate": false }Xiaomi App Store
foxstore-cli publish xiaomi --request-file ./xiaomi-release.json --output ndjson--request-file é path obrigatório. JSON é um objeto de nível superior, sem wrapper appInfo / RequestData:
| Campo | Tipo JSON / obrigatório | Restrições |
|---|---|---|
synchroType | integer, obrigatório | 0 criar, 1 atualizar versão, 2 atualizar dados; sujeito a permissões de conta e aplicativo. |
appName, packageName, privacyUrl, iconPath | string, obrigatórios | Não vazios; iconPath é um caminho local. |
publisherName, versionName | string, opcionais | Nome do desenvolvedor e versão. |
category, keyWords, description, brief | string, opcionais | Todos obrigatórios quando synchroType=0. |
updateDescription | string, opcional | Obrigatório quando synchroType=1. |
testAccount | string, opcional | String JSON serializada; veja abaixo. |
onlineTime | integer, opcional | Horário de publicação. |
suitableType | integer, opcional | 0, 1 ou 2. |
apkPath | string, opcional | Obrigatório quando synchroType=0/1; APK local. |
secondApkPath | string, opcional | Segundo APK local. |
screenshotPaths | string[], padrão [] | Máximo 5; aplicativo novo exige pelo menos 3 capturas locais. |
tabletScreenshotPaths | string[], padrão [] | Máximo 5; ao criar com suitableType=1/2 exige pelo menos 4. |
Exemplo de atualização xiaomi-release.json; os arquivos devem existir e atender aos requisitos do aplicativo:
{
"synchroType": 1, "appName": "示例应用", "packageName": "com.example.app",
"privacyUrl": "https://example.com/privacy", "iconPath": "./store/icon.png",
"apkPath": "./build/App.apk", "updateDescription": "修复已知问题"
}testAccount é uma string com JSON aninhado codificado, ex.: "{\"zh_CN\":{\"auditNotes\":\"无需登录\"}}". Cada chave de idioma corresponde a um objeto com auditNotes opcional (máximo 500 caracteres) e array accounts (máximo 5). Cada conta é um objeto com integer obrigatório t (1 ou 2) e string opcionais a (conta), p (senha), c (valor adicional), máximo 50 caracteres cada; conta e senha devem ser preenchidas ou deixadas vazias juntas. Não passe um objeto JSON diretamente para testAccount.
Consulta de status
A CI local retorna sincronamente o resultado de envios WeChat; não existe status independente. Se desconhecido, verifique no console. As demais consultas exigem credenciais do mesmo provedor. Parâmetros são obrigatórios salvo indicação, com tipo string padrão. Todos os status consultam uma vez, sem espera contínua.
| Comando | Parâmetros |
|---|---|
status apple | --issuer-id, --key-id e origem da chave; Builds visíveis em ordem decrescente de envio; sem filtro --app-id ou consulta direta por buildUploadId. |
status google-play | --package-name; retorna Tracks. |
status huawei | --app-id; HarmonyOS usa Service Account; Android usa API Client e ao menos um --package-id repetível. |
status pgyer | --app-key; --build-key opcional. |
status tencent-appstore | --package-name、--app-id。 |
status vivo | --package-name; --endpoint opcional. |
status samsung | --content-id。 |
status oppo | --package-name; --version-code opcional; adicione --multi-package para múltiplos pacotes (flag bool, false por padrão). |
status honor | --app-id e um ou mais --release-id (app-id i64; cada release-id string, repetível). |
status xiaomi | --package-name。 |
Saída estruturada e códigos de saída
schemaVersion é atualmente string "1". json tem indentação; ndjson é uma linha compacta. Ambos emitem apenas o resultado final, sem fluxo de progresso. O envelope de sucesso vai para stdout; o de erro, inclusive argumentos, para stderr. Não analise só stdout nem misture ambos em um arquivo JSON.
Exemplo de sucesso: envio Apple, não aprovação ou publicação:
{ "schemaVersion": "1", "status": "success", "data": { "provider": "apple", "buildUploadId": "example-upload-id" } }Exemplo de erro, apenas para mostrar a estrutura:
{ "schemaVersion": "1", "status": "error", "error": { "code": "CLI_ARGUMENT_INVALID", "category": "input", "message": "缺少必填参数", "retryable": false } }data depende do comando: objeto ou array, sem garantia do campo provider. error.code é string, category uma das strings fixas da tabela, message a explicação e retryable boolean. Segredos e dados de autenticação do provedor são removidos; proteja caminhos de entrada e textos de negócio do JSON conforme a política de logs da equipe.
| Código | Categoria | Tratamento no pipeline |
|---|---|---|
0 | Sucesso | Comando bem-sucedido; avalie dados de verificação/publicação, não significa aprovação ou disponibilidade na loja. |
2 | input: entrada ou pacote incorretos | Corrija parâmetros ou artefatos. |
3 | credential: credenciais incorretas | Confira nomes de Secret, arquivos temporários e permissões. |
4 | network: erro de rede | Tente novamente conforme a política apenas com retryable: true. |
5 | provider: rejeição ou resposta incorreta | Leia o código sem dados sensíveis e corrija permissões, materiais ou status da plataforma. |
6 | unsupported: recurso não suportado | Não considere sucesso. |
7 | result-unknown: resultado desconhecido | Pode ter ocorrido gravação remota; concilie com status antes de repetir a publicação. |
10 | internal: erro interno CLI | Preserve versão e logs sem dados sensíveis e informe. |
Limites de novas tentativas e conciliação
O código 7 / result-unknown indica possível gravação remota, normalmente com retryable: false. No Pgyer, timeout antes do envio pode retornar 4; após enviar a requisição, retorna 7. Esgotar o polling de compilação Huawei Android também dá 7. É uma classificação conhecida, não garante envelope completo em toda interrupção. Em timeout do Runner, término do processo ou queda de energia, concilie primeiro.
Preserve versão do comando, hash do artefato, aplicativo/pacote, versão, número do build e IDs remotos retornados. Compare-os com status; o código 0 não prova que aquela versão foi publicada. Apple exige conferir aplicativo e Build na lista, Google Play Track e versionCodes; HONOR precisa de releaseId e Huawei Android de packageId. Se não recebeu os IDs ou a versão ainda não aparece, confira o console; não invente IDs nem repita publish imediatamente.
Não há comandos wait, cancel, reconcile, --timeout ou --dry-run comuns a todos os provedores. retryable: true também não garante que repetir publish seja seguro; verifique se já houve gravação remota. Veja um exemplo completo de injeção de Secret, preservação de resultados e falha de pipeline no Guia CI/CD.
