xref: /PHP-8.3/.github/nightly_matrix.php (revision e7462bff)
1<?php
2
3const BRANCHES = ['master', 'PHP-8.3', 'PHP-8.2', 'PHP-8.1', 'PHP-8.0'];
4
5function get_branch_commit_cache_file_path(): string {
6    return dirname(__DIR__) . '/branch-commit-cache.json';
7}
8
9function get_branch_matrix(array $branches) {
10    $result = array_map(function ($branch) {
11        $branch_key = strtoupper(str_replace('.', '', $branch));
12        return [
13            'name' => $branch_key,
14            'ref' => $branch,
15        ];
16    }, $branches);
17
18    return $result;
19}
20
21function get_branches() {
22    $branch_commit_cache_file = get_branch_commit_cache_file_path();
23    $branch_commit_map = [];
24    if (file_exists($branch_commit_cache_file)) {
25        $branch_commit_map = json_decode(file_get_contents($branch_commit_cache_file), JSON_THROW_ON_ERROR);
26    }
27
28    $changed_branches = [];
29    foreach (BRANCHES as $branch) {
30        $previous_commit_hash = $branch_commit_map[$branch] ?? null;
31        $current_commit_hash = trim(shell_exec('git rev-parse origin/' . $branch));
32
33        if ($previous_commit_hash !== $current_commit_hash) {
34            $changed_branches[] = $branch;
35        }
36
37        $branch_commit_map[$branch] = $current_commit_hash;
38    }
39
40    file_put_contents($branch_commit_cache_file, json_encode($branch_commit_map));
41
42    return get_branch_matrix($changed_branches);
43}
44
45function get_matrix_include(array $branches) {
46    $jobs = [];
47    foreach ($branches as $branch) {
48        $jobs[] = [
49            'name' => '_ASAN_UBSAN',
50            'branch' => $branch,
51            'debug' => true,
52            'zts' => true,
53            'configuration_parameters' => "CFLAGS='-fsanitize=undefined,address -DZEND_TRACK_ARENA_ALLOC' LDFLAGS='-fsanitize=undefined,address'",
54            'run_tests_parameters' => '--asan',
55            'test_function_jit' => false,
56            'asan' => true,
57        ];
58        if ($branch['ref'] !== 'PHP-8.0') {
59            $jobs[] = [
60                'name' => '_REPEAT',
61                'branch' => $branch,
62                'debug' => true,
63                'zts' => false,
64                'run_tests_parameters' => '--repeat 2',
65                'timeout_minutes' => 360,
66                'test_function_jit' => true,
67                'asan' => false,
68            ];
69            $jobs[] = [
70                'name' => '_VARIATION',
71                'branch' => $branch,
72                'debug' => true,
73                'zts' => true,
74                'configuration_parameters' => "CFLAGS='-DZEND_RC_DEBUG=1 -DPROFITABILITY_CHECKS=0 -DZEND_VERIFY_FUNC_INFO=1'",
75                'run_tests_parameters' => '-d zend_test.observer.enabled=1 -d zend_test.observer.show_output=0',
76                'timeout_minutes' => 360,
77                'test_function_jit' => true,
78                'asan' => false,
79            ];
80        }
81    }
82    return $jobs;
83}
84
85function get_windows_matrix_include(array $branches) {
86    $jobs = [];
87    foreach ($branches as $branch) {
88        $jobs[] = [
89            'branch' => $branch,
90            'x64' => true,
91            'zts' => true,
92            'opcache' => true,
93        ];
94        $jobs[] = [
95            'branch' => $branch,
96            'x64' => false,
97            'zts' => false,
98            'opcache' => false,
99        ];
100    }
101    return $jobs;
102}
103
104$trigger = $argv[1] ?? 'schedule';
105$attempt = (int) ($argv[2] ?? 1);
106$discard_cache = ($trigger === 'schedule' && $attempt !== 1) || $trigger === 'workflow_dispatch';
107if ($discard_cache) {
108    @unlink(get_branch_commit_cache_file_path());
109}
110
111$branches = get_branches();
112$matrix_include = get_matrix_include($branches);
113$windows_matrix_include = get_windows_matrix_include($branches);
114
115$f = fopen(getenv('GITHUB_OUTPUT'), 'a');
116fwrite($f, 'branches=' . json_encode($branches, JSON_UNESCAPED_SLASHES) . "\n");
117fwrite($f, 'matrix-include=' . json_encode($matrix_include, JSON_UNESCAPED_SLASHES) . "\n");
118fwrite($f, 'windows-matrix-include=' . json_encode($windows_matrix_include, JSON_UNESCAPED_SLASHES) . "\n");
119fclose($f);
120