Squashed commit message
Some checks failed
Telegram Mini App Shop Builder / Compute version metadata (push) Has been cancelled
Telegram Mini App Shop Builder / Run Frontend tests (push) Has been cancelled
Telegram Mini App Shop Builder / Run Backend tests (push) Has been cancelled
Telegram Mini App Shop Builder / Run PHP_CodeSniffer (push) Has been cancelled
Telegram Mini App Shop Builder / Build module. (push) Has been cancelled
Telegram Mini App Shop Builder / release (push) Has been cancelled
Some checks failed
Telegram Mini App Shop Builder / Compute version metadata (push) Has been cancelled
Telegram Mini App Shop Builder / Run Frontend tests (push) Has been cancelled
Telegram Mini App Shop Builder / Run Backend tests (push) Has been cancelled
Telegram Mini App Shop Builder / Run PHP_CodeSniffer (push) Has been cancelled
Telegram Mini App Shop Builder / Build module. (push) Has been cancelled
Telegram Mini App Shop Builder / release (push) Has been cancelled
This commit is contained in:
34
scripts/build_phar.sh
Executable file
34
scripts/build_phar.sh
Executable file
@@ -0,0 +1,34 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
SRC_PATH="/app"
|
||||
BUILD_PATH="/build"
|
||||
MODULE_NAME="acmeshop"
|
||||
PHAR_PATH="${BUILD_PATH}/${MODULE_NAME}.phar"
|
||||
|
||||
echo "PHP Obfuscation: framework"
|
||||
yakpro-po --config-file /usr/local/yakpro-po/config.php ${SRC_PATH}/framework -o /tmp/obfuscated
|
||||
rm -rf ${SRC_PATH}/framework
|
||||
mv /tmp/obfuscated/yakpro-po/obfuscated ${SRC_PATH}/framework
|
||||
|
||||
echo "PHP Obfuscation: src"
|
||||
yakpro-po --config-file /usr/local/yakpro-po/config.php ${SRC_PATH}/src -o /tmp/obfuscated
|
||||
rm -rf ${SRC_PATH}/src
|
||||
mv /tmp/obfuscated/yakpro-po/obfuscated ${SRC_PATH}/src
|
||||
|
||||
echo "PHP Obfuscation: bastion"
|
||||
yakpro-po --config-file /usr/local/yakpro-po/config.php ${SRC_PATH}/bastion -o /tmp/obfuscated
|
||||
rm -rf ${SRC_PATH}/bastion
|
||||
mv /tmp/obfuscated/yakpro-po/obfuscated ${SRC_PATH}/bastion
|
||||
|
||||
echo "📜 Creating Phar archive..."
|
||||
rm -rf "${BUILD_PATH}/extracted"
|
||||
mkdir -p "${BUILD_PATH}"
|
||||
echo "Source path: ${SRC_PATH}"
|
||||
echo "Destination: ${PHAR_PATH}"
|
||||
php -d phar.readonly=0 /scripts/ci/create-phar.php "${SRC_PATH}" "${PHAR_PATH}"
|
||||
|
||||
|
||||
echo "Extracting ..."
|
||||
php -d phar.readonly=0 /scripts/ci/extract-phar.php "${PHAR_PATH}" "${BUILD_PATH}/extracted"
|
||||
157
scripts/ci/build.sh
Executable file
157
scripts/ci/build.sh
Executable file
@@ -0,0 +1,157 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
MODULE_NAME="acmeshop"
|
||||
CURRENT_DIR="$(dirname "$0")"
|
||||
|
||||
echo "Current dir: ${CURRENT_DIR}"
|
||||
composer --version
|
||||
node --version
|
||||
php -v
|
||||
|
||||
SRC_PATH="$1"
|
||||
BUILD_PATH="${GITHUB_WORKSPACE}/build"
|
||||
|
||||
mkdir -p "$BUILD_PATH"
|
||||
|
||||
echo "🔨 Starting build process..."
|
||||
echo "ℹ️ Source path: ${SRC_PATH}"
|
||||
echo "ℹ️ Build path: ${BUILD_PATH}"
|
||||
|
||||
if [ -z "$BUILD_PATH" ]; then
|
||||
echo "❌ Error: BUILD_PATH is required"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$SRC_PATH" ]; then
|
||||
echo "❌ Error: SRC_PATH is required"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Build Megapay SPA Frontend..."
|
||||
cd "${SRC_PATH}/frontend/spa"
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
echo "Move manifest file"
|
||||
cp "${SRC_PATH}/module/acmeshop/upload/image/catalog/tgshopspa/.vite/manifest.json" "${SRC_PATH}/module/acmeshop/upload/image/catalog/tgshopspa/manifest.json"
|
||||
rm -rf "${SRC_PATH}/module/acmeshop/upload/image/catalog/tgshopspa/.vite"
|
||||
|
||||
echo "Build Admin Frontend"
|
||||
cd "${SRC_PATH}/frontend/admin"
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
echo "Calculate MD5 hash sum"
|
||||
cd ../../module/acmeshop/upload/admin/view/javascript/acmeshop
|
||||
FILES=("acmeshop.css" "acmeshop.js")
|
||||
HASH=$(cat "${FILES[@]}" | md5sum | awk '{print $1}')
|
||||
OUTPUT="checksum.hash"
|
||||
echo "$HASH" > "$OUTPUT"
|
||||
echo "Checksum in $OUTPUT: $HASH"
|
||||
|
||||
cd "$SRC_PATH"
|
||||
|
||||
echo "Cleanup frontend"
|
||||
rm -fv module/acmeshop/upload/image/catalog/tgshopspa/vite.svg
|
||||
rm -fv module/acmeshop/upload/image/catalog/tgshopspa/assets/*.map
|
||||
rm -fv module/acmeshop/upload/admin/view/integration.js
|
||||
rm -fv module/acmeshop/upload/admin/view/javascript/acmeshop/acmeshop.js.map
|
||||
rm -fv module/acmeshop/upload/admin/view/javascript/acmeshop/favicon.ico
|
||||
|
||||
echo "Install Composer dependencies."
|
||||
cd "${SRC_PATH}/module/acmeshop/upload/acmeshop"
|
||||
composer install \
|
||||
--prefer-dist \
|
||||
--no-dev \
|
||||
--optimize-autoloader \
|
||||
--no-interaction \
|
||||
--no-cache
|
||||
|
||||
cd "$SRC_PATH"
|
||||
|
||||
echo "Copy .env for production"
|
||||
cp "${SRC_PATH}/module/acmeshop/upload/acmeshop/.env.production" \
|
||||
"${SRC_PATH}/module/acmeshop/upload/acmeshop/.env"
|
||||
|
||||
# PHP Obfuscation
|
||||
# Temporary disabled
|
||||
#echo "Install PHP Obfuscation lib"
|
||||
#cd "${GITHUB_WORKSPACE}"
|
||||
#echo "Download yakpro-po"
|
||||
#wget https://github.com/pk-fr/yakpro-po/archive/refs/heads/master.zip
|
||||
#unzip -oq "master.zip"
|
||||
#rm master.zip
|
||||
#cd "${GITHUB_WORKSPACE}/yakpro-po-master"
|
||||
#echo "Download PHP-Parser"
|
||||
#wget https://github.com/nikic/PHP-Parser/archive/refs/heads/4.x.zip -O parser.zip
|
||||
#unzip -oq "parser.zip"
|
||||
#mv PHP-Parser-4.x PHP-Parser
|
||||
#chmod a+x "${GITHUB_WORKSPACE}/yakpro-po-master/yakpro-po.php"
|
||||
#
|
||||
#echo "Version 4.19.4 (2024-09-29)" >> "${GITHUB_WORKSPACE}/yakpro-po-master/PHP-Parser/CHANGELOG.md"
|
||||
#
|
||||
#echo "PHP Obfuscation: framework"
|
||||
#php "${GITHUB_WORKSPACE}/yakpro-po-master/yakpro-po.php" --silent --config-file \
|
||||
# "${SRC_PATH}/docker/config.php" \
|
||||
# "${SRC_PATH}/module/acmeshop/upload/acmeshop/framework" \
|
||||
# -o /tmp/obfuscated
|
||||
#rm -rf "${SRC_PATH}/module/acmeshop/upload/acmeshop/framework"
|
||||
#mv /tmp/obfuscated/yakpro-po/obfuscated "${SRC_PATH}/module/acmeshop/upload/acmeshop/framework"
|
||||
#
|
||||
#echo "PHP Obfuscation: src"
|
||||
#php "${GITHUB_WORKSPACE}/yakpro-po-master/yakpro-po.php" --silent --config-file \
|
||||
# "${SRC_PATH}/docker/config.php" \
|
||||
# "${SRC_PATH}/module/acmeshop/upload/acmeshop/src" \
|
||||
# -o /tmp/obfuscated
|
||||
#rm -rf "${SRC_PATH}/module/acmeshop/upload/acmeshop/src"
|
||||
#mv /tmp/obfuscated/yakpro-po/obfuscated "${SRC_PATH}/module/acmeshop/upload/acmeshop/src"
|
||||
#
|
||||
#echo "PHP Obfuscation: bastion"
|
||||
#php "${GITHUB_WORKSPACE}/yakpro-po-master/yakpro-po.php" --silent --config-file \
|
||||
# "${SRC_PATH}/docker/config.php" \
|
||||
# "${SRC_PATH}/module/acmeshop/upload/acmeshop/bastion" \
|
||||
# -o /tmp/obfuscated
|
||||
#rm -rf "${SRC_PATH}/module/acmeshop/upload/acmeshop/bastion"
|
||||
#mv /tmp/obfuscated/yakpro-po/obfuscated "${SRC_PATH}/module/acmeshop/upload/acmeshop/bastion"
|
||||
|
||||
cd "$SRC_PATH"
|
||||
|
||||
echo "📜 Creating Phar archive..."
|
||||
rm -rf \
|
||||
"${SRC_PATH}/module/acmeshop/upload/acmeshop/tests" \
|
||||
"${SRC_PATH}/module/acmeshop/upload/acmeshop/phpunit.xml" \
|
||||
"${SRC_PATH}/module/acmeshop/upload/acmeshop/psalm.xml" \
|
||||
"${SRC_PATH}/module/acmeshop/upload/acmeshop/psalm-classes.php" \
|
||||
"${SRC_PATH}/module/acmeshop/upload/acmeshop/psalm-stubs.php"
|
||||
|
||||
php -d phar.readonly=0 scripts/ci/create-phar.php "${SRC_PATH}/module/acmeshop/upload/acmeshop" "${MODULE_NAME}.phar"
|
||||
|
||||
echo "📦 Packaging into .ocmod.zip..."
|
||||
mkdir -p "${SRC_PATH}/module/acmeshop/upload/system/library/acmeshop"
|
||||
mv "${MODULE_NAME}.phar" "${SRC_PATH}/module/acmeshop/upload/system/library/acmeshop"
|
||||
mv "${SRC_PATH}/module/acmeshop/upload/cli.php" "${SRC_PATH}/module/acmeshop/upload/system/library/acmeshop"
|
||||
chmod +x "${SRC_PATH}/module/acmeshop/upload/system/library/acmeshop/cli.php"
|
||||
|
||||
rm -rf \
|
||||
"${SRC_PATH}/module/acmeshop/upload/acmeshop"
|
||||
|
||||
cd "${SRC_PATH}/module/acmeshop/"
|
||||
echo "List files"
|
||||
ls -la ./upload
|
||||
zip -rqq "${MODULE_NAME}.ocmod.zip" .
|
||||
mv "${MODULE_NAME}.ocmod.zip" "${BUILD_PATH}"
|
||||
|
||||
FINAL_FILE="${BUILD_PATH}/${MODULE_NAME}.ocmod.zip"
|
||||
|
||||
if [ -f "$FINAL_FILE" ]; then
|
||||
FILE_SIZE=$(du -h "$FINAL_FILE" | cut -f1)
|
||||
echo -e "✅ Build completed successfully!"
|
||||
echo -e "🎉 Created: $FINAL_FILE ($FILE_SIZE)"
|
||||
else
|
||||
echo "❌ Error: Final build file not found: $FINAL_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "🎯 Build artifact ready for installation!"
|
||||
37
scripts/ci/create-phar.php
Normal file
37
scripts/ci/create-phar.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
$sourcePath = $argv[1] ?? null;
|
||||
$pharFile = $argv[2] ?? null;
|
||||
|
||||
if (! $sourcePath) {
|
||||
throw new InvalidArgumentException('Source path must be provided');
|
||||
}
|
||||
|
||||
if (! $pharFile) {
|
||||
throw new InvalidArgumentException('Phar file must be provided');
|
||||
}
|
||||
|
||||
// Remove old file if exists
|
||||
if (file_exists($pharFile)) {
|
||||
unlink($pharFile);
|
||||
}
|
||||
|
||||
// Create new Phar archive
|
||||
$phar = new Phar($pharFile);
|
||||
|
||||
// Start buffering
|
||||
$phar->startBuffering();
|
||||
|
||||
// Add files from source directory
|
||||
|
||||
$phar->buildFromDirectory($sourcePath);
|
||||
|
||||
// (Optional) Set stub file — main entry point
|
||||
// $phar->setStub($phar->createDefaultStub('index.php'));
|
||||
|
||||
$phar->compressFiles(Phar::GZ);
|
||||
|
||||
// Stop buffering and write
|
||||
$phar->stopBuffering();
|
||||
|
||||
echo "Phar created: $pharFile\n";
|
||||
17
scripts/ci/extract-phar.php
Normal file
17
scripts/ci/extract-phar.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
$pharFile = $argv[1] ?? null;
|
||||
$dstPath = $argv[2] ?? null;
|
||||
|
||||
if (! $dstPath) {
|
||||
throw new InvalidArgumentException('Dst path must be provided');
|
||||
}
|
||||
|
||||
if (! $pharFile) {
|
||||
throw new InvalidArgumentException('Phar file must be provided');
|
||||
}
|
||||
|
||||
$phar = new Phar($pharFile);
|
||||
$phar->extractTo($dstPath);
|
||||
|
||||
echo "Phar extracted: $pharFile\n";
|
||||
35
scripts/download_oc_store.sh
Executable file
35
scripts/download_oc_store.sh
Executable file
@@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
|
||||
# The script downloads and unzip ocStore.
|
||||
# Should be executed from the project root folder.
|
||||
|
||||
set -e
|
||||
|
||||
OCSTORE_VERSION=v3.0.3.7
|
||||
CACHE_DIR=.cache
|
||||
|
||||
echo "👽 Downloading ocStore ${OCSTORE_VERSION}..."
|
||||
|
||||
DOWNLOAD_URL="https://github.com/ocStore/ocStore/archive/refs/tags/$OCSTORE_VERSION.zip"
|
||||
|
||||
FILE_PATH="$CACHE_DIR/$OCSTORE_VERSION.zip"
|
||||
|
||||
if [ ! -f "$FILE_PATH" ]; then
|
||||
mkdir -p "$CACHE_DIR"
|
||||
wget -P "$CACHE_DIR" "$DOWNLOAD_URL"
|
||||
else
|
||||
echo "😎 Get file from cache: $FILE_PATH"
|
||||
fi
|
||||
|
||||
echo "🗃 Unzipping..."
|
||||
rm -rf src/*
|
||||
|
||||
unzip -q "$FILE_PATH" -d ./src
|
||||
SOURCE_DIR=src/ocStore-${OCSTORE_VERSION//v/}
|
||||
|
||||
rsync -a $SOURCE_DIR/* ./src
|
||||
rm -rf $SOURCE_DIR
|
||||
|
||||
chmod -R 775 src
|
||||
|
||||
echo "✅ Completed."
|
||||
42
scripts/install_ocstore.sh
Executable file
42
scripts/install_ocstore.sh
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
|
||||
# The script install ocStore.
|
||||
# Should be executed from the project root folder.
|
||||
|
||||
echo "Setup ocStore..."
|
||||
|
||||
set -e
|
||||
|
||||
docker compose down -v && docker compose up -d web mysql --remove-orphans
|
||||
|
||||
bash ./scripts/wait_for_containers.sh
|
||||
bash ./scripts/wait_for_mysql.sh
|
||||
|
||||
echo "Install composer dependencies..."
|
||||
docker compose exec web bash -c "cd /web; composer update"
|
||||
|
||||
docker compose exec web bash -c '\
|
||||
cd /web/upload/install; \
|
||||
php cli_install.php install \
|
||||
--db_hostname mysql \
|
||||
--db_username root \
|
||||
--db_password secret \
|
||||
--db_database ocstore3 \
|
||||
--db_driver mysqli \
|
||||
--db_port 3306 \
|
||||
--username admin \
|
||||
--password admin \
|
||||
--email youremail@example.com \
|
||||
--http_server https://api.example.com/; exit $?'
|
||||
|
||||
docker compose exec web bash -c "cd /web; composer update"
|
||||
echo "Moving storage folder outside the system."
|
||||
mv src/upload/system/storage src/
|
||||
|
||||
docker compose exec web bash -c "\
|
||||
sed -i \"s/DIR_SYSTEM \. 'storage\/'/'\/web\/storage\/'/g\" /web/upload/config.php
|
||||
sed -i \"s/DIR_SYSTEM \. 'storage\/'/'\/web\/storage\/'/g\" /web/upload/admin/config.php"
|
||||
|
||||
rm -rf src/upload/install
|
||||
|
||||
echo "OcStore successfully installed."
|
||||
40
scripts/link.php
Normal file
40
scripts/link.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
$module = 'acmeshop';
|
||||
|
||||
$basePath = dirname(__DIR__) . '/';
|
||||
|
||||
if ($basePath === '//') {
|
||||
$basePath = '/';
|
||||
}
|
||||
|
||||
$modulesPath = $basePath . 'module/';
|
||||
$modulePath = $modulesPath . $module . '/upload/';
|
||||
|
||||
$files = [];
|
||||
|
||||
$iterator = new RecursiveDirectoryIterator($modulePath);
|
||||
$recursiveIterator = new RecursiveIteratorIterator($iterator);
|
||||
|
||||
/** @var SplFileInfo $file */
|
||||
foreach ($recursiveIterator as $file) {
|
||||
if ($file->isFile() && fnmatch($pattern = '*', $file->getFilename())) {
|
||||
$files[] = $file->getRealPath();
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($files as $file) {
|
||||
$link = $basePath . 'web/upload/' . str_replace($modulePath, '', $file);
|
||||
|
||||
if (! is_dir(dirname($link))) {
|
||||
if (!mkdir($concurrentDirectory = dirname($link), 0775, true) && !is_dir($concurrentDirectory)) {
|
||||
throw new \RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory));
|
||||
}
|
||||
}
|
||||
|
||||
echo sprintf('%s => %s', $file, $link) . PHP_EOL;
|
||||
|
||||
@unlink($link);
|
||||
symlink($file, $link);
|
||||
chmod($link, 0777);
|
||||
}
|
||||
28
scripts/wait_for_containers.sh
Executable file
28
scripts/wait_for_containers.sh
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
SERVICES=("web" "mysql")
|
||||
|
||||
function check_containers {
|
||||
for service in "${SERVICES[@]}"; do
|
||||
if ! docker compose ps $service | grep "Up" > /dev/null; then
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
return 0
|
||||
}
|
||||
|
||||
echo "Waiting for docker containers..."
|
||||
|
||||
MAX_WAIT_TIME=60
|
||||
WAIT_TIME=0
|
||||
|
||||
while ! check_containers; do
|
||||
if [ $WAIT_TIME -ge $MAX_WAIT_TIME ]; then
|
||||
echo "Containers have not started within $MAX_WAIT_TIME seconds. Exit."
|
||||
exit 1
|
||||
fi
|
||||
sleep 1
|
||||
WAIT_TIME=$((WAIT_TIME + 1))
|
||||
done
|
||||
|
||||
echo "All docker containers executed."
|
||||
24
scripts/wait_for_mysql.sh
Normal file
24
scripts/wait_for_mysql.sh
Normal file
@@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
|
||||
MYSQL_SERVICE="mysql"
|
||||
|
||||
function check_mysql {
|
||||
docker compose exec $MYSQL_SERVICE mysqladmin ping --silent
|
||||
}
|
||||
|
||||
echo "Waiting for MySQL..."
|
||||
|
||||
MAX_WAIT_TIME=60
|
||||
WAIT_TIME=0
|
||||
|
||||
while ! check_mysql; do
|
||||
if [ $WAIT_TIME -ge $MAX_WAIT_TIME ]; then
|
||||
echo "MySQL has not been available for $MAX_WAIT_TIME secods. Exit."
|
||||
exit 1
|
||||
fi
|
||||
sleep 1
|
||||
WAIT_TIME=$((WAIT_TIME + 1))
|
||||
done
|
||||
|
||||
sleep 5
|
||||
echo "MySQL ready."
|
||||
Reference in New Issue
Block a user