Сборочная фабрика из докера.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сборочная фабрика из докера.

Сообщение Attid »

наконец добрался и собрал фабрику теперь запуск одного скрипта собирает под 4 платформы. при должной сноровке можно настроить гитхаб акшенс и при комите будет автоматом все собираться и выкладываться в пакеты

это не универсальный скрипт делал по себя, так что под сложный проект нужно будет его чуть править например добавлять свои компоненты.

общий ликбез - собираеться 2 докера с лазарусом 386 и х64 под убунтой (386 убунта 18 чтоб старый libc был, мне это важно) и каждый из может собрать под себя и под венду.

я все запускаю в убунте, но должно работать и в венде, но возможно нужно будет поправить sh файлы.

и так общая структура -

Код: Выделить всё

run_build_docker.sh
docker/
├── build_internal_i386.sh
├── build_internal.sh
├── debs
│   ├── i386
│   │   ├── fpc-laz_3.2.2-210709_i386.deb
│   │   ├── fpc-src_3.2.2-210709_i386.deb
│   │   └── lazarus-project_4.4.0-0_i386.deb
│   └── x64
│       ├── fpc-laz_3.2.2-210709_amd64.deb
│       ├── fpc-src_3.2.2-210709_amd64.deb
│       └── lazarus-project_4.4.0-0_amd64.deb
├── Dockerfile
├── Dockerfile.i386
деб пакеты с оф сайта https://forum.lazarus.freepascal.org/in ... 707.0.html

run_build_docker.sh

Код: Выделить всё

#!/bin/bash
set -e

# Define image names
IMG_MAIN="infopark-builder-main"
IMG_I386="infopark-builder-i386"

# Enable BuildKit
export DOCKER_BUILDKIT=1

MODE=${1:-all} # Default to 'all' if no argument provided

build_x64() {
    echo "========================================"
    echo " BUILDING x64 (Linux/Windows)"
    echo "========================================"
    docker build -f docker/Dockerfile -t $IMG_MAIN .
    docker run --rm \
        -v "$(pwd):/app" \
        --user "$(id -u):$(id -g)" \
        $IMG_MAIN \
        bash docker/build_internal.sh
}

build_i386() {
    echo "========================================"
    echo " BUILDING i386 (Linux/Windows)"
    echo "========================================"
    docker build --platform linux/386 -f docker/Dockerfile.i386 -t $IMG_I386 .
    docker run --rm --platform linux/386 \
        -v "$(pwd):/app" \
        --user "$(id -u):$(id -g)" \
        $IMG_I386 \
        bash docker/build_internal_i386.sh
}

case $MODE in
    x64)
        build_x64
        ;;
    i386)
        build_i386
        ;;
    all)
        build_x64
        build_i386
        ;;
    *)
        echo "Usage: $0 [x64|i386|all]"
        exit 1
        ;;
esac

echo "========================================"
echo " JOB COMPLETED: $MODE"
echo "========================================"
Dockerfile

Код: Выделить всё

FROM ubuntu:22.04

ENV DEBIAN_FRONTEND=noninteractive

