Мобильный телефон или планшет можно использовать как полноценную «лабораторию» для проверки пайплайнов, сборок, упаковки артефактов и динамического развёртывания тестовых сред. Termux даёт удобную оболочку Linux-подобной среды, где реально поднять GitLab Runner и запускать сборки под ваш проект.
Важно: в данной статье акцент на локальную/тестовую инфраструктуру и корректное развёртывание в рамках вашей среды. Никаких обходов ограничений и «скрытых» сценариев здесь нет.
Архитектура решения
Рассмотрим типовую схему:
- Termux — устройство, на котором работает GitLab Runner (с Docker либо без него — по ситуации).
- Артефакт‑хранилище — куда сохраняются собранные пакеты/билды (варианты: MinIO/S3-compatible в локальной сети, локальная файловая «витрина» через HTTP, либо GitLab Package Registry — если вам подходит).
- Динамический деплой — создание/обновление окружения под конкретный job/branch (например, через docker-compose на локальной машине, Kubernetes в лаборатории или через запуск скриптов развёртывания на тестовом сервере).
Так вы получаете поток: push → пайплайн GitLab → сборка на Termux → публикация артефактов → развёртывание тестовой среды.
Предварительные требования
- Android-устройство (или другое устройство, поддерживающее Termux).
- Доступ к сети в рамках вашей инфраструктуры.
- Учётная запись в GitLab и проект с включённым CI.
- Для артефакт‑хранилища: либо локальный S3-compatible сервис (например, MinIO), либо иной совместимый вариант.
- Для динамического деплоя: целевая тестовая площадка (сервер/VM или локальная среда), куда будут развёртываться сервисы.
Подготовка Termux
Начнём с базовой подготовки пакетов. Обновите систему, установите зависимости и утилиты сборки.
pkg update && pkg upgrade -y
pkg install -y git curl wget tar unzip jq openssh rsync proot-distro clang makeДля GitLab Runner обычно понадобится bash и ca-certificates. Их часто хватает из базовых пакетов, но на всякий случай можно добавить:
pkg install -y bash ca-certificatesДалее — настройка переменных среды и удобного пути.
mkdir -p ~/ci/workspace ~/ci/artifacts ~/ci/logs
export CI_HOME=~/ci
cd ~GitLab Runner в Termux
Есть два подхода:
- Runner как бинарник (предпочтительно, если вы можете собрать/достать подходящую сборку под архитектуру устройства).
- Runner в контейнере (например, через Docker/Podman, если они доступны в вашей среде).
На практике чаще используют первый вариант: скачивают бинарник Runner и регистрируют его в GitLab.
Шаг 1. Установка GitLab Runner
Устройство может иметь архитектуру ARM. Под неё нужно получить бинарник GitLab Runner. Проверьте архитектуру:
uname -mДальше — скачайте релиз GitLab Runner, подходящий для вашей архитектуры. Пример ниже показывает общий принцип (подставьте верную ссылку из релизов GitLab Runner).
cd ~/ci
# Пример: скачивание конкретной версии (уточните URL под вашу архитектуру)
curl -L -o gitlab-runner "https://gitlab-runner-downloads.example.com/vX.Y.Z/binaries/gitlab-runner-android-arm64"
chmod +x gitlab-runner
./gitlab-runner --versionЕсли у вас нет готового бинарника под вашу архитектуру, лучше заранее продумать способ получения (например, собрать Runner в собственной среде). Но в рамках статьи ограничимся установкой готового релиза.
Шаг 2. Регистрация Runner в GitLab
В GitLab откройте: Settings → CI/CD → Runners. Создайте Runner (или получите Registration Token) и выберите тип (обычно shell или custom).
В Termux зарегистрируйте Runner:
mkdir -p ~/ci/gitlab-runner
cd ~/ci/gitlab-runner
# Запуск регистрации
~/ci/gitlab-runner registerДальше GitLab предложит ввести параметры:
- GitLab URL (ваш домен GitLab).
- Token (registration token).
- Description (например, termux-runner-01).
- Tags (например, termux, mobile, shell).
- Executor (часто shell).
Если выбран shell, то Runner будет выполнять job-команды прямо в Termux. Это просто и удобно для тестовых задач.
Шаг 3. Запуск Runner
После регистрации запустите Runner в фоне. В зависимости от ваших возможностей используйте screen/tmux или запуск через nohup.
nohup ~/ci/gitlab-runner run --working-directory ~/ci/workspace --config ~/ci/gitlab-runner/config.toml > ~/ci/logs/runner.log 2>&1 &Проверьте логи:
tail -n 100 ~/ci/logs/runner.logНастройка пайплайна: сборка и подготовка артефактов
Допустим, у вас есть приложение, которое собирается в артефакт (например, .jar, .apk, .zip) и публикуется в хранилище. В GitLab обычно это оформляют через stages, artifacts или через публикацию в внешнее хранилище.
Если вы хотите отдельное артефакт‑хранилище (S3-compatible), то лучше публиковать туда явно, чтобы затем использовать для деплоя и откатов.
Пример .gitlab-ci.yml: сборка + публикация артефакта
Ниже — концептуальный пример. Подставьте свои команды сборки и адреса хранилища.
stages:
- build
- publish
- deploy
variables:
ARTIFACT_NAME: "app-${CI_COMMIT_REF_SLUG}-${CI_PIPELINE_IID}.zip"
ARTIFACT_PATH: "dist/${ARTIFACT_NAME}"
build_job:
stage: build
tags:
- termux
- shell
script:
- echo "Сборка проекта на Termux..."
- mkdir -p dist
- # Пример: ваша команда сборки
- # ./build.sh
- echo "dummy content" > "dist/app-${CI_COMMIT_REF_SLUG}-${CI_PIPELINE_IID}.zip"
- ls -lah dist
artifacts:
when: on_success
expire_in: 7 days
paths:
- dist/.zip
publish_job:
stage: publish
tags:
- termux
- shell
script:
- echo "Публикация артефакта в хранилище..."
- test -f "${ARTIFACT_PATH}"
- # Замените на вашу S3-compatible публикацию. Вариант через curl/HTTP или s3cmd/awscli.
- curl -f -X PUT "http://MINIO_LOCAL:9000/artifacts/${CI_COMMIT_REF_SLUG}/${ARTIFACT_NAME}"
-H "X-Auth-Token: ${ARTIFACT_TOKEN}"
--upload-file "${ARTIFACT_PATH}"
dependencies:
- build_jobКлючевые моменты:
- tags позволяют направлять job именно на ваш Termux Runner.
- artifacts в GitLab дают временное хранение для удобства.
- publish_job выгружает артефакт в внешнее хранилище для деплоя и контроля версий.
Артефакт‑хранилище: практические варианты
Вариантов несколько. Выбор зависит от того, где вы хотите хранить артефакты и как обеспечить адресность для деплоя.
Вариант A: локальный S3-compatible (например, MinIO)
Это удобно тем, что API стандартное, легко интегрировать с CI, а данные можно держать в локальной сети.
Если вы используете S3-compatible, держите в секрете токены/ключи в GitLab CI/CD Variables (masked, protected — по необходимости).
Вариант B: HTTP-доступная «витрина» артефактов
Если у вас нет готового S3, можно поднять простой сервер, который принимает PUT-загрузки и отдаёт файлы по URL. Тогда depoy будет скачивать артефакт по ссылке.
Вариант C: GitLab Package/Registry
Этот вариант проще организационно, если вам хватает встроенного подхода GitLab. Однако для «динамического деплоя» с явными ссылками внешнего вида часто удобнее использовать единое артефакт‑хранилище в локальной инфраструктуре.
Динамический деплой: как делать по месту
Под «динамическим деплоем» обычно понимают развёртывание окружений на основе ветки/переименования, инкремента или переменных pipeline.
Рассмотрим схему, где есть целевой сервер/машина (например, dev-host в вашей лаборатории) и на ней запускается docker-compose или аналогичный механизм. Терминология «динамический» означает, что имя контейнера/стека или переменные конфигурации создаются из параметров CI.
Пример: deploy_job с скачиванием артефакта
В этом примере deploy выполняется на том же Runner (Termux). Если ваш деплой должен происходить на отдельном сервере, то deploy-команда может быть SSH-командой на сервер.
deploy_job:
stage: deploy
tags:
- termux
- shell
script:
- echo "Деплой в тестовое окружение..."
- export ENV_NAME="test-${CI_COMMIT_REF_SLUG}"
- export DEPLOY_URL="http://MINIO_LOCAL:9000/artifacts/${CI_COMMIT_REF_SLUG}/${ARTIFACT_NAME}"
- echo "Окружение: ${ENV_NAME}"
- echo "Артефакт: ${DEPLOY_URL}"
- mkdir -p ~/ci/deploy
- cd ~/ci/deploy
- curl -f -L "${DEPLOY_URL}" -o "${ARTIFACT_NAME}"
- # Пример: загрузка и запуск через ваш скрипт деплоя
- # ./deploy.sh --env "${ENV_NAME}" --artifact "${ARTIFACT_NAME}"
- echo "Выполнить развёртывание для ${ENV_NAME} из ${ARTIFACT_NAME}"
rules:
- if: '$CI_COMMIT_BRANCH'
when: manualДобавьте правила rules, чтобы деплой запускался вручную или только для определённых веток (master/main, develop или тэгов).
Деплой на удалённую тестовую машину (рекомендуемый практический подход)
Часто Termux не должен «сам» разворачивать весь стек, а только инициировать деплой на сервере. Тогда используйте SSH на вашу тестовую машину в локальной сети.
Сценарий:
- Runner скачивает артефакт или сразу передаёт URL.
- Runner выполняет SSH-команды на сервере.
- Сервер скачивает артефакт из хранилища и перезапускает сервис.
Пример с SSH (концептуальный):
deploy_job_remote:
stage: deploy
tags:
- termux
- shell
script:
- export ENV_NAME="test-${CI_COMMIT_REF_SLUG}"
- export ARTIFACT_URL="http://MINIO_LOCAL:9000/artifacts/${CI_COMMIT_REF_SLUG}/${ARTIFACT_NAME}"
- echo "Инициируем удалённый деплой для ${ENV_NAME}"
- ssh -o StrictHostKeyChecking=no "${DEPLOY_USER}@DEPLOY_HOST" "bash -lc 'REMOTE_ENV_NAME="${ENV_NAME}" REMOTE_ARTIFACT_URL="${ARTIFACT_URL}" /opt/deploy/deploy.sh'"
rules:
- if: '$CI_COMMIT_BRANCH'
when: manualВ GitLab задайте переменные DEPLOY_USER, DEPLOY_HOST и при необходимости ключи/пароли. Пароли лучше не хранить в открытом виде: используйте SSH-ключи и GitLab CI/CD variables.
Если нужен VPN: только для создания локальной сети
В случаях, когда вы хотите подключить мобильное устройство к тестовой сети «как к локальной», можно использовать VPN для создания локальной сети (например, site-to-site или device-to-site), чтобы Runner видел хранилище артефактов и деплой-хост. Не используйте VPN для обхода блокировок — это предмет отдельной политики и рисков.
Секреты и безопасность
- Держите токены артефакт‑хранилища в CI/CD Variables в GitLab.
- Используйте masked и protected где это уместно.
- Ограничивайте доступ к arтефакт‑хранилищу (в идеале — только из вашей сети).
- Логи Runner и job-вывод не должны содержать ключи.
Надёжность: повторяемость и чистота окружения
Чтобы пайплайны не «засоряли» устройство, используйте:
- Очистку временных каталогов после job.
- Проверку доступности хранилища и деплой-хоста (health checks).
- Отдельные директории под pipeline (через
CI_PIPELINE_IID).
Пример очистки:
after_script:
- echo "Чистка рабочего каталога..."
- rm -rf ~/ci/deploy/Заключение
Вы можете построить рабочую CI/CD инфраструктуру на мобильном устройстве: поднять GitLab Runner в Termux, публиковать собранные артефакты в локальное артефакт‑хранилище и выполнять динамический деплой тестовых окружений на основе параметров пайплайна. Такой подход хорошо подходит для лабораторных стендов, быстрых итераций и отладки пайплайнов.
Если хотите, мы в РыбинскЛАБ поможем спроектировать вашу схему CI/CD, подобрать артефакт‑хранилище и написать деплой-скрипты под вашу инфраструктуру (включая интеграцию Termux/GitLab Runner и настройку переменных/секретов).