Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 154 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
name: CI

on:
push:
branches: [ master ]
pull_request:
branches: [ master ]

jobs:
unit-tests:
name: Unit Tests (PHP ${{ matrix.php }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php: ['8.1', '8.2', '8.3', '8.4']

steps:
- uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: redis, mongodb, pdo_mysql, pdo_sqlite, mysqli, sockets, pcntl
coverage: none

- name: Install dependencies
run: composer install --prefer-dist --no-progress

- name: Run unit tests
run: bin/phpunit --testsuite unit

integration-tests:
name: Integration Tests (PHP ${{ matrix.php }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php: ['8.1', '8.3']
include:
- php: '8.3'
coverage: true

services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: queue_test
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping -h 127.0.0.1"
--health-interval=10s
--health-timeout=10s
--health-retries=20
--health-start-period=60s

redis:
image: redis:7
ports:
- 6379:6379
options: >-
--health-cmd="redis-cli ping"
--health-interval=10s
--health-timeout=5s
--health-retries=5

mongodb:
image: mongo:6
ports:
- 27017:27017
options: >-
--health-cmd="mongosh --eval 'db.runCommand(\"ping\").ok' --quiet"
--health-interval=10s
--health-timeout=10s
--health-retries=10
--health-start-period=30s

rabbitmq:
image: rabbitmq:3-management
ports:
- 5672:5672
options: >-
--health-cmd="rabbitmq-diagnostics -q ping"
--health-interval=15s
--health-timeout=10s
--health-retries=20
--health-start-period=90s

postgres:
image: postgres:16
env:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
POSTGRES_DB: queue_test
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U root -d queue_test"
--health-interval=10s
--health-timeout=5s
--health-retries=10
--health-start-period=15s

beanstalkd:
image: schickling/beanstalkd
ports:
- 11300:11300

steps:
- uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: redis, mongodb, pdo_mysql, pdo_pgsql, pdo_sqlite, mysqli, sockets, pcntl
coverage: ${{ matrix.coverage && 'xdebug' || 'none' }}

- name: Install dependencies
run: composer install --prefer-dist --no-progress

- name: Run integration tests
env:
REDIS_HOST: 127.0.0.1
MYSQL_HOST: 127.0.0.1
MYSQL_USER: root
MYSQL_PASSWORD: root
MYSQL_DATABASE: queue_test
MONGODB_HOST: 127.0.0.1
RABBIT_MQ_HOST: 127.0.0.1
BEANSTALKD_HOST: 127.0.0.1
BEANSTALKD_PORT: 11300
POSTGRES_HOST: 127.0.0.1
POSTGRES_USER: root
POSTGRES_PASSWORD: root
POSTGRES_DATABASE: queue_test
run: |
if [ "${{ matrix.coverage }}" = "true" ]; then
php -d memory_limit=-1 bin/phpunit --testsuite integration --coverage-clover=coverage.xml
else
php -d memory_limit=-1 bin/phpunit --testsuite integration
fi

- name: Upload coverage to Codecov
if: matrix.coverage
uses: codecov/codecov-action@v4
with:
file: coverage.xml
fail_ci_if_error: false
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
2 changes: 1 addition & 1 deletion Command/CreateJobCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ protected function decodePHPArgs($phpArgs)
if (1 !== count($phpArgs)) {
throw new \InvalidArgumentException('args should be a single string containing a PHP-encoded array when using --php-args');
}
$args = unserialize($phpArgs[0]);
$args = unserialize($phpArgs[0], ['allowed_classes' => true]);

return $this->testArgs('PHP', $args);
}
Expand Down
22 changes: 2 additions & 20 deletions Command/RunCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,36 +12,18 @@
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\HttpKernel\Kernel;

class RunCommand extends Command
{
protected $loggerPrivate = false;
protected $nanoSleepOption = null;

/** @var Loop */
private $runLoop;
/** @var LoggerInterface */
private $logger;
/** @var Container */
private $container;

protected function symfonyDetect()
{
$this->nanoSleepOption = null;
if (class_exists('Symfony\Component\HttpKernel\Kernel')) {
if (Kernel::VERSION_ID >= 30000) {
$this->nanoSleepOption = 's';
}
if (Kernel::VERSION_ID >= 30400) {
$this->loggerPrivate = true;
}
}
}

protected function configure(): void
{
$this->symfonyDetect();
$options = [
new InputArgument('worker-name', InputArgument::OPTIONAL, 'Name of worker', null),
new InputArgument('method', InputArgument::OPTIONAL, 'DI method of worker', null),
Expand Down Expand Up @@ -75,7 +57,7 @@ protected function configure(): void
),
new InputOption(
'nano-sleep',
$this->nanoSleepOption,
's',
InputOption::VALUE_REQUIRED,
'If using duration, this is the time to sleep when there\'s no jobs in nanoseconds',
500000000
Expand Down Expand Up @@ -128,7 +110,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
$duration = $input->getOption('duration');
$processTimeout = $input->getOption('timeout');
$nanoSleep = $input->getOption('nano-sleep');
$loggerService = !$this->loggerPrivate ? $input->getOption('logger', null) : null;
$loggerService = null;
$disableGc = $input->getOption('disable-gc', false);
$this->setGc($disableGc);

Expand Down
70 changes: 9 additions & 61 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
use Dtc\QueueBundle\Manager\PriorityJobManager;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\HttpKernel\Kernel;

class Configuration implements ConfigurationInterface
{
Expand All @@ -20,13 +19,7 @@ class Configuration implements ConfigurationInterface
public function getConfigTreeBuilder(): TreeBuilder
{
$treeBuilder = new TreeBuilder('dtc_queue');

if (method_exists($treeBuilder, 'getRootNode')) {
$rootNode = $treeBuilder->getRootNode();
} else {
// BC layer for symfony/config 4.1 and older
$rootNode = $treeBuilder->root('dtc_queue');
}
$rootNode = $treeBuilder->getRootNode();

$node = $rootNode
->children()
Expand Down Expand Up @@ -67,26 +60,15 @@ public function getConfigTreeBuilder(): TreeBuilder
public function setDeprecatedNode($node, $type, $name, $deprecatedMessage)
{
$node = $node->$type($name);

if (Kernel::VERSION_ID >= 50100) {
$node = $node->setDeprecated('mmucklo/queue-bundle', '5.1', $deprecatedMessage);
} elseif (Kernel::VERSION_ID >= 30400) {
$node = $node->setDeprecated($deprecatedMessage);
}
$node = $node->setDeprecated('mmucklo/queue-bundle', '5.1', $deprecatedMessage);

return $node->end();
}

protected function addTimings()
{
$treeBuilder = new TreeBuilder('timings');

if (method_exists($treeBuilder, 'getRootNode')) {
$rootNode = $treeBuilder->getRootNode();
} else {
// BC layer for symfony/config 4.1 and older
$rootNode = $treeBuilder->root('timings');
}
$rootNode = $treeBuilder->getRootNode();

$rootNode
->addDefaultsIfNotSet()
Expand All @@ -109,13 +91,7 @@ protected function addTimings()
protected function addSimpleScalar($rootName, $nodeName, $info, $defaultValue = 'default')
{
$treeBuilder = new TreeBuilder($rootName);

if (method_exists($treeBuilder, 'getRootNode')) {
$rootNode = $treeBuilder->getRootNode();
} else {
// BC layer for symfony/config 4.1 and older
$rootNode = $treeBuilder->root($rootName);
}
$rootNode = $treeBuilder->getRootNode();

$rootNode
->addDefaultsIfNotSet()
Expand All @@ -133,13 +109,8 @@ protected function addSimpleScalar($rootName, $nodeName, $info, $defaultValue =
protected function addManager()
{
$treeBuilder = new TreeBuilder('manager');
$rootNode = $treeBuilder->getRootNode();

if (method_exists($treeBuilder, 'getRootNode')) {
$rootNode = $treeBuilder->getRootNode();
} else {
// BC layer for symfony/config 4.1 and older
$rootNode = $treeBuilder->root('manager');
}
$rootNode
->addDefaultsIfNotSet()
->children()
Expand All @@ -158,13 +129,7 @@ protected function addManager()
protected function addBeanstalkd()
{
$treeBuilder = new TreeBuilder('beanstalkd');

if (method_exists($treeBuilder, 'getRootNode')) {
$rootNode = $treeBuilder->getRootNode();
} else {
// BC layer for symfony/config 4.1 and older
$rootNode = $treeBuilder->root('beanstalkd');
}
$rootNode = $treeBuilder->getRootNode();

$rootNode
->children()
Expand All @@ -181,13 +146,7 @@ protected function addBeanstalkd()
protected function addRetry()
{
$treeBuilder = new TreeBuilder('retry');

if (method_exists($treeBuilder, 'getRootNode')) {
$rootNode = $treeBuilder->getRootNode();
} else {
// BC layer for symfony/config 4.1 and older
$rootNode = $treeBuilder->root('retry');
}
$rootNode = $treeBuilder->getRootNode();

$rootNode
->addDefaultsIfNotSet()
Expand Down Expand Up @@ -234,13 +193,8 @@ protected function addRetry()
protected function addPriority()
{
$treeBuilder = new TreeBuilder('priority');
$rootNode = $treeBuilder->getRootNode();

if (method_exists($treeBuilder, 'getRootNode')) {
$rootNode = $treeBuilder->getRootNode();
} else {
// BC layer for symfony/config 4.1 and older
$rootNode = $treeBuilder->root('priority');
}
$rootNode
->addDefaultsIfNotSet()
->children()
Expand All @@ -262,13 +216,7 @@ protected function addPriority()
protected function addClasses()
{
$treeBuilder = new TreeBuilder('class');

if (method_exists($treeBuilder, 'getRootNode')) {
$rootNode = $treeBuilder->getRootNode();
} else {
// BC layer for symfony/config 4.1 and older
$rootNode = $treeBuilder->root('class');
}
$rootNode = $treeBuilder->getRootNode();

$rootNode
->children()
Expand Down
Loading
Loading