diff --git a/.gitea/README.md b/.gitea/README.md index 068fd1c..d769588 100644 --- a/.gitea/README.md +++ b/.gitea/README.md @@ -16,7 +16,7 @@ Job **changes** вычисляет два флага: Требования к runner: - Метка `ubuntu-latest` (или измените `runs-on` под свои labels). -- Job `bird2` ставит пакет **bird2** через `apt-get` на самом runner и вызывает `bird -c … -p` по файлам в checkout (без вложенного Docker: иначе bind-mount `/workspace/...` часто не виден демону Docker на хосте). +- Job `bird2` собирает **BIRD 2.14** из исходников (тот же скрипт, что в `deploy/docker/bird/bird-from-source.sh`, что и в образах) и вызывает `bird -c … -p` по файлам в checkout (без вложенного Docker: иначе bind-mount `/workspace/...` часто не виден демону Docker на хосте). - Job **docker-images** требует **Docker** и (для push) доступ к Container Registry Gitea с runner’а. ## Сборка и публикация образов (`docker-images`) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index a9d3870..b8bd07e 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -81,6 +81,7 @@ jobs: web/README.md) ;; # doc-only web/*) web=true ;; deploy/bird/*) bird_conf=true ;; + deploy/docker/bird/*) docker_bird=true; docker_go=true ;; deploy/docker/gobinary/*) docker_go=true ;; deploy/docker/evobgp-agent/*) docker_go=true ;; deploy/docker/evobgp-web/*) docker_web=true ;; @@ -146,15 +147,25 @@ jobs: # --------------------------------------------------------------------------- bird2: runs-on: ubuntu-latest - needs: [go] + needs: [changes, go] + if: >- + always() && + needs.changes.result == 'success' && + needs.go.result != 'failure' && + (needs.changes.outputs.go == 'true' || + needs.changes.outputs.bird_conf == 'true' || + needs.changes.outputs.docker_bird == 'true' || + needs.changes.outputs.docker_go == 'true') steps: - uses: actions/checkout@v4 - - name: Install bird2 + - name: Install BIRD from source (2.14, как в контейнерах) run: | set -euxo pipefail if command -v sudo >/dev/null 2>&1; then SUDO=sudo; else SUDO=""; fi $SUDO apt-get update -qq - DEBIAN_FRONTEND=noninteractive $SUDO apt-get install -y -qq bird2 + $SUDO cp deploy/docker/bird/bird-from-source.sh /tmp/bird-from-source.sh + $SUDO chmod +x /tmp/bird-from-source.sh + $SUDO env BIRD_VERSION=2.14 bash /tmp/bird-from-source.sh bird --version - name: bird -p on all scenario bird.conf files env: diff --git a/deploy/docker/bird/bird-from-source.sh b/deploy/docker/bird/bird-from-source.sh new file mode 100644 index 0000000..df8b7e1 --- /dev/null +++ b/deploy/docker/bird/bird-from-source.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Сборка BIRD из официального tarball (версия задаётся BIRD_VERSION, по умолчанию 2.14). +# Запуск от root (Docker) или через sudo на хосте. Префикс установки: /usr/local. +set -eu +BIRD_VERSION="${BIRD_VERSION:-2.14}" +export DEBIAN_FRONTEND=noninteractive + +apt-get update +apt-get install -y --no-install-recommends \ + build-essential \ + ca-certificates \ + curl \ + flex \ + bison \ + libncurses-dev \ + libreadline-dev + +cd /tmp +rm -rf "bird-${BIRD_VERSION}" +curl -fsSL "https://bird.network.cz/download/bird-${BIRD_VERSION}.tar.gz" | tar xz +cd "bird-${BIRD_VERSION}" +./configure --prefix=/usr/local --enable-client +make -j"$(nproc)" +make install +cd / +rm -rf "/tmp/bird-${BIRD_VERSION}" + +apt-get purge -y build-essential flex bison libncurses-dev libreadline-dev +apt-get autoremove -y +apt-get install -y --no-install-recommends libreadline8 libtinfo6 +rm -rf /var/lib/apt/lists/* diff --git a/deploy/docker/bird2/Dockerfile b/deploy/docker/bird2/Dockerfile index 3684a01..9478644 100644 --- a/deploy/docker/bird2/Dockerfile +++ b/deploy/docker/bird2/Dockerfile @@ -1,9 +1,16 @@ -# BIRD 2 alongside evobgp-agent; share /etc/bird with the agent container (plan §4.1). +# BIRD 2.14+ из исходников (пакет Debian bookworm слишком старый). +# Сборка: из корня репозитория: docker build -f deploy/docker/bird2/Dockerfile . +FROM public.ecr.aws/docker/library/debian:bookworm-slim AS bird-build +ARG BIRD_VERSION=2.14 +COPY deploy/docker/bird/bird-from-source.sh /tmp/bird-from-source.sh +RUN chmod +x /tmp/bird-from-source.sh && BIRD_VERSION="${BIRD_VERSION}" /tmp/bird-from-source.sh + FROM public.ecr.aws/docker/library/debian:bookworm-slim -RUN apt-get update && apt-get install -y --no-install-recommends bird2 \ - && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y --no-install-recommends libreadline8 libtinfo6 \ + && rm -rf /var/lib/apt/lists/* +COPY --from=bird-build /usr/local/sbin/bird /usr/local/sbin/bird +COPY --from=bird-build /usr/local/sbin/birdc /usr/local/sbin/birdc COPY deploy/bird/bird.conf /etc/bird/bird.conf RUN mkdir -p /etc/bird/bird.d EXPOSE 179 -# Foreground for Docker; configs on shared volume override this file at runtime. CMD ["bird", "-f", "-c", "/etc/bird/bird.conf"] diff --git a/deploy/docker/evobgp-agent/Dockerfile b/deploy/docker/evobgp-agent/Dockerfile index 2875af8..036fc25 100644 --- a/deploy/docker/evobgp-agent/Dockerfile +++ b/deploy/docker/evobgp-agent/Dockerfile @@ -1,4 +1,4 @@ -# evobgp-agent CLI (parse-check, birdc configure); install bird2 so `bird -p` matches bird2 image (plan §13). +# evobgp-agent + BIRD 2.14+ (bird/birdc) из исходников — совпадает с образом evobgp-bird2. # См. gobinary/Dockerfile — ECR Public вместо прямого pull с Docker Hub (устойчивость CI). FROM public.ecr.aws/docker/library/golang:1.22-bookworm AS build WORKDIR /src @@ -6,9 +6,16 @@ COPY go.mod go.sum ./ COPY . . RUN go build -trimpath -ldflags="-s -w" -o /out/evobgp-agent ./cmd/evobgp-agent +FROM public.ecr.aws/docker/library/debian:bookworm-slim AS bird-build +ARG BIRD_VERSION=2.14 +COPY deploy/docker/bird/bird-from-source.sh /tmp/bird-from-source.sh +RUN chmod +x /tmp/bird-from-source.sh && BIRD_VERSION="${BIRD_VERSION}" /tmp/bird-from-source.sh + FROM public.ecr.aws/docker/library/debian:bookworm-slim -RUN apt-get update && apt-get install -y --no-install-recommends bird2 ca-certificates \ - && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y --no-install-recommends libreadline8 libtinfo6 ca-certificates \ + && rm -rf /var/lib/apt/lists/* +COPY --from=bird-build /usr/local/sbin/bird /usr/local/sbin/bird +COPY --from=bird-build /usr/local/sbin/birdc /usr/local/sbin/birdc COPY --from=build /out/evobgp-agent /usr/local/bin/evobgp-agent WORKDIR /etc/bird ENTRYPOINT ["/usr/local/bin/evobgp-agent"] diff --git a/deploy/docker/gobinary/Dockerfile b/deploy/docker/gobinary/Dockerfile index a35c41a..125d126 100644 --- a/deploy/docker/gobinary/Dockerfile +++ b/deploy/docker/gobinary/Dockerfile @@ -1,5 +1,5 @@ # Универсальная сборка бинаря из cmd/* (ARG BIN=evobgp-api | evobgp-all). -# INSTALL_BIRDC=1 ставит bird2 в рантайм-образ для EVOBGP_BIRDC_SOCKET (poll метрик birdc). +# INSTALL_BIRDC=1 собирает BIRD 2.14 из исходников (birdc) для EVOBGP_BIRDC_SOCKET; иначе пакет Debian не используется. # Базовые образы из ECR Public (официальное зеркало library/*), чтобы CI не зависел от auth.docker.io. FROM public.ecr.aws/docker/library/golang:1.22-bookworm AS build WORKDIR /src @@ -11,8 +11,16 @@ RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /out/evobgp ./cmd/${BIN FROM public.ecr.aws/docker/library/debian:bookworm-slim ARG INSTALL_BIRDC=0 +ARG BIRD_VERSION=2.14 +COPY deploy/docker/bird/bird-from-source.sh /tmp/bird-from-source.sh RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \ - && if [ "$INSTALL_BIRDC" = "1" ]; then apt-get install -y --no-install-recommends bird2; fi \ + && if [ "$INSTALL_BIRDC" = "1" ]; then \ + chmod +x /tmp/bird-from-source.sh \ + && BIRD_VERSION="${BIRD_VERSION}" /tmp/bird-from-source.sh \ + && rm -f /tmp/bird-from-source.sh; \ + else \ + rm -f /tmp/bird-from-source.sh; \ + fi \ && rm -rf /var/lib/apt/lists/* COPY --from=build /out/evobgp /usr/local/bin/evobgp EXPOSE 8080