build-distro 10.1 KB
Newer Older
Roman Alifanov's avatar
Roman Alifanov committed
1 2
#!/bin/bash

Roman Alifanov's avatar
Roman Alifanov committed
3 4
BUILDERDIR=$(realpath "$(dirname "$0")"/..)

5
#DEBUG=false
Roman Alifanov's avatar
Roman Alifanov committed
6 7 8 9
ALLDISTROS=false
NVIDIA=false
CLEAN=false
DESKTOP_ENVS=()  # Список выбранных рабочих окружений (например, gnome, hyprland)
10
NETWORK=false
11
MD5=false
Roman Alifanov's avatar
Roman Alifanov committed
12

13
# базовые функции 
Roman Alifanov's avatar
Roman Alifanov committed
14 15
# shellcheck disable=SC1091
. "$BUILDERDIR"/bin/common
16

17 18 19 20 21
if [ -z "$VMDIR" ]; then
    VMDIR="/var/ftp/pvt/ISO/testing/template/iso"
fi

if [ -z "$PROFILESDIR" ]; then
Roman Alifanov's avatar
Roman Alifanov committed
22
    PROFILESDIR="$BUILDERDIR/mkimage-profiles"
23
fi
Roman Alifanov's avatar
Roman Alifanov committed
24

25 26 27 28 29

if [ -z "$FTPDIR" ]; then
    FTPDIR="/var/ftp/pub/Etersoft/XimperLinux/Devel/ISO"
fi

30
create_tmp() {
Roman Alifanov's avatar
Roman Alifanov committed
31
    mktemp -d -t ximper-builder.XXXXXXX
32
}
Roman Alifanov's avatar
Roman Alifanov committed
33

34 35 36 37 38
remove_tmp() {
    rm -rf "$1"
}

print_build_info() {
39 40 41
    echo "____________________"
    print_blue "VMDIR: $VMDIR"
    print_blue "PROFILESDIR: $PROFILESDIR"
42 43 44 45 46 47 48 49
    print_blue "APTCONF: $APTCONF"
    echo "____________________"
    if [ "$VER" == "devel" ]; then
        print_yellow "VERSION: $VER"
    else
        print_green "VERSION: $VER"
    fi
    print_green "REPOSITORIES: $REPOS"
50 51 52
    if [ -n "$DEPLOY_DIR" ]; then
        print_green "DEPLOY: $DEPLOY_DIR"
    fi
53 54
}

55 56 57 58
check () {
    if [ "$MD5" == "true" ] && [ "$DEPLOY_DIR" != "ftp" ]; then
        print_error "--md5 можно использовать только при --deploy=ftp"
        exit 1
59 60 61
    fi
}

Roman Alifanov's avatar
Roman Alifanov committed
62 63 64
cleartmp() {
    [ "$CLEAN" == true ] || return
    echo "____________________"
65
    
66
    PROFILESDIR=$PROFILESDIR "$BUILDERDIR"/bin/cleartmp -i
Roman Alifanov's avatar
Roman Alifanov committed
67 68 69 70 71 72 73 74 75 76 77 78 79 80
    # shellcheck disable=SC2012
    # Удаляем все, кроме самого нового
    [ "$VER" == "devel" ] && ls -t "$VMDIR"/ximper-"$desktop_env""$iso_suffix"-devel-*-x86_64.iso | tail -n +2 | xargs -I {} rm -v -- {}
}

handle_uncommitted_changes() {
    # Проверка наличия незакоммиченных изменений
    if git diff-index --quiet HEAD --; then
        # Нет незакоммиченных изменений
        TEMP_COMMIT=false
        return
    fi

    # Обнаружены незакоммиченные изменения
81 82 83

    local temp_commit_msg
    temp_commit_msg="TEMP: Commit before building $(date +'%Y-%m-%d %H:%M:%S')"
Roman Alifanov's avatar
Roman Alifanov committed
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

    # Создание временного коммита
    git add -A
    git commit -m "$temp_commit_msg"
    print_red "Сделан временный коммит: $temp_commit_msg"
    
    TEMP_COMMIT=true
}

revert_temp_commit() {
    if [ "$TEMP_COMMIT" == true ]; then
        # Откат
        git reset "HEAD^"        
    fi
}

ifexit() {
    print_yellow "Скрипт принудительно завершен. Выполняю некоторые действия..."
    revert_temp_commit
    CLEAN=true cleartmp
Roman Alifanov's avatar
Roman Alifanov committed
104
    remove_tmp "$buildertmp"
Roman Alifanov's avatar
Roman Alifanov committed
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
    CLEAN=false
    exit 1
}