# 1. Install System Dependencies (x64)
RUN apt-get update && apt-get install -y --no-install-recommends \
    wget \
    curl \
    git \
    build-essential \
    binutils \
    # Windows x64 cross-tools
    binutils-mingw-w64-x86-64 \
    gcc-mingw-w64-x86-64 \
    # GUI Libraries (Native x64)
    libgtk2.0-dev \
    libx11-dev \
    libc6-dev \
    libgdk-pixbuf2.0-dev \
    libpango1.0-dev \
    ca-certificates \
    libncurses5-dev \
    libncurses5 \
    gdb \
    rpm \
    && rm -rf /var/lib/apt/lists/*

# 2. Install FPC & Lazarus (x64 DEBs)
WORKDIR /tmp/install
# Copy from the x64 folder (we assume they are there)
COPY docker/debs/x64/*.deb ./

RUN echo "Installing Lazarus/FPC (x64)..." && \
    apt-get update && \
    apt-get install -y ./*.deb && \
    rm -rf /tmp/install

# 3. Setup Windows x64 Cross-Compilation
RUN echo "Setting up Windows x64 Cross-Compilation..." && \
    FPCVER=$(fpc -iV) && \
    # FIX: Find FPC Source manually if needed, but for 3.2.2 DEB it's usually standard
    FPCDIR="/usr/share/fpcsrc/$FPCVER" && \
    if [ ! -d "$FPCDIR" ]; then FPCDIR=$(find /usr/share/fpcsrc -name "Makefile" -type f -exec dirname {} \; | grep "$FPCVER" | head -n 1); fi && \
    cd "$FPCDIR" && \
    # Build Windows x64 cross-compiler
    make clean crossall crossinstall CPU_TARGET=x86_64 OS_TARGET=win64 INSTALL_PREFIX=/usr && \
    # Symlink
    ln -sf /usr/lib/fpc/$FPCVER/ppcrossx64 /usr/bin/ppcrossx64 || true && \
    # Ensure native compiler is found (ppcx64)
    if [ ! -f /usr/bin/ppcx64 ]; then ln -s /usr/lib/fpc/$FPCVER/ppcx64 /usr/bin/ppcx64; fi

# 4. Runtime
ENV HOME=/tmp
RUN chmod 777 /tmp

WORKDIR /app
CMD ["/bin/bash"]
Dockerfile.i386

Код: Выделить всё

FROM i386/ubuntu:18.04

ENV DEBIAN_FRONTEND=noninteractive

# 1. Install System Dependencies (Native i386)
RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates \
    wget \
    curl \
    git \
    build-essential \
    binutils \
    # Windows cross-tools
    binutils-mingw-w64-i686 \
    gcc-mingw-w64-i686 \
    # GUI Libraries
    libgtk2.0-dev \
    libx11-dev \
    libc6-dev \
    libgdk-pixbuf2.0-dev \
    libpango1.0-dev \
    libncurses5-dev \
    libncurses5 \
    gdb \
    && rm -rf /var/lib/apt/lists/*

# 2. Install FPC & Lazarus (i386 DEBs)
WORKDIR /tmp/install
COPY docker/debs/i386/*.deb ./

RUN echo "Installing Lazarus/FPC (i386)..." && \
    apt-get update && \
    apt-get install -y ./*.deb && \
    rm -rf /tmp/install

# 3. Setup Windows i386 Cross-Compilation
RUN echo "Setting up Windows i386 Cross-Compilation..." && \
    FPCVER=$(fpc -iV) && \
    FPCDIR="/usr/share/fpcsrc/$FPCVER" && \
    cd "$FPCDIR" && \
    # Build Windows i386 cross-compiler
    make clean crossall crossinstall CPU_TARGET=i386 OS_TARGET=win32 INSTALL_PREFIX=/usr && \
    # Symlink
    ln -sf /usr/lib/fpc/$FPCVER/ppcross386 /usr/bin/ppcross386 || true && \
    # Ensure native compiler symlink
    if [ ! -f /usr/bin/ppc386 ] && [ -f /usr/lib/fpc/$FPCVER/ppc386 ]; then \
        ln -s /usr/lib/fpc/$FPCVER/ppc386 /usr/bin/ppc386; \
    fi

# 4. Runtime
ENV HOME=/tmp
RUN chmod 777 /tmp

WORKDIR /app
CMD ["/bin/bash"]
build_internal.sh

Код: Выделить всё

#!/bin/bash
set -e

# --- BUILD MANIFEST ---
# Format: "Path/To/Project.lpi:targets"
# Targets: lin64, win64
# (lin32 and win32 are handled by the i386 container)

BUILD_LIST=(
    "soft/ipTest.lpi:lin64,win64"
    "soft/ipAdmin.lpi:lin64,win64"
    "soft/ipKernel.lpi:lin64"
)

# --- SETUP ---
echo "=========================================="
echo "   INFOPARK BUILDER (x64 CONTAINER)"
echo "=========================================="

build_pkg() {
    echo ">>> Registering package: $1"
    lazbuild -B "$1" > /dev/null || true
    lazbuild --add-package "$1" > /dev/null || true
}

# Register Components
build_pkg "components/synapse/laz_synapse.lpk"
build_pkg "components/uib25/source/uiblaz.lpk"
build_pkg "components/rx/rx.lpk"

echo "=========================================="
echo "   PROCESSING BUILD LIST"
echo "=========================================="

for ENTRY in "${BUILD_LIST[@]}"; do
    PROJECT="${ENTRY%%:*}"
    TARGETS="${ENTRY##*:}"
    
    if [ ! -f "$PROJECT" ]; then
        echo "WARNING: Project not found: $PROJECT"
        continue
    fi

    echo "------------------------------------------"
    echo "Project: $PROJECT"
    echo "Targets requested: $TARGETS"

    # Patch Synapse
    if ! grep -q "components/synapse" "$PROJECT"; then
        sed -i 's|<SearchPaths>|<SearchPaths><OtherUnitFiles Value="../components/synapse"/>|g' "$PROJECT"
    fi

    # Build Linux x64
    if [[ "$TARGETS" == *"lin64"* ]]; then
        echo "  -> Building Linux x64..."
        if ! lazbuild -B "$PROJECT" --os="linux" --cpu="x86_64"; then
            echo "  [FATAL ERROR] Failed Linux x64: $PROJECT"
            exit 1
        fi
    else
        echo "  -  Skipping Linux x64 (not requested)"
    fi

    # Build Windows x64
    if [[ "$TARGETS" == *"win64"* ]]; then
        echo "  -> Building Windows x64..."
        if ! lazbuild -B "$PROJECT" --os="win64" --cpu="x86_64"; then
            echo "  [FATAL ERROR] Failed Windows x64: $PROJECT"
            exit 1
        fi
    else
        echo "  -  Skipping Windows x64 (not requested)"
    fi
done

echo "=========================================="
echo "   x64 BUILD COMPLETED SUCCESSFULLY"
echo "=========================================="
build_internal_i386.sh

Код: Выделить всё

#!/bin/bash
set -e

# --- BUILD MANIFEST ---
# Must match the x64 script for consistency, but filters for 32-bit targets.
# Targets: lin32, win32

BUILD_LIST=(
    "soft/ipAdmin.lpi:lin32,win32"
    "soft/ipDesk.lpi:lin32,win32"
)

# --- SETUP ---
echo "=========================================="
echo "   INFOPARK BUILDER (i386 CONTAINER)"
echo "=========================================="

build_pkg() {
    echo ">>> Registering package: $1"
    lazbuild -B "$1" > /dev/null || true
    lazbuild --add-package "$1" > /dev/null || true
}

# Register Components
build_pkg "components/synapse/laz_synapse.lpk"
build_pkg "components/uib25/source/uiblaz.lpk"
build_pkg "components/rx/rx.lpk"


echo "=========================================="
echo "   PROCESSING BUILD LIST"
echo "=========================================="

for ENTRY in "${BUILD_LIST[@]}"; do
    PROJECT="${ENTRY%%:*}"
    TARGETS="${ENTRY##*:}"
    
    if [ ! -f "$PROJECT" ]; then
        echo "WARNING: Project not found: $PROJECT"
        continue
    fi

    echo "------------------------------------------"
    echo "Project: $PROJECT"
    echo "Targets requested: $TARGETS"

    # Patch Synapse
    if ! grep -q "components/synapse" "$PROJECT"; then
        sed -i 's|<SearchPaths>|<SearchPaths><OtherUnitFiles Value="../components/synapse"/>|g' "$PROJECT"
    fi

    # Build Linux i386
    if [[ "$TARGETS" == *"lin32"* ]]; then
        echo "  -> Building Linux i386..."
        if ! lazbuild -B "$PROJECT" --os="linux" --cpu="i386"; then
            echo "  [FATAL ERROR] Failed Linux i386: $PROJECT"
            exit 1
        fi
    else
        echo "  -  Skipping Linux i386 (not requested)"
    fi

    # Build Windows i386
    if [[ "$TARGETS" == *"win32"* ]]; then
        echo "  -> Building Windows i386..."
        if ! lazbuild -B "$PROJECT" --os="win32" --cpu="i386"; then
            echo "  [FATAL ERROR] Failed Windows i386: $PROJECT"
            exit 1
        fi
    else
        echo "  -  Skipping Windows i386 (not requested)"
    fi
done

echo "=========================================="
echo "   i386 BUILD COMPLETED SUCCESSFULLY"
echo "=========================================="
первый раз собираеться долго, потом уже чисто как много проктов. 6 проектов по 4 платформы у меня 3,5 минуты.

запуск - sh run_build_docker.sh

или с параметреми если не все надо sh run_build_docker.sh i386

если кому интересен готовый контейнер то в целом тоже могу залить, он в целом то универсальный, пакеты подключаються при запуске.
MaratIsk
постоялец
Сообщения: 125
Зарегистрирован: 20.08.2009 18:15:20

Re: Сборочная фабрика из докера.

Сообщение MaratIsk »

сделай доброе дела. воздастся
Seenkao
энтузиаст
Сообщения: 565
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Re: Сборочная фабрика из докера.

Сообщение Seenkao »

Что мешает использовать эмуляторы? Вообще не понимаю смысла в использовании Docker.

Обычно компилирую под все необходимые платформы и на каждой отдельно проверяю. Многое можно прямо под Linux и проверить, что нельзя под эмулятором проверяется или на реальном устройстве (для Android это наиболее актуальный способ!).
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Re: Сборочная фабрика из докера.

Сообщение Attid »

Seenkao писал(а):Что мешает использовать эмуляторы? Вообще не понимаю смысла в использовании Docker.
ну прелесть IT что можно разными путями делать одни вещи под свои привычки =)

я до этого использовал 3 виртуал бокса чтоб делать то что сейчас делаю "одним кликом мыши" т.е. варинт был запускать кучу виртуалок, потом их закрывать и сидеть тупить в ожидании. сейчас тыкнул, делаю свои дела потом хлобысь получил кучу бинарников.


ну а докер удобная штука у меня их штук 5 крутиться локально, а на серверах под сотню уже, но эт уже другая история.
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Re: Сборочная фабрика из докера.

Сообщение Sharfik »

Ау, люди! Программирование и битва экстрасенсов на РенТВ это не одно и тоже. Неудивительно что форму еле еле живет. Что не тема, там набор слов понятный по большей части только автору темы. Для кого написано вообще не понятно. Если есть желание сделать что то полезное для окружения, то надо нормально писать - что, где зачем и почему. Какой инструментарий, какая цель, какой результат и выгода?
Seenkao
энтузиаст
Сообщения: 565
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Re: Сборочная фабрика из докера.

Сообщение Seenkao »

Attid писал(а): 05.01.2026 18:05:35 я до этого использовал 3 виртуал бокса чтоб делать то что сейчас делаю "одним кликом мыши" т.е. варинт был запускать кучу виртуалок, потом их закрывать и сидеть тупить в ожидании. сейчас тыкнул, делаю свои дела потом хлобысь получил кучу бинарников.


ну а докер удобная штука у меня их штук 5 крутиться локально, а на серверах под сотню уже, но эт уже другая история.
Используя FPC/Lazarus, можно собрать сразу под множество разных платформ. На своём компьютере я не вижу проблем запустить несколько виртуалок и они вполне будут работоспособны и не сильно мешать.

Вся проблема тестирования в том, что тестировать желательно на реальном устройстве. Ни виртуалка, ни докер не заменит реального оборудования полностью. И хорошо когда можно собрать "сразу и всё", но проблемы тестирования это не решит. Если сборка идёт только для ПК, то проблем конечно меньше, но как только сборка выходит за рамки (Android, Raspberry ещё всякая фигня), то здесь все виртуалки бессильны.

Точнее основные проблемы решить на виртуалке (докер тоже виртуалка) можно будет, но определённые моменты - нет.

Но и отказываться от виртуалок не надо! )))


Sharfik, ну тут человек видимо думает что все знают про что речь идёт. И быстро сделал выкладки.
Ответить