- Go 100%
|
All checks were successful
build-runner-images / build (docker) (push) Successful in 23s
build-runner-images / build (deploy) (push) Successful in 25s
build-runner-images / build (dotnet) (push) Successful in 22s
build-runner-images / build (go) (push) Successful in 25s
build-runner-images / build (node) (push) Successful in 21s
build-runner-images / build (rust) (push) Successful in 22s
build-runner-images / build-android (push) Successful in 10m19s
|
||
|---|---|---|
| .forgejo | ||
| Dockerfile.android | ||
| Dockerfile.deploy | ||
| Dockerfile.docker | ||
| Dockerfile.dotnet | ||
| Dockerfile.go | ||
| Dockerfile.node | ||
| Dockerfile.rust | ||
| README.md | ||
CaviCode CI Runner
Кастомные Docker-образы для Forgejo runner на 192.168.1.40.
Базовый образ catthehacker/ubuntu:act-latest не подходит — Ubuntu
archive.ubuntu.com таймаутит через Cloudflare, apt-get не работает.
Все образы на базе Alpine 3.20 — apk add работает быстро и надёжно.
Образы
| Образ | Метка | Размер | Инструменты |
|---|---|---|---|
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 |
Сборка
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 .
Передача на CI-сервер
docker save cavicode/runner:deploy cavicode/runner:dotnet cavicode/runner:go cavicode/runner:rust cavicode/runner:node cavicode/runner:docker cavicode/runner:android \
| 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
deploy:
runs-on: docker
container: git.cavicode.tech/cavicode/runner:deploy
CI
Workflow .forgejo/workflows/build-images.yml автоматически собирает и передаёт
образы на сервер при изменении Dockerfile.*. Использует alpine:3.20 как
контейнер для сборки (не зависит от самих образов — нет замкнутого круга).
Требуемые Secrets:
DEPLOY_HOST— SSH-хост сервера (192.168.1.40)DEPLOY_USER— SSH-пользователь (root)DEPLOY_PASSWORD— SSH-пароль