CI/CD интеграция
import { Tabs, TabItem } from ‘@astrojs/starlight/components’;
Интегрируйте загрузку билдов в ваш CI/CD пайплайн. Uply предоставляет готовые шаблоны для популярных платформ.
Как это работает
Каждая интеграция выполняет 3 шага:
- Установка — скачивает
upcliнужной версии - Загрузка — вызывает
upcli upload --jsonс параметрами - Вывод — пробрасывает результат (
build_id,platform,status) в outputs пайплайна
Создание CLI-токена
- Откройте Uply Console
- Перейдите в Настройки проекта → CLI-токены
- Создайте токен с правом
UPLOAD_BUILDS - Сохраните токен в секретах вашей CI/CD платформы
Платформы
Используйте готовый Composite Action:
- uses: uply-dev/cli-templates@v1 with: cli-token: ${{ secrets.UPLY_CLI_TOKEN }} file: app/build/outputs/apk/release/app-release.apkПараметры
| Параметр | Обязателен | Описание | По умолчанию |
|---|---|---|---|
cli-token | да | Токен uply_* | — |
file | да | Путь к .apk / .ipa | — |
channel | нет | ID канала | из токена |
name | нет | Название билда | — |
description | нет | Описание билда | — |
version | нет | Версия upcli | latest |
base-url | нет | URL API | https://api.getuply.io |
Outputs
| Output | Описание |
|---|---|
build-id | ID загруженного билда |
platform | ANDROID / IOS |
status | UPLOADED |
Полный пример
name: Upload to Uply
on: push: tags: ['v*']
jobs: upload: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
# ... ваши шаги сборки ...
- name: Upload to Uply id: uply uses: uply-dev/cli-templates@v1 with: cli-token: ${{ secrets.UPLY_CLI_TOKEN }} file: app/build/outputs/apk/release/app-release.apk name: "${{ github.ref_name }}"
- name: Print result run: echo "Build ID: ${{ steps.uply.outputs.build-id }}"Подключите готовый шаблон через include:
include: - remote: 'https://getuply.io/ci/gitlab.yml'
upload_to_uply: stage: deploy extends: .uply-upload variables: UPLY_FILE: "app/build/outputs/apk/release/app-release.apk"Переменные
| Переменная | Обязательна | Описание |
|---|---|---|
CLI_TOKEN | да | Токен uply_* (из CI/CD Variables, masked) |
UPLY_FILE | да | Путь к .apk / .ipa |
UPLY_CHANNEL | нет | ID канала |
UPLY_BUILD_NAME | нет | Название билда |
UPLY_BUILD_DESCRIPTION | нет | Описание билда |
Outputs
После выполнения job’а доступны переменные (через dotenv artifact):
-
UPLY_BUILD_ID -
UPLY_PLATFORM -
UPLY_STATUS
GitVerse использует GitHub Actions-совместимый формат. Подключение аналогично GitHub Actions:
- uses: uply-dev/cli-templates@v1 with: cli-token: ${{ secrets.UPLY_CLI_TOKEN }} file: app/build/outputs/apk/release/app-release.apkGitflic не поддерживает переиспользуемые шаблоны. Скопируйте пример в .gitflic-ci.yml:
stages: - upload
upload_build: stage: upload image: alpine:latest script: - apk add --no-cache curl jq - curl -fsSL https://getuply.io/install.sh | sh - | upcli upload \ --cli-token "$CLI_TOKEN" \ --file "$APK_PATH" \ --name "v${CI_COMMIT_TAG}" \ --json > uply-result.json artifacts: paths: - uply-result.jsonСкопируйте сниппет в ваш Jenkinsfile:
pipeline { agent any environment { UPLY_CLI_TOKEN = credentials('uply-cli-token') } stages { stage('Upload to Uply') { steps { sh 'curl -fsSL https://getuply.io/install.sh | sh' sh """ upcli upload \ --cli-token \${UPLY_CLI_TOKEN} \ --file app/build/outputs/apk/release/app-release.apk \ --name "v\${BUILD_NUMBER}" \ --json > uply-result.json """ } post { success { archiveArtifacts artifacts: 'uply-result.json' } } } }}Токен хранится в Jenkins Credentials как Secret text.
Troubleshooting
Error: unauthorized / 401
- Проверьте что токен начинается с
uply_ - Убедитесь что токен добавлен в секреты CI/CD платформы
- Проверьте что у токена есть право
UPLOAD_BUILDS
Error: file not found
- Проверьте путь к файлу — он должен быть относительным от корня репозитория
- Убедитесь что шаг сборки выполнился до шага загрузки
- Проверьте формат: только
.apkи.ipa
Error: download failed (HTTP 404)
- Проверьте версию
upcli— возможно указана несуществующая версия - Используйте
version: latest(по умолчанию)
Error: request timeout
- Файл может быть слишком большим (лимит 1 ГБ)
- Проверьте сетевое соединение runner’а
upcliавтоматически повторяет запросы при временных ошибках (до 3 раз)