- Go 100%
|
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
|
||
|---|---|---|
| .forgejo | ||
| Changelog.md | ||
| Dockerfile.android | ||
| Dockerfile.deploy | ||
| Dockerfile.docker | ||
| Dockerfile.dotnet | ||
| Dockerfile.flutter | ||
| Dockerfile.go | ||
| Dockerfile.node | ||
| Dockerfile.rust | ||
| README.md | ||
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требует обязательный inputtoken: ${{ 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 registryREGISTRY_TOKEN— token с правом публикации runner images