# Устанавливаем ловушку на выход из скрипта (сигнал EXIT)
trap ifexit SIGINT SIGTERM

makebuild() {
    cleartmp
    echo "____________________"

    local build_type=$1
    desktop_env=$2
    iso_suffix=""

    if [ "$build_type" == "nvidia" ]; then
121
        print_blue "Сборка с NVIDIA и $desktop_env"
Roman Alifanov's avatar
Roman Alifanov committed
122 123
        iso_suffix="-nvidia"
    else
124
        print_blue "Сборка по умолчанию с $desktop_env"
Roman Alifanov's avatar
Roman Alifanov committed
125 126 127 128 129 130 131 132 133 134
    fi

    # Обработка незакоммиченных изменений перед началом сборки
    handle_uncommitted_changes

    # Выполнение команды make в зависимости от рабочего окружения и типа сборки
    make DISTRO_VERSION="$VER" APTCONF="$APTCONF" "ximper-${desktop_env}${iso_suffix}.iso"

    # Генерация имени файла
    DFILENAME="ximper-${desktop_env}${iso_suffix}-${VER}-$(date +"%Y_%m_%d_%H%M")"
135

Roman Alifanov's avatar
Roman Alifanov committed
136 137 138 139 140 141 142 143 144 145 146
    # Добавление хэша коммита или примечания о временном коммите
    if [ "$VER" == "devel" ]; then
        if [ "$TEMP_COMMIT" == true ]; then
            DFILENAME+="-temp_commit"
        else
            DFILENAME+="-commithash|$(git rev-parse --short=7 HEAD)"
        fi
    fi

    DFILENAME+="-x86_64.iso"

147
    deploy
Roman Alifanov's avatar
Roman Alifanov committed
148 149 150 151 152

    # Отмена временного коммита после завершения сборки
    revert_temp_commit
}

153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
create_md5() {
    [ "$MD5" == true ] || return
    print_green "Создание md5sum для $2"
    md5sum "$1"/"$2" > "$1"/"$2".md5
}

deploy() {
    find "$TMP"/out/ -type l -exec rm {} +
    case "$DEPLOY_DIR" in
        ftp)
            mv -vf "$TMP"/out/ximper-*.iso "$FTPDIR"/"$DFILENAME"
            create_md5 "$FTPDIR" "$DFILENAME"
        ;;
        vm)
            mv -vf "$TMP"/out/ximper-*.iso "$VMDIR"/"$DFILENAME"
        ;;
        *)
            return
        ;;
    esac
}

OPTS=$(getopt -o h --long help,nvidia,debug,clean,all,deploy::,md5,gnome,hyprland,net,network,repos: -- "$@") || {
Roman Alifanov's avatar
Roman Alifanov committed
176 177
    print_error "Ошибка обработки опций."
    exit 1
178
}
Roman Alifanov's avatar
Roman Alifanov committed
179 180 181 182 183 184 185 186

# Применение параметров
eval set -- "$OPTS"

# Обработка аргументов
while true; do
    case "$1" in
        -h|--help)
187
            printf "\n"
188
            printf "Использование: %s [версия дистрибутива] [опции]\n\n" "$0"
Roman Alifanov's avatar
Roman Alifanov committed
189
            printf "Опции:\n"
190 191 192 193 194 195 196
            printf "    -h | --help             Вывод этой справки\n"
            printf "    Окружения:\n"
            printf "        --gnome             Собрать дистрибутив с GNOME (по умолчанию)\n"
            printf "        --hyprland          Собрать дистрибутив с Hyprland\n"
            printf "\n"
            printf "    Настройки образа:\n"
            printf "        --nvidia            Собрать дистрибутив с драйверами NVIDIA\n"
197
            printf "        --all               Собрать все дистрибутивы (default + nvidia)\n"
198 199 200 201 202 203
            printf "        -r | --repos        Установить используемые репозитории\n"
            printf "                            (По умолчанию: sisyphus,ximper)\n"
            printf "                            (репозитории используются тольок во время сборки)\n"
            printf "        --net | --network   Использовать сетевые репозитории\n\n"
            printf "        Репозитории:\n"
            printf "            - sisyphus\n"
204
            printf "            - ximper-additives\n"
205
            printf "            - ximper-additives-devel\n"
206 207 208
            printf "            - hasher\n"
            printf "\n"
            printf "    Прочее:\n"
209 210 211 212 213
            printf "        --deploy            Задеплоить образ\n"
            printf "            Параметры:\n"
            printf "                - vm (по умолчанию) -> %s\n" "$VMDIR"
            printf "                - ftp -> %s\n" "$FTPDIR"
            printf "        --md5               Создать файл md5 суммы образа (только при --deploy=ftp)\n"
214 215 216
            printf "        --debug             Включить режим отладки\n"
            printf "        --clean             Очистить TMP перед сборкой\n"
            printf "        --vm                Собрать дистрибутив для виртуальной машины\n"
217
            printf "                            Перемещает готовый образ в %s\n" "$VMDIR"
218
            exit 0
Roman Alifanov's avatar
Roman Alifanov committed
219 220 221 222 223 224 225
            ;;
        --nvidia)
            NVIDIA=true
            shift
            ;;
        --debug)
            echo "ДЕБАГ ВКЛЮЧЕН"
226
            # DEBUG=true
Roman Alifanov's avatar
Roman Alifanov committed
227 228 229 230 231 232 233 234 235 236
            shift
            ;;
        --clean)
            CLEAN=true
            shift
            ;;
        --all)
            ALLDISTROS=true
            shift
            ;;
237 238
        --md5)
            MD5=true
Roman Alifanov's avatar
Roman Alifanov committed
239 240
            shift
            ;;
241 242 243 244 245 246 247 248 249
        --deploy)
            if [ -n "$2" ] && [[ "$2" != "--"* ]]; then
                DEPLOY_DIR="$2"
                shift 2
            else
                DEPLOY_DIR="vm"
                shift 
            fi
            ;;
Roman Alifanov's avatar
Roman Alifanov committed
250 251 252 253 254 255 256 257
        --gnome)
            DESKTOP_ENVS+=("gnome")
            shift
            ;;
        --hyprland)
            DESKTOP_ENVS+=("hyprland")
            shift
            ;;
258 259 260 261
        --net|--network)
            NETWORK="--network"
            shift
            ;;
262 263
        --repos) 
            REPOS="$2"
264
            shift 2
265
            ;;
Roman Alifanov's avatar
Roman Alifanov committed
266 267 268 269
        --)
            shift
            break
            ;;
270 271 272
        "")
            shift
            ;;
Roman Alifanov's avatar
Roman Alifanov committed
273
        *)
274 275 276 277
            if [ -n "$REPOS" ] && [ "$1" = "$REPOS" ]; then
                shift
                continue
            fi
Roman Alifanov's avatar
Roman Alifanov committed
278 279 280 281 282 283
            print_error "Неверная опция: $1"
            exit 1
            ;;
    esac
done

284
if [ -z "$REPOS" ]; then
285
    REPOS="sisyphus,ximper-additives"
286 287
fi

288 289
if [ -z "$APTCONF" ]; then
    buildertmp=$(create_tmp)
Roman Alifanov's avatar
Roman Alifanov committed
290
    APTCONF=$("$BUILDERDIR"/bin/gen-apt-conf $NETWORK -d "$buildertmp" -r "$REPOS")
291
fi
292

Roman Alifanov's avatar
Roman Alifanov committed
293 294 295 296 297 298 299 300 301 302 303 304 305 306
# Установить GNOME по умолчанию, если ничего не выбрано
if [ ${#DESKTOP_ENVS[@]} -eq 0 ]; then
    DESKTOP_ENVS+=("gnome")
fi

# Обработка версии дистрибутива
if [ -n "$1" ]; then
    VER=$1
    shift
else
    print_error "Не указана версия дистрибутива."
    exit 1
fi

307
check
308

309
print_build_info
310

Roman Alifanov's avatar
Roman Alifanov committed
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
# Генерация списка задач на сборку
build_list=()

for desktop_env in "${DESKTOP_ENVS[@]}"; do
    if [ "$ALLDISTROS" == true ]; then
        build_list+=("$desktop_env:nvidia")
        build_list+=("$desktop_env:default")
    else
        if [ "$NVIDIA" == true ]; then
            build_list+=("$desktop_env:nvidia")
        else
            build_list+=("$desktop_env:default")
        fi
    fi
done

327 328
pushd "$PROFILESDIR" > /dev/null || exit

Roman Alifanov's avatar
Roman Alifanov committed
329 330 331 332 333 334 335
# Выполнение сборки для каждого элемента в списке
for build_item in "${build_list[@]}"; do
    IFS=':' read -r desktop_env build_type <<< "$build_item"
    makebuild "$build_type" "$desktop_env"
done

cleartmp
336 337
popd > /dev/null || exit

Roman Alifanov's avatar
Roman Alifanov committed
338
remove_tmp "$buildertmp"
339

340
print_green "ЗАВЕРШЕНО"