added command to create release packages (for FTP user) (#642)
This commit is contained in:
@@ -27,7 +27,7 @@ Remember to execute the necessary timezone conversion script, if you haven't upd
|
|||||||
**BC BREAKS**
|
**BC BREAKS**
|
||||||
- in an ongoing effort to simplify future installation and upgrade processes the `.env` variable `DATABASE_PREFIX` was removed.
|
- in an ongoing effort to simplify future installation and upgrade processes the `.env` variable `DATABASE_PREFIX` was removed.
|
||||||
The table prefix is now hardcoded to `kimai2_`. If you used another prefix, you have to rename your tables manually
|
The table prefix is now hardcoded to `kimai2_`. If you used another prefix, you have to rename your tables manually
|
||||||
before starting the update process.
|
before starting the update process. You can also delete the row `DATABASE_PREFIX` from your `.env` file.
|
||||||
- API: DateTime objects will be returned including timezone identifier (previously 2019-03-02 14:23 - now 2019-03-02T14:23:00+00:00)
|
- API: DateTime objects will be returned including timezone identifier (previously 2019-03-02 14:23 - now 2019-03-02T14:23:00+00:00)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
154
src/Command/CreateReleaseCommand.php
Normal file
154
src/Command/CreateReleaseCommand.php
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Kimai time-tracking app.
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Command;
|
||||||
|
|
||||||
|
use App\Constants;
|
||||||
|
use Symfony\Component\Console\Command\Command;
|
||||||
|
use Symfony\Component\Console\Input\InputInterface;
|
||||||
|
use Symfony\Component\Console\Input\InputOption;
|
||||||
|
use Symfony\Component\Console\Output\OutputInterface;
|
||||||
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Command used to create a release package with pre-installed composer, SQLite database and user.
|
||||||
|
*/
|
||||||
|
class CreateReleaseCommand extends Command
|
||||||
|
{
|
||||||
|
const CLONE_CMD = 'git clone -b %s --depth 1 https://github.com/kevinpapst/kimai2.git';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $rootDir = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $projectDirectory
|
||||||
|
*/
|
||||||
|
public function __construct(string $projectDirectory)
|
||||||
|
{
|
||||||
|
$this->rootDir = realpath($projectDirectory);
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function configure()
|
||||||
|
{
|
||||||
|
$this
|
||||||
|
->setName('kimai:create-release')
|
||||||
|
->setDescription('Create a pre-installed release package')
|
||||||
|
->setHelp('This command will create a release package with pre-installed composer, SQLite database and user.')
|
||||||
|
->addOption('directory', null, InputOption::VALUE_OPTIONAL, 'Directory where the release package will be stored', 'var/data/')
|
||||||
|
->addOption('release', null, InputOption::VALUE_OPTIONAL, 'The version that should be zipped', Constants::VERSION)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param InputInterface $input
|
||||||
|
* @param OutputInterface $output
|
||||||
|
* @return int|null
|
||||||
|
*/
|
||||||
|
protected function execute(InputInterface $input, OutputInterface $output)
|
||||||
|
{
|
||||||
|
$io = new SymfonyStyle($input, $output);
|
||||||
|
|
||||||
|
if (getenv('APP_ENV') === 'prod') {
|
||||||
|
$io->error('kimai:create-release is not allowed in production');
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
$directory = $input->getOption('directory');
|
||||||
|
|
||||||
|
if ($directory[0] === '/') {
|
||||||
|
$directory = realpath($directory);
|
||||||
|
} else {
|
||||||
|
$directory = realpath($this->rootDir . '/' . $directory);
|
||||||
|
}
|
||||||
|
|
||||||
|
$tmpDir = $directory . '/' . uniqid('kimai_release_');
|
||||||
|
|
||||||
|
if (!is_dir($directory)) {
|
||||||
|
$io->error('Given directory is not existing: ' . $directory);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_dir($directory) && !is_writable($directory)) {
|
||||||
|
$io->error('Cannot write in directory: ' . $directory);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$version = $input->getOption('release');
|
||||||
|
|
||||||
|
$io->success('Prepare new packages for Kimai ' . $version . ' in ' . $tmpDir);
|
||||||
|
|
||||||
|
$gitCmd = sprintf(self::CLONE_CMD, $version);
|
||||||
|
$tar = 'kimai-release-' . $version;
|
||||||
|
$zip = 'kimai-release-' . $version;
|
||||||
|
|
||||||
|
if ($version === Constants::VERSION && Constants::STATUS !== 'stable') {
|
||||||
|
$tar .= '_' . Constants::STATUS;
|
||||||
|
$zip .= '_' . Constants::STATUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tar .= '.tar.gz';
|
||||||
|
$zip .= '.zip';
|
||||||
|
|
||||||
|
// this removes the current env settings, as they might differ from the release ones
|
||||||
|
// if we don't unset them, the .env file won't be read when executing bin/console commands
|
||||||
|
putenv('DATABASE_URL');
|
||||||
|
putenv('APP_ENV');
|
||||||
|
|
||||||
|
$commands = [
|
||||||
|
'Clone repository' => $gitCmd . ' ' . $tmpDir,
|
||||||
|
'Install composer dependencies' => 'cd ' . $tmpDir . ' && composer install --no-dev --optimize-autoloader',
|
||||||
|
'Create .env file' => 'cd ' . $tmpDir . ' && cp .env.dist .env',
|
||||||
|
'Create database' => 'cd ' . $tmpDir . ' && bin/console doctrine:database:create -n',
|
||||||
|
'Create tables' => 'cd ' . $tmpDir . ' && bin/console doctrine:schema:create -n',
|
||||||
|
'Add all migrations' => 'cd ' . $tmpDir . ' && bin/console doctrine:migrations:version --add --all -n',
|
||||||
|
];
|
||||||
|
|
||||||
|
$filesToDelete = [
|
||||||
|
'.git*',
|
||||||
|
'var/cache/*',
|
||||||
|
'var/data/kimai_test.sqlite',
|
||||||
|
'var/log/*.log',
|
||||||
|
'var/sessions/*',
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach($filesToDelete as $deleteMe) {
|
||||||
|
$commands['Delete ' . $deleteMe] = 'cd ' . $tmpDir . ' && rm -rf ' . $deleteMe;
|
||||||
|
}
|
||||||
|
|
||||||
|
$commands = array_merge($commands, [
|
||||||
|
'Create tar' => 'cd ' . $tmpDir . ' && tar -czf ' . $directory. '/' . $tar . ' .',
|
||||||
|
'Create zip' => 'cd ' . $tmpDir . ' && zip -r ' . $directory. '/' . $zip . ' .',
|
||||||
|
'Remove tmp directory' => 'rm -rf ' . $tmpDir,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$exitCode = 0;
|
||||||
|
foreach($commands as $title => $command) {
|
||||||
|
$io->success($title);
|
||||||
|
passthru($command, $exitCode);
|
||||||
|
if ($exitCode !== 0) {
|
||||||
|
$io->error('Failed with command: ' . $command);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$io->success(
|
||||||
|
'New release packages available at: ' . PHP_EOL .
|
||||||
|
$directory . '/' . $tar. PHP_EOL .
|
||||||
|
$directory . '/' . $zip
|
||||||
|
);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -49,6 +49,11 @@ EOT
|
|||||||
{
|
{
|
||||||
$io = new SymfonyStyle($input, $output);
|
$io = new SymfonyStyle($input, $output);
|
||||||
|
|
||||||
|
if (getenv('APP_ENV') === 'prod') {
|
||||||
|
$io->error('kimai:reset-dev is not allowed in production');
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->askConfirmation($input, $output, 'Do you want to create the database y/N ?')) {
|
if ($this->askConfirmation($input, $output, 'Do you want to create the database y/N ?')) {
|
||||||
try {
|
try {
|
||||||
$command = $this->getApplication()->find('doctrine:database:create');
|
$command = $this->getApplication()->find('doctrine:database:create');
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class Constants
|
|||||||
/**
|
/**
|
||||||
* The current release version
|
* The current release version
|
||||||
*/
|
*/
|
||||||
public const VERSION = '0.8.1';
|
public const VERSION = '0.9';
|
||||||
/**
|
/**
|
||||||
* The release name, will only change for new major version
|
* The release name, will only change for new major version
|
||||||
*/
|
*/
|
||||||
@@ -29,7 +29,7 @@ class Constants
|
|||||||
/**
|
/**
|
||||||
* The current release status, either "stable" or "dev"
|
* The current release status, either "stable" or "dev"
|
||||||
*/
|
*/
|
||||||
public const STATUS = 'stable';
|
public const STATUS = 'dev';
|
||||||
/**
|
/**
|
||||||
* Used in multiple views
|
* Used in multiple views
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -9,13 +9,7 @@
|
|||||||
|
|
||||||
namespace App\Tests\API;
|
namespace App\Tests\API;
|
||||||
|
|
||||||
use App\Configuration\LanguageFormattings;
|
|
||||||
use App\Entity\Activity;
|
|
||||||
use App\Entity\Customer;
|
|
||||||
use App\Entity\Project;
|
|
||||||
use App\Entity\User;
|
use App\Entity\User;
|
||||||
use App\Repository\Query\VisibilityQuery;
|
|
||||||
use Symfony\Bundle\FrameworkBundle\Client;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @coversDefaultClass \App\API\ConfigurationController
|
* @coversDefaultClass \App\API\ConfigurationController
|
||||||
|
|||||||
Reference in New Issue
Block a user