diff --git a/.gitea/README.md b/.gitea/README.md index 0a896a1..4677514 100644 --- a/.gitea/README.md +++ b/.gitea/README.md @@ -8,5 +8,50 @@ Job **openapi** (Redocly) запускается только если в ком - Метка `ubuntu-latest` (или измените `runs-on` под свои labels). - Job `bird2` ставит пакет **bird2** через `apt-get` на самом runner и вызывает `bird -c … -p` по файлам в checkout (без вложенного Docker: иначе bind-mount `/workspace/...` часто не виден демону Docker на хосте). +- Job **docker-images** требует **Docker** и (для push) доступ к Container Registry Gitea с runner’а. -Секреты не обязательны для базового CI; для публикации образов добавьте свои шаги и credentials в отдельный workflow. +## Сборка и публикация образов (`docker-images`) + +Запускается только при **push** в ветки `main` или `master` (после успешного job `go`). Собираются образы из `deploy/docker/*` (все бинарники через `gobinary`, плюс `evobgp-web`, `evobgp-agent`, `evobgp-bird2`). + +### Секреты репозитория (для push в реестр) + +В настройках репозитория Gitea: **Settings → Actions → Secrets** (или аналог): + +| Секрет | Назначение | +|--------|------------| +| `GITEA_REGISTRY_HOST` | Хост Docker-реестра (допустимо с `https://` — в workflow схема отрезается). Пример: `git.example.com` или `git.example.com:3000`. Значение попадает в переменную окружения **`REGISTRY`** для `docker/login-action`. | +| `ACTIONS_PAT` | Персональный токен с правом **записи пакетов** (container / package write). Используется как пароль при `docker login`. | + +Вход в реестр в workflow: + +- **registry:** `${{ env.REGISTRY }}` (из шага подготовки); +- **username:** `${{ gitea.actor }}` — пользователь, от имени которого запущен workflow (нативный контекст Gitea Actions); +- **password:** `${{ secrets.ACTIONS_PAT }}`. + +Если **`GITEA_REGISTRY_HOST` не задан** или нет **`ACTIONS_PAT`**, job только **собирает** образы локально (`docker buildx --load`) без push. + +### Имена образов и теги + +Формат: + +```text +//<имя>:<тег> +``` + +где `<имя>` — одно из: `evobgp-api`, `evobgp-all`, `evobgp-scheduler`, `evobgp-ingest`, `evobgp-render`, `evobgp-deploy`, `evobgp-node`, `evobgp-web`, `evobgp-agent`, `evobgp-bird2`. + +Теги: `latest`, короткий SHA (7 символов), `sha-<полный_commit_sha>`. + +Пример pull (подставьте свой хост и владельца): + +```bash +docker pull git.example.com/myuser/evobgp-api:latest +``` + +Убедитесь, что в **Gitea** включены пакеты (Container Registry) и у токена есть права на создание/обновление образов. Если ваш инстанс требует другой путь имени образа, скорректируйте шаг `Build and push` в [ci.yaml](workflows/ci.yaml) (переменная `IMG`). + +### Примечания + +- Сборка с платформой `linux/amd64`. При необходимости добавьте `linux/arm64` и multi-arch в `docker buildx build`. +- Для PR job **docker-images** не выполняется (только push в main/master), чтобы не публиковать образы из чужих форков без явной политики. diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index c46a366..527730a 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -111,3 +111,126 @@ jobs: echo "==> $conf" bird -c "$WS/$conf" -p done + + # Сборка образов и push в Container Registry Gitea (только push в main/master; см. .gitea/README.md). + docker-images: + needs: [go] + if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - image: evobgp-api + dockerfile: deploy/docker/gobinary/Dockerfile + bin: evobgp-api + birdc: "1" + - image: evobgp-all + dockerfile: deploy/docker/gobinary/Dockerfile + bin: evobgp-all + birdc: "1" + - image: evobgp-scheduler + dockerfile: deploy/docker/gobinary/Dockerfile + bin: evobgp-scheduler + birdc: "0" + - image: evobgp-ingest + dockerfile: deploy/docker/gobinary/Dockerfile + bin: evobgp-ingest + birdc: "0" + - image: evobgp-render + dockerfile: deploy/docker/gobinary/Dockerfile + bin: evobgp-render + birdc: "0" + - image: evobgp-deploy + dockerfile: deploy/docker/gobinary/Dockerfile + bin: evobgp-deploy + birdc: "0" + - image: evobgp-node + dockerfile: deploy/docker/gobinary/Dockerfile + bin: evobgp-node + birdc: "0" + - image: evobgp-web + dockerfile: deploy/docker/evobgp-web/Dockerfile + - image: evobgp-agent + dockerfile: deploy/docker/evobgp-agent/Dockerfile + - image: evobgp-bird2 + dockerfile: deploy/docker/bird2/Dockerfile + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Prepare registry (REGISTRY in env + outputs) + id: meta + env: + HOST: ${{ secrets.GITEA_REGISTRY_HOST }} + run: | + set -euo pipefail + owner_lc="$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" + echo "owner_lc=$owner_lc" >> "$GITHUB_OUTPUT" + short_sha="$(echo '${{ github.sha }}' | cut -c1-7)" + echo "short_sha=$short_sha" >> "$GITHUB_OUTPUT" + if [ -z "${HOST:-}" ]; then + echo "GITEA_REGISTRY_HOST not set — build without push." + echo "docker_push=false" >> "$GITHUB_OUTPUT" + echo "REGISTRY=" >> "$GITHUB_ENV" + else + h="$HOST" + h="${h#https://}" + h="${h#http://}" + h="${h%/}" + echo "docker_push=true" >> "$GITHUB_OUTPUT" + echo "REGISTRY=$h" >> "$GITHUB_ENV" + fi + + - name: Log in to Gitea Registry + if: steps.meta.outputs.docker_push == 'true' && secrets.ACTIONS_PAT != '' + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ gitea.actor }} + password: ${{ secrets.ACTIONS_PAT }} + + - name: Build and push ${{ matrix.image }} + env: + OWNER_LC: ${{ steps.meta.outputs.owner_lc }} + SHORT_SHA: ${{ steps.meta.outputs.short_sha }} + DO_PUSH: ${{ steps.meta.outputs.docker_push }} + PAT_OK: ${{ secrets.ACTIONS_PAT != '' }} + DF: ${{ matrix.dockerfile }} + IMAGE: ${{ matrix.image }} + BIN: ${{ matrix.bin }} + BIRDC: ${{ matrix.birdc }} + run: | + set -euxo pipefail + WS="${{ github.workspace }}" + cd "$WS" + + TAG_LOCAL="evobgp:${IMAGE}-${SHORT_SHA}" + BUILD_ARGS=() + if [ -n "${BIN:-}" ]; then + BUILD_ARGS+=(--build-arg "BIN=${BIN}") + BUILD_ARGS+=(--build-arg "INSTALL_BIRDC=${BIRDC:-0}") + fi + + if [ "$DO_PUSH" = "true" ] && [ -n "${REGISTRY:-}" ] && [ "$PAT_OK" = "true" ]; then + IMG="${REGISTRY}/${OWNER_LC}/${IMAGE}" + docker buildx build \ + --platform linux/amd64 \ + --file "$DF" \ + "${BUILD_ARGS[@]}" \ + --tag "${IMG}:latest" \ + --tag "${IMG}:${SHORT_SHA}" \ + --tag "${IMG}:sha-${{ github.sha }}" \ + --push \ + "$WS" + else + docker buildx build \ + --platform linux/amd64 \ + --file "$DF" \ + "${BUILD_ARGS[@]}" \ + --tag "$TAG_LOCAL" \ + --load \ + "$WS" + fi diff --git a/docs/README.md b/docs/README.md index 9307cd4..bccd0e2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -23,4 +23,4 @@ ## Репозиторий и CI -- [../.gitea/README.md](../.gitea/README.md) — Gitea Actions, требования к runner. +- [../.gitea/README.md](../.gitea/README.md) — Gitea Actions, runner, сборка образов и push в Container Registry.