mautic / build /package_release.php
chrisbryan17's picture
Upload folder using huggingface_hub
d2897cd verified
<?php
$criticalMigrations = []; // List of critical migrations
$baseDir = __DIR__;
// Check if the version is in a branch or tag
$args = getopt('b::', ['repackage']);
$gitSourceLocation = (isset($args['b'])) ? ' ' : ' tags/';
/*
* Build a release package, this should be run after the new version is tagged; note the tag must match the version string in AppKernel
* so if the version string is 1.0.0-beta2 then the tag must be 1.0.0-beta2
*/
// We need the version number so get the app kernel
require_once dirname(__DIR__).'/vendor/autoload.php';
require_once dirname(__DIR__).'/app/AppKernel.php';
$releaseMetadata = \Mautic\CoreBundle\Release\ThisRelease::getMetadata();
$appVersion = $releaseMetadata->getVersion();
$minimalVersion = $releaseMetadata->getMinSupportedMauticVersion();
// Use branch if applicable otherwise a version tag
$gitSource = (!empty($args['b'])) ? $args['b'] : $appVersion;
if (!isset($args['repackage'])) {
// Preparation - Remove previous packages
echo "Preparing environment\n";
umask(022);
chdir(__DIR__);
system('rm -rf packaging');
// Preparation - Provision packaging space
mkdir(__DIR__.'/packaging');
// Grab the system git path so we can process git commands
ob_start();
passthru('which git', $systemGit);
$systemGit = trim(ob_get_clean());
// set the diff limit to ensure we get all files
system($systemGit.' config diff.renamelimit 8192');
// Checkout the version tag into the packaging space
chdir(dirname(__DIR__));
system($systemGit.' archive '.$gitSource.' | tar -x -C '.__DIR__.'/packaging', $result);
// Get a list of all files in this release
ob_start();
passthru($systemGit.' ls-tree -r -t --name-only '.$gitSource, $releaseFiles);
$releaseFiles = explode("\n", trim(ob_get_clean()));
if (0 !== $result) {
exit;
}
chdir(__DIR__);
system('cd '.__DIR__.'/packaging && composer install --no-dev --no-scripts --optimize-autoloader && cd ..', $result);
if (0 !== $result) {
exit;
}
// Compile prod assets
system('cd '.__DIR__.'/packaging && npm ci && npx patch-package && php bin/console mautic:assets:generate -e prod', $result);
if (0 !== $result) {
exit;
}
// Common steps
include_once __DIR__.'/processfiles.php';
// In this step, we'll compile a list of files that may have been deleted so our update script can remove them
// First, get a list of git tags since the minimal version.
ob_start();
passthru($systemGit.' for-each-ref --sort=creatordate --format \'%(refname)\' refs/tags | cut -d\/ -f3 | sed \'/-/!{s/$/_/}\' | sort -V | sed \'s/_$//\' | sed -n \'/^'.$minimalVersion.'$/,${p;/^'.$gitSource.'$/q}\' | sed \'$d\'', $tags);
$tags = explode("\n", trim(ob_get_clean()));
// Only add deleted files to our list; new and modified files will be covered by the archive
$deletedFiles = [];
$modifiedFiles = [
'deleted_files.txt' => true,
'critical_migrations.txt' => true,
'upgrade.php' => true,
// Temp fix for GrapesJs builder
'plugins/GrapesJsBuilderBundle/' => true,
];
// Ensure the generated media files don't end up in the deleted files by explicitly adding them to the release files.
foreach (['css', 'js', 'libraries/ckeditor', 'libraries/ckeditor/translations'] as $dir) {
$files = array_diff(scandir(__DIR__.'/packaging/media/'.$dir), ['..', '.']);
array_walk($files, function (&$item) use ($dir) { $item = 'media/'.$dir.'/'.$item; });
$releaseFiles = array_merge($releaseFiles, $files);
}
// Create a flag to check if the vendors changed
$vendorsChanged = false;
// Get a list of changed files since 1.0.0
foreach ($tags as $tag) {
ob_start();
passthru($systemGit.' diff tags/'.$tag.$gitSourceLocation.$gitSource.' --name-status', $fileDiff);
$fileDiff = explode("\n", trim(ob_get_clean()));
foreach ($fileDiff as $fileInfo) {
[$type, $filename, $newFileName] = explode("\t", $fileInfo."\t");
$folderPath = explode('/', $filename);
$baseFolderName = $folderPath[0];
if (!$vendorsChanged && 'composer.lock' == $filename) {
$vendorsChanged = true;
}
if ('D' == $type) {
if (!in_array($filename, $releaseFiles)) {
$deletedFiles[$filename] = true;
}
} elseif (str_starts_with($type, 'R')) {
if (!in_array($filename, $releaseFiles)) {
$deletedFiles[$filename] = true;
}
$modifiedFiles[$newFileName] = true;
} elseif (in_array($filename, $releaseFiles)) {
$modifiedFiles[$filename] = true;
}
}
}
// Include assets just in case they weren't
$assetFiles = [
'media/css/' => true,
'media/js/' => true,
'media/libraries/' => true,
];
$modifiedFiles = $modifiedFiles + $assetFiles;
// Package the vendor folder if the lock changed
if ($vendorsChanged) {
$modifiedFiles['vendor/'] = true;
$modifiedFiles['app/bootstrap.php.cache'] = true;
}
$modifiedFiles = array_keys($modifiedFiles);
sort($modifiedFiles);
$deletedFiles = array_keys($deletedFiles);
sort($deletedFiles);
// Write our files arrays into text files
file_put_contents(__DIR__.'/packaging/deleted_files.txt', json_encode($deletedFiles));
file_put_contents(__DIR__.'/packaging/modified_files.txt', implode("\n", $modifiedFiles));
file_put_contents(__DIR__.'/packaging/critical_migrations.txt', json_encode($criticalMigrations));
}
// Post-processing - ZIP it up
chdir(__DIR__.'/packaging');
system("rm -f ../packages/{$appVersion}.zip ../packages/{$appVersion}-update.zip");
echo "Packaging Mautic Full Installation\n";
system('zip -qr ../packages/'.$appVersion.'.zip . -x@../exclude_files.txt -x@../exclude_files_full.txt');
system('zip -qr ../packages/'.$appVersion.'.zip ./config/.gitkeep');
echo "Packaging Mautic Update Package\n";
system('zip -qr ../packages/'.$appVersion.'-update.zip -x@../exclude_files.txt -@ < modified_files.txt');
system('zip -qr ../packages/'.$appVersion.'-update.zip ./config/.gitkeep');
// Write output to file (so that the CI pipeline can add it to the release notes), then output to console
system('cd ../packages && openssl sha1 '.$appVersion.'.zip > build-sha1-all');
system('cd ../packages && openssl sha1 '.$appVersion.'-update.zip >> build-sha1-all');
system('cat ../packages/build-sha1-all');