最終更新 4 days ago

Универсальный скрипт сборки в PHAR через докер

修正履歴 03b3a226788bbf9006c0dc5ccdef983a8102c396

build_phar.sh Raw
1#!/bin/bash
2set -e
3
4PROJECT_DIR="$(basename "$(pwd)")"
5echo "Building $PROJECT_DIR PHAR..."
6
7IMAGE_NAME="phar-builder-universal"
8
9# ---- Read box.json ----
10if [ ! -f "box.json" ]; then
11 echo "Error: box.json not found"
12 exit 1
13fi
14
15BOX_MAIN=$(php -r "echo json_decode(file_get_contents('box.json'), true)['main'] ?? 'index.php';")
16BOX_OUTPUT=$(php -r "echo json_decode(file_get_contents('box.json'), true)['output'] ?? 'output.phar';")
17VERSION_DIR=$(dirname "$BOX_MAIN")
18
19echo " Main script: $BOX_MAIN"
20echo " Output PHAR: $BOX_OUTPUT"
21
22# ---- Rebuild image if requested ----
23if [ "$1" = "--rebuild" ]; then
24 echo "Removing existing image $IMAGE_NAME for rebuild..."
25 docker rmi "$IMAGE_NAME" 2>/dev/null || true
26fi
27
28# ---- Build image only once ----
29if ! docker image inspect "$IMAGE_NAME" >/dev/null 2>&1; then
30 echo "Image $IMAGE_NAME not found, building..."
31
32 TMP_DOCKERFILE="/tmp/grasp_phar_builder.Dockerfile"
33 trap 'rm -f "$TMP_DOCKERFILE"' EXIT
34
35 if [ -f "box.phar" ]; then
36 echo "Found local box.phar, will COPY it into image"
37 BOX_INSTALL="COPY box.phar /usr/local/bin/box
38RUN chmod +x /usr/local/bin/box"
39 else
40 echo "box.phar not found locally, will download from GitHub"
41 BOX_INSTALL="RUN curl -LSs https://github.com/box-project/box/releases/download/4.5.0/box.phar -o /usr/local/bin/box && chmod +x /usr/local/bin/box"
42 fi
43
44 cat > "$TMP_DOCKERFILE" << DOCKERFILE
45FROM php:8.3-cli
46
47RUN apt-get update && apt-get install -y \
48 git unzip curl \
49 libbz2-dev liblz4-dev libzstd-dev libzip-dev \
50 libwebp-dev libjpeg-dev libpng-dev libfreetype-dev \
51 libmagickwand-dev \
52 libsodium-dev libssl-dev \
53 libpq-dev libsqlite3-dev unixodbc-dev libldap-dev \
54 libxml2-dev libxslt1-dev \
55 libicu-dev libgmp-dev libonig-dev \
56 libedit-dev libkrb5-dev libsnmp-dev libtidy-dev libmemcached-dev \
57 && rm -rf /var/lib/apt/lists/*
58
59RUN docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
60 && docker-php-ext-install -j\$(nproc) \
61 bcmath bz2 calendar dom exif fileinfo ftp \
62 gd gettext gmp iconv intl ldap mbstring mysqli \
63 opcache pcntl pdo pdo_mysql pdo_pgsql pdo_sqlite pgsql phar \
64 posix simplexml snmp soap sockets \
65 sodium sqlite3 tidy xml \
66 xmlreader xmlwriter xsl zip \
67 || echo "Some core extensions failed (non-fatal)"
68
69RUN pecl install imagick redis apcu xmlrpc || echo "Some PECL extensions failed (non-fatal)"
70RUN pecl install memcached lz4 zstd rar || echo "Some PECL extensions failed (non-fatal)"
71RUN docker-php-ext-enable imagick redis apcu xmlrpc memcached lz4 zstd rar || true
72
73COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
74
75${BOX_INSTALL}
76
77WORKDIR /app
78DOCKERFILE
79
80 docker build -f "$TMP_DOCKERFILE" -t "$IMAGE_NAME" .
81 echo "Image $IMAGE_NAME built"
82else
83 echo "Using existing image $IMAGE_NAME (pass --rebuild to rebuild)"
84fi
85
86CURRENT_UID=$(id -u)
87CURRENT_GID=$(id -g)
88
89echo "Running build..."
90docker run --rm \
91 -v "$(pwd)":/app \
92 -e HOST_UID=$CURRENT_UID \
93 -e HOST_GID=$CURRENT_GID \
94 "$IMAGE_NAME" sh -c "
95 echo ' Installing dependencies...' && \
96 composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction --ignore-platform-req=ext-redis && \
97 echo ' Generating version file...' && \
98 if git rev-parse --git-dir > /dev/null 2>&1; then \
99 mkdir -p $VERSION_DIR && \
100 git rev-parse --short HEAD > $VERSION_DIR/_version && \
101 git log --oneline --format=%B -n 1 HEAD | head -n 1 >> $VERSION_DIR/_version && \
102 git log --oneline --format=\"%at\" -n 1 HEAD | xargs -I{} date -d @{} +%Y-%m-%d >> $VERSION_DIR/_version && \
103 echo ' Version file written to $VERSION_DIR/_version'; \
104 else \
105 echo ' Not a git repository, skipping _version'; \
106 fi && \
107 echo ' Compiling PHAR...' && \
108 box compile && \
109 echo ' Fixing permissions...' && \
110 chown \${HOST_UID}:\${HOST_GID} /app/$BOX_OUTPUT && \
111 echo 'Done!'
112 "
113
114if [ -f "$BOX_OUTPUT" ]; then
115 echo "PHAR ready:"
116 ls -lh "$BOX_OUTPUT"
117else
118 echo "Error: $BOX_OUTPUT was not created."
119 exit 1
120fi
121
example_box.json Raw
1{
2 "chmod": "0755",
3 "compactors": [
4 "KevinGH\\Box\\Compactor\\Php",
5 "KevinGH\\Box\\Compactor\\Json"
6 ],
7 "compression": "GZ",
8 "main": "test_send.php",
9 "output": "mailer.phar",
10 "finder": [
11 {
12 "name": ["*.php", "*.json", "*.h", "*.so", "*.dll"],
13 "in": "vendor",
14 "exclude": [
15 ".github",
16 ".editorconfig",
17 "infection.json.dist",
18 ".php-cs-fixer.dist.php",
19 ".valgrindc",
20 "*.exe",
21 "*.md",
22 "LICENSE",
23 "psalm.xml",
24 "test",
25 "tests",
26 "Tests",
27 "examples",
28 ".gitignore",
29 ".hhconfig",
30 ".travis*",
31 "phpunit*",
32 "docs",
33 "doc"
34 ]
35 }
36 ],
37 "dump-autoload": true,
38 "check-requirements": false
39}
40