Как собирать пакеты из исходников с помощью bash-скриптов?

«Как собирать пакеты из исходников с помощью bash-скриптов?» — вопрос из категории Скриптинг и автоматизация, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сборка пакетов из исходников через bash-скрипты — стандартная задача для автоматизации развертывания. Основной паттерн — ./configure, make, make install. Вот пример скрипта с обработкой ошибок и зависимостями:

#!/bin/bash
set -e  # Выход при первой ошибке

PACKAGE="nginx-1.24.0"
PREFIX="/usr/local"

# Установка зависимостей для сборки (пример для Ubuntu/Debian)
sudo apt-get update
sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g-dev libssl-dev

# Загрузка и распаковка
wget -q "https://nginx.org/download/${PACKAGE}.tar.gz"
tar -xzf "${PACKAGE}.tar.gz"
cd "${PACKAGE}"

# Конфигурация с оптимизациями
./configure 
    --prefix="${PREFIX}" 
    --with-http_ssl_module 
    --with-http_v2_module 
    --with-threads 
    --with-file-aio

# Параллельная сборка с использованием всех ядер
make -j"$(nproc)"

# Установка
sudo make install

# Создание systemd-юнита (опционально)
sudo systemctl daemon-reload

Ключевые моменты для продакшена:

  • checkinstall: Вместо прямого make install лучше использовать sudo checkinstall для создания .deb или .rpm пакета, что позволяет управлять версиями и чисто удалять.
  • Изоляция через Docker: Для воспроизводимости сборки создаю многоступенчатый Dockerfile, который кэширует зависимости.
  • Альтернативные системы сборки: Для проектов на CMake (например, Redis) или Meson использую соответствующие команды (cmake -B build && cmake --build build).
  • Артефакты CI: В пайплайне GitLab CI сохраняю собранные бинарные файлы как артефакты для последующего развертывания.