CI Runner образы для Forgejo
Find a file
CaviCode 8956b8983b
All checks were successful
build-runner-images / build (docker) (push) Successful in 2m20s
build-runner-images / build (deploy) (push) Successful in 4m22s
build-runner-images / build (node) (push) Successful in 3m25s
build-runner-images / build (go) (push) Successful in 7m43s
build-runner-images / build (rust) (push) Successful in 2m51s
build-runner-images / build (dotnet) (push) Successful in 14m31s
build-runner-images / build-android (push) Successful in 13m40s
build-runner-images / build-flutter (push) Successful in 35m44s
Добавлен полный Perl для Flutter runner
2026-09-19 00:23:23 +03:00
.forgejo Добавлен Flutter runner для сборок клиента 2026-09-12 01:30:37 +03:00
Changelog.md Добавлен полный Perl для Flutter runner 2026-09-19 00:23:23 +03:00
Dockerfile.android Update Dockerfile.android 2026-08-11 13:18:09 +03:00
Dockerfile.deploy fix(deploy): add nodejs for GitHub actions/download-artifact@v3 2026-06-25 09:49:15 +03:00
Dockerfile.docker feat(docker): add Node.js 22 for Forgejo Actions JS-actions support 2026-06-27 00:53:27 +03:00
Dockerfile.dotnet Добавлены artifact-actions (upload/download), Node.js в runner:dotnet, registry-cache в docker-build-push 2026-08-05 17:57:51 +03:00
Dockerfile.flutter Добавлен полный Perl для Flutter runner 2026-09-19 00:23:23 +03:00
Dockerfile.go fix(docker): add docker-cli to runner:go image 2026-06-24 23:46:45 +03:00
Dockerfile.node fix: install Java/Docker/Node from tarballs (not in ALT Linux P11 repos) 2026-06-24 19:56:28 +03:00
Dockerfile.rust refactor: switch runner images to ALT Linux p11/buildpack-deps 2026-06-24 17:52:58 +03:00
README.md Добавлен полный Perl для Flutter runner 2026-09-19 00:23:23 +03:00

CaviCode CI Runner

Кастомные Docker-образы для Forgejo runner на 192.168.1.40.

Все образы используют ALT Linux p11 и RPM-пакеты через apt-get.

Образы

Образ Метка Размер Инструменты
cavicode/runner:deploy deploy ~32MB bash, ssh, rsync, sshpass
cavicode/runner:dotnet dotnet ~1.5GB .NET 8/9/10, Java 21, Node.js, Python, Git, ssh, rsync, sshpass, docker-cli
cavicode/runner:go go ~430MB Go 1.24, Node.js, Python, Git, ssh, rsync, sshpass, docker-cli
cavicode/runner:rust rust ~600MB Rust (stable), rustfmt, clippy, Node.js, Python, Git, ssh, rsync, sshpass, docker-cli
cavicode/runner:node node ~180MB Node.js 22, npm, Python, Git, ssh, rsync, sshpass, docker-cli
cavicode/runner:docker docker ~300MB Docker CLI + buildx, Node.js 22, Git, ssh, rsync, sshpass
cavicode/runner:android android ~5GB .NET 8/9/10, Java 21, Android SDK 36 + NDK 28 + CMake 3.31, Rust + cargo-ndk, Conan 2, Node.js, Python, Git, ssh, rsync, sshpass, docker-cli
cavicode/runner:flutter docker Android + Flutter Flutter 3.47.2/Dart 3.13.2, Android SDK 34/35/36 + NDK 28.2, Linux GTK/media/tray stack, .NET 8/10, Node.js, Ruby, PowerShell и полный Perl toolchain OpenSSL

Сборка

docker build -t cavicode/runner:deploy   -f Dockerfile.deploy  .
docker build -t cavicode/runner:dotnet   -f Dockerfile.dotnet  .
docker build -t cavicode/runner:go       -f Dockerfile.go      .
docker build -t cavicode/runner:rust     -f Dockerfile.rust    .
docker build -t cavicode/runner:node     -f Dockerfile.node    .
docker build -t cavicode/runner:docker   -f Dockerfile.docker  .
docker build -t cavicode/runner:android  -f Dockerfile.android .
docker build -t cavicode/runner:flutter  -f Dockerfile.flutter .

Передача на CI-сервер

docker save cavicode/runner:deploy cavicode/runner:dotnet cavicode/runner:go cavicode/runner:rust cavicode/runner:node cavicode/runner:docker cavicode/runner:android cavicode/runner:flutter \
  | gzip > /tmp/all-images.tar.gz
scp /tmp/all-images.tar.gz root@192.168.1.40:/tmp/
ssh root@192.168.1.40 "docker load < /tmp/all-images.tar.gz"

Конфигурация runner

Метки в /data/config.yml контейнера forgejo-runner:

labels:
  - "docker:docker://catthehacker/ubuntu:act-latest"
  - "deploy:docker://cavicode/runner:deploy"
  - "dotnet:docker://cavicode/runner:dotnet"
  - "go:docker://cavicode/runner:go"
  - "rust:docker://cavicode/runner:rust"
  - "node:docker://cavicode/runner:node"
  - "docker:docker://cavicode/runner:docker"
  - "android:docker://cavicode/runner:android"

После изменения конфига: docker restart forgejo-runner

Actions

Кастомные Forgejo Actions в .forgejo/actions/:

  • Composite-actions (bash, без внешних зависимостей): checkout, docker-login, docker-setup-buildx, docker-build-push, setup-go, setup-node, ssh.
  • Node20-actions (форк forgejo/upload-artifact/download-artifact, pre-built bundle, без npm-зависимостей): upload-artifact, download-artifact. Требуют Node.js в runner-образе (есть в runner:node, runner:docker, runner:dotnet).
Action Заменяет Описание
checkout actions/checkout@v4 Клонирование репозитория через переданный токен, без сети github.com
docker-login docker/login-action docker login в registry через --password-stdin
docker-setup-buildx docker/setup-buildx-action Создаёт/использует buildx-билдер cavicode-builder
docker-build-push docker/build-push-action docker buildx build с тегами, build-args, кэшем и push
setup-go actions/setup-go@v5 Установка Go SDK из go.dev
setup-node actions/setup-node@v4 Установка Node.js из nodejs.org
ssh appleboy/ssh-action SSH-деплой: ключ или пароль (sshpass), set -euo pipefail по умолчанию. Использовать с cavicode/runner:deploy
upload-artifact forgejo/upload-artifact@v4 Загрузка артефакта (zip) для передачи между jobs. Node20-action, pre-built bundle
download-artifact forgejo/download-artifact@v4 Скачивание ранее загруженного артефакта. Node20-action, pre-built bundle

Важно: composite-actions не имеют доступа к контексту secrets вызывающего репозитория (ограничение Forgejo/GitHub Actions). Поэтому checkout требует обязательный input token: ${{ secrets.GITHUB_TOKEN }} — передавайте его явно из каждого workflow через with:. То же касается любых секретов для других actions (docker-login, ssh) — они должны прокидываться через with:, а не читаться из secrets внутри action.yml.

Подключение из другого репозитория (пример для ssh):

- uses: https://git.cavicode.tech/CaviCode/CaviCode-Runner/.forgejo/actions/ssh@main
  with:
    host: ${{ secrets.SSH_HOST }}
    username: ${{ secrets.SSH_USER }}
    key: ${{ secrets.SSH_PRIVATE_KEY }}
    port: ${{ secrets.SSH_PORT }}
    script: |
      echo "deploy"

Использование в workflow

Образы публикуются в git.cavicode.tech/cavicode/runner:*. Runner pull-ит их автоматически.

jobs:
  build-dotnet:
    runs-on: docker
    container: git.cavicode.tech/cavicode/runner:dotnet

  build-go:
    runs-on: docker
    container: git.cavicode.tech/cavicode/runner:go

  build-rust:
    runs-on: docker
    container: git.cavicode.tech/cavicode/runner:rust

  build-node:
    runs-on: docker
    container: git.cavicode.tech/cavicode/runner:node

  build-docker:
    runs-on: docker
    container: git.cavicode.tech/cavicode/runner:docker

  build-android:
    runs-on: docker
    container: git.cavicode.tech/cavicode/runner:android

  build-flutter:
    runs-on: docker
    container: git.cavicode.tech/cavicode/runner:flutter

  deploy:
    runs-on: docker
    container: git.cavicode.tech/cavicode/runner:deploy

CI

Workflow .forgejo/workflows/build-images.yml автоматически собирает и публикует образы при изменении Dockerfile.*. runner:flutter собирается после runner:android; build jobs используют label docker.

runner:flutter заранее устанавливает SDK Platforms 34 и 35, нужные закреплённым Flutter plugins, в дополнение к API 36 приложения. Gradle не должен распаковывать эти SDK в writable layer каждого job. Это уменьшает расход места во время сборки, но не заменяет достаточный свободный объём на Docker host. Очистка host volumes, images и caches не выполняется из application workflow.

Для source build OpenSSL образ содержит штатные ALT-пакеты perl-IPC-Cmd, perl-Pod-Usage и perl-Time-Piece. Docker build сразу импортирует все три модуля, поэтому неполный Perl не публикуется как готовый Flutter toolchain.

Требуемые Secrets:

  • REGISTRY_USERNAME — пользователь container registry
  • REGISTRY_TOKEN — token с правом публикации runner images