Compare commits

..

58 Commits
2.8.0 ... 2.9.0

Author SHA1 Message Date
b2f833f7d1 Fix extension setup 2021-06-04 21:23:57 +05:30
86e1ccdd8d Fix pdo setup 2021-02-19 13:30:02 +05:30
36ec0200a6 Fix cache support for cubrid and pdo_cubrid 2021-02-19 07:18:39 +05:30
1686147b24 Do not quote ini values with error constants 2021-02-04 13:01:05 +05:30
ecc8611061 Update README 2021-02-04 11:00:28 +05:30
abefdb50ee Fix composer config syntax 2021-02-04 11:00:27 +05:30
2ea6ca5b36 Update brew for all PHP versions until updated on images 2021-02-04 11:00:20 +05:30
a83d4379b1 Fix pcov on PHP 8.0 on Windows 2021-01-19 20:36:17 +05:30
fbc8407035 Add support to specify version in \d.x notation 2021-01-16 11:16:13 +05:30
6972aed899 Add support for quoted csv in ini-values 2021-01-15 13:52:18 +05:30
d2f58713aa Use GITHUB_ENV to append to PATH 2021-01-07 21:53:45 +05:30
068c794af7 Change Node.js version in the workflow 2021-01-07 00:14:26 +05:30
1e119b6d1a Fix add_pdo_extension in linux.sh 2021-01-07 00:13:05 +05:30
77721f6637 Make sure tool path is always in PATH 2020-12-26 01:25:36 +05:30
d731e56579 Add support for macOS ARM 2020-12-26 01:25:30 +05:30
e5b90e33c6 Add support for coverage: xdebug2 2020-12-24 18:20:42 +05:30
849315646a Add support for brewed extensions on PHP 8.0 and 8.1 on macOS 2020-12-24 15:48:35 +05:30
d891a81b7f Fix add_brew_tap in darwin.sh
Fix shellcheck in darwin.sh
2020-12-24 03:34:39 +05:30
5098017251 Update js dependencies 2020-12-21 22:51:36 +05:30
2da85f306f Add support for specifying ICU version on PHP 8.0 2020-12-19 18:47:19 +05:30
1f94ad201f Improve symfony example workflows 2020-12-19 18:41:33 +05:30
862f206cd2 Merge pull request #377 from smoqadam/master
issue #376 - Install phpunit dependencies before runs the tests
2020-12-19 04:36:39 -08:00
81964ae791 issue #376 - Install phpunit dependencies before runs the tests 2020-12-19 20:18:12 +08:00
b7d1d9c9a9 Adjust $nightly_versions on linux 2020-12-18 22:45:12 +05:30
c5e4d55c3b Add devtools on self-hosted workflows 2020-12-18 22:40:16 +05:30
d74064b67a Fix setting xdebug.mode 2020-12-17 21:08:00 +05:30
8862a73fdd Update Pre-installed PHP in README 2020-12-17 19:03:15 +05:30
7b44f7e007 Fix couchbase on PHP 7.2 2020-12-17 16:29:01 +05:30
ff5499165a Set JIT related ini values on PHP 8 2020-12-17 14:02:00 +05:30
b3cd6b4dab Improve pecl support 2020-12-17 12:54:01 +05:30
ce02569aea Exit on failing to setup PHP 2020-12-17 04:43:16 +05:30
f1c04eb1eb Update sponsor logos 2020-12-15 16:22:21 +05:30
77aeac1761 Fix logging in add_pdo_extension in linux.sh 2020-12-14 22:33:39 +05:30
569522d50d Fetch homebrew taps manually 2020-12-14 19:34:32 +05:30
ea8be20255 Improve support for phive 2020-12-14 15:43:12 +05:30
d6f700217a Fix comments in extensions.ts 2020-12-14 15:42:58 +05:30
1015b3659d Add support for blackfire on PHP 8 2020-12-14 14:53:27 +05:30
03359ef1ab Improve README 2020-12-14 14:53:26 +05:30
fd9aae59b0 Add support for geos on unix 2020-12-14 14:53:19 +05:30
9af1e7006f Use shivammathur/extensions tap for imap and amqp on macOS 2020-12-03 15:01:13 +05:30
5efdcae81a Use brew for grpc_php_plugin on macOS 2020-12-02 10:09:22 +05:30
f0fb8731a5 Update ini files for all available SAPI 2020-12-02 05:50:56 +05:30
5a15252e66 Fix docs workflow 2020-12-01 08:48:41 +05:30
c0c6e403b6 Merge pull request #347 from shivammathur/develop
2.9.0
2020-11-28 15:08:28 +05:30
d0677c93b9 Bump version to 2.9.0 2020-11-28 15:08:27 +05:30
466908db61 Set 8.0 as the latest version 2020-11-28 15:08:26 +05:30
8dbd6b7684 Improve PECL support 2020-11-28 02:13:43 +05:30
5a40a5875d Fix xdebug setup
Co-authored-by: Owen Voke <development@voke.dev>
Co-authored-by: Shivam Mathur <shivam_jpr@hotmail.com>
2020-11-28 02:13:42 +05:30
790a41a722 Fix getting grpc latest tag 2020-11-28 02:13:41 +05:30
62c7ba2bee Improve darwin.sh 2020-11-28 02:13:36 +05:30
41797e3af9 Prioritize bintray over GitHub releases for scripts 2020-11-25 11:12:07 +05:30
c6150c6a2b Fix fail-fast in Windows 2020-11-25 05:39:44 +05:30
19b09596c6 Fix fetching extension version from PECL on macOS 2020-11-25 05:32:15 +05:30
4ec398d39a Fix deleting extensions 2020-11-25 05:23:27 +05:30
6bbaac9c49 Change description in actions.yml 2020-11-24 16:28:41 +05:30
012f269570 Improve README 2020-11-24 11:03:03 +05:30
09222f42ae Skip prestissimo and composer-prefetcher unless composer:v1 is specified 2020-11-21 11:11:33 +05:30
403191b6b6 Sync dependencies from tap in add_brew_extension 2020-11-21 10:54:39 +05:30
34 changed files with 8786 additions and 933 deletions

View File

@ -1,8 +1,8 @@
name: Docs workflow
on:
repository_dispatch:
workflow_dispatch:
schedule:
- cron: '0 0 * * 2'
- cron: '0 15 * * 2'
jobs:
create:
name: Create
@ -35,7 +35,7 @@ jobs:
version: ${{ matrix.php-versions }}
if: matrix.operating-system == 'windows-2019'
run: |
Write-Output "## PHP $version`n" | Out-File -FilePath "$env:file"
Write-Output "## PHP ${{ matrix.php-versions }}`n" | Out-File -FilePath "$env:file"
Write-Output "``````" | Out-File -FilePath "$env:file" -Append
php -m | Out-File -FilePath "$env:file" -Append
Write-Output "```````n" | Out-File -FilePath "$env:file" -Append
@ -60,9 +60,9 @@ jobs:
git config --local user.email "${{ secrets.email }}"
git config --local user.name "${{ github.repository_owner }}"
for os in ubuntu-20.04 ubuntu-18.04 ubuntu-16.04 windows-2019 macos-10.15 macos-11.0; do
echo "# PHP Extensions on $os" > Php-extensions-on-"$os".md
echo "These are extensions which are loaded by default on the following PHP versions. More extensions which are available as packages and available on pecl are supported by setup-php. Refer to [php extension support](https://github.com/shivammathur/setup-php#heavy_plus_sign-php-extension-support) for more details." > Php-extensions-loaded-on-"$os".md
for version in 5.3 5.4 5.5 5.6 7.0 7.1 7.2 7.3 7.4 8.0 8.1; do
cat lists/php"$version"-"$os".md >> Php-extensions-on-"$os".md
cat lists/php"$version"-"$os".md >> Php-extensions-loaded-on-"$os".md
done
done
rm -rf ./lists

View File

@ -28,10 +28,10 @@ jobs:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node.js 12.x
- name: Setup Node.js 14.x
uses: actions/setup-node@v1
with:
node-version: 12.x
node-version: 14.x
- name: Install dependencies
run: npm install

339
README.md
View File

@ -22,10 +22,10 @@ Setup PHP with required extensions, php.ini configuration, code-coverage support
## Contents
- [PHP Support](#tada-php-support)
- [OS/Platform Support](#cloud-osplatform-support)
- [GitHub-Hosted Runners](#github-hosted-runners)
- [Self-Hosted Runners](#self-hosted-runners)
- [PHP Support](#tada-php-support)
- [PHP Extension Support](#heavy_plus_sign-php-extension-support)
- [Tools Support](#wrench-tools-support)
- [Coverage Support](#signal_strength-coverage-support)
@ -36,14 +36,15 @@ Setup PHP with required extensions, php.ini configuration, code-coverage support
- [Inputs](#inputs)
- [Flags](#flags)
- [Basic Setup](#basic-setup)
- [Matrix Setup](#matrix-setup)
- [Multi-Arch Setup](#multi-arch-setup)
- [Matrix Setup](#matrix-setup)
- [Nightly Build Setup](#nightly-build-setup)
- [Thread Safe Setup](#thread-safe-setup)
- [Force Update Setup](#force-update-setup)
- [Verbose Setup](#verbose-setup)
- [Multi-Arch Setup](#multi-arch-setup)
- [Self Hosted Setup](#self-hosted-setup)
- [Local Testing Setup](#local-testing-setup)
- [Thread Safe Setup](#thread-safe-setup)
- [Force Update](#force-update)
- [Verbose Setup](#verbose-setup)
- [JIT Configuration](#jit-configuration)
- [Cache Extensions](#cache-extensions)
- [Cache Composer Dependencies](#cache-composer-dependencies)
- [Cache Node.js Dependencies](#cache-nodejs-dependencies)
@ -57,39 +58,20 @@ Setup PHP with required extensions, php.ini configuration, code-coverage support
- [Dependencies](#package-dependencies)
- [Further Reading](#bookmark_tabs-further-reading)
## :tada: PHP Support
|PHP Version|Stability|Release Support|Runner Support|
|--- |--- |--- |--- |
|`5.3`|`Stable`|`End of life`|`GitHub-hosted`|
|`5.4`|`Stable`|`End of life`|`GitHub-hosted`|
|`5.5`|`Stable`|`End of life`|`GitHub-hosted`|
|`5.6`|`Stable`|`End of life`|`GitHub-hosted`, `self-hosted`|
|`7.0`|`Stable`|`End of life`|`GitHub-hosted`, `self-hosted`|
|`7.1`|`Stable`|`End of life`|`GitHub-hosted`, `self-hosted`|
|`7.2`|`Stable`|`Security fixes only`|`GitHub-hosted`, `self-hosted`|
|`7.3`|`Stable`|`Active`|`GitHub-hosted`, `self-hosted`|
|`7.4`|`Stable`|`Active`|`GitHub-hosted`, `self-hosted`|
|`8.0`|`Nightly`|`In development`|`GitHub-hosted`, `self-hosted`|
|`8.1`|`Nightly`|`In development`|`GitHub-hosted`, `self-hosted`|
**Note:** Specifying `8.0` and `8.1` in `php-version` input installs a nightly build of `PHP 8.0.0-dev` and `PHP 8.1.0-dev` respectively. See [nightly build setup](#nightly-build-setup) for more information.
## :cloud: OS/Platform Support
The action supports both `GitHub-hosted` runners and `self-hosted` runners on the following operating systems.
Both `GitHub-hosted` and `self-hosted` runners are suppported by `setup-php` on the following OS/Platforms.
### GitHub-Hosted Runners
|Virtual environment|YAML workflow label|Pre-installed PHP|
|--- |--- |--- |
|Ubuntu 16.04|`ubuntu-16.04`|`PHP 5.6` to `PHP 7.4`|
|Ubuntu 18.04|`ubuntu-latest` or `ubuntu-18.04`|`PHP 7.1` to `PHP 7.4`|
|Ubuntu 20.04|`ubuntu-20.04`|`PHP 7.4`|
|Windows Server 2019|`windows-latest` or `windows-2019`|`PHP 7.4`|
|macOS Catalina 10.15|`macos-latest` or `macos-10.15`|`PHP 7.4`|
|macOS Big Sur 11.0|`macos-11.0`|`PHP 7.4`|
|Ubuntu 16.04|`ubuntu-16.04`|`PHP 5.6` to `PHP 8.0`|
|Ubuntu 18.04|`ubuntu-latest` or `ubuntu-18.04`|`PHP 7.1` to `PHP 8.0`|
|Ubuntu 20.04|`ubuntu-20.04`|`PHP 7.4` to `PHP 8.0`|
|Windows Server 2019|`windows-latest` or `windows-2019`|`PHP 8.0`|
|macOS Catalina 10.15|`macos-latest` or `macos-10.15`|`PHP 8.0`|
|macOS Big Sur 11.0|`macos-11.0`|`PHP 8.0`|
### Self-Hosted Runners
@ -101,50 +83,73 @@ The action supports both `GitHub-hosted` runners and `self-hosted` runners on th
|Windows 7 and newer|`self-hosted` or `Windows`|
|Windows Server 2012 R2 and newer|`self-hosted` or `Windows`|
|macOS Catalina 10.15|`self-hosted` or `macOS`|
|macOS Big Sur 11.0|`self-hosted` or `macOS`|
|macOS Big Sur 11.x x86_64/arm64|`self-hosted` or `macOS`|
- Refer to the [self-hosted setup](#self-hosted-setup) to use the action on self-hosted runners.
- If the requested PHP version is pre-installed, `setup-php` switches to it, otherwise it installs the PHP version.
## :tada: PHP Support
On all supported OS/Platforms the following PHP versions are supported as per the runner.
- PHP 5.3 to PHP 8.1 on GitHub-hosted runners.
- PHP 5.6 to PHP 8.1 on self-hosted runners.
|PHP Version|Stability|Release Support|Runner Support|
|--- |--- |--- |--- |
|`5.3`|`Stable`|`End of life`|`GitHub-hosted`|
|`5.4`|`Stable`|`End of life`|`GitHub-hosted`|
|`5.5`|`Stable`|`End of life`|`GitHub-hosted`|
|`5.6`|`Stable`|`End of life`|`GitHub-hosted`, `self-hosted`|
|`7.0`|`Stable`|`End of life`|`GitHub-hosted`, `self-hosted`|
|`7.1`|`Stable`|`End of life`|`GitHub-hosted`, `self-hosted`|
|`7.2`|`Stable`|`End of life`|`GitHub-hosted`, `self-hosted`|
|`7.3`|`Stable`|`Security fixes only`|`GitHub-hosted`, `self-hosted`|
|`7.4`|`Stable`|`Active`|`GitHub-hosted`, `self-hosted`|
|`8.0`|`Stable`|`Active`|`GitHub-hosted`, `self-hosted`|
|`8.1`|`Nightly`|`In development`|`GitHub-hosted`, `self-hosted`|
**Notes:**
- Specifying `8.1` in `php-version` input installs a nightly build of `PHP 8.1.0-dev`. See [nightly build setup](#nightly-build-setup) for more information.
- To use JIT on `PHP 8.0` and `PHP 8.1` refer to the [JIT configuration](#jit-configuration) section.
## :heavy_plus_sign: PHP Extension Support
- Extensions enabled by default after `setup-php` runs can be found on the [wiki](https://github.com/shivammathur/setup-php/wiki).
PHP extensions can be setup using the `extensions` input. It accepts a `string` in csv-format.
- On `ubuntu` by default extensions which are available as a package can be installed. PECL extensions if not available as a package can be installed by specifying `pecl` in the tools input.
- On `Ubuntu`, extensions which are available as a package or available on `PECL` can be setup.
```yaml
- name: Setup PHP with pecl extension
- name: Setup PHP with PECL extension
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
tools: pecl
extensions: swoole
extensions: imagick, swoole
```
- On `windows` PECL extensions which have the `DLL` binary can be installed.
- On `Windows`, extensions available on `PECL` which have the `DLL` binary can be setup.
- On `macOS` PECL extensions can be installed.
- On `macOS`, extensions available on `PECL` can be installed.
- Extensions installed along with PHP if specified are enabled.
- Specific versions of PECL extensions can be installed by suffixing the version. This is useful for installing old versions of extensions which support end of life PHP versions.
- Specific versions of extensions available on `PECL` can be setup by suffixing the extension's name with the version. This is useful for installing old versions of extensions which support end of life PHP versions.
```yaml
- name: Setup PHP with specific version of PECL extension
uses: shivammathur/setup-php@v2
with:
php-version: '5.4'
tools: pecl
extensions: swoole-1.9.3
```
- Pre-release versions of PECL extensions can be setup by suffixing the extension with its state i.e `alpha`, `beta`, `devel` or `snapshot`.
- Pre-release versions extensions available on `PECL` can be setup by suffixing the extension's name with its state i.e `alpha`, `beta`, `devel` or `snapshot`.
```yaml
- name: Setup PHP with pre-release PECL extension
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
tools: pecl
extensions: xdebug-beta
```
@ -158,17 +163,22 @@ The action supports both `GitHub-hosted` runners and `self-hosted` runners on th
extensions: :opcache
```
- Extension `intl` can be setup with specific `ICU` version for `PHP 5.6` to `PHP 7.4` in `Ubuntu` workflows by suffixing `intl` with the `ICU` version. `ICU 50.2` and newer versions are supported. Refer to [`ICU builds`](https://github.com/shivammathur/icu-intl#icu4c-builds) for the specific versions supported.
- Extension `intl` can be setup with specific `ICU` version for `PHP 5.6` to `PHP 8.0` in `Ubuntu` workflows by suffixing `intl` with the `ICU` version. `ICU 50.2` and newer versions are supported. Refer to [`ICU builds`](https://github.com/shivammathur/icu-intl#icu4c-builds) for the specific versions supported.
```yaml
- name: Setup PHP with intl
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
extensions: intl-67.1
extensions: intl-68.2
```
- These extensions have custom support - `cubrid`, `pdo_cubrid` and `gearman` on `Ubuntu`, and `blackfire`, `couchbase`, `ioncube`, `oci8`, `pdo_oci`, `phalcon3` and `phalcon4` on all supported OS.
- Extensions loaded by default after `setup-php` runs can be found on the [wiki](https://github.com/shivammathur/setup-php/wiki).
- These extensions have custom support:
- `cubrid`, `pdo_cubrid` and `gearman` on `Ubuntu`.
- `geos` on `Ubuntu` and `macOS`.
- `blackfire`, `couchbase`, `ioncube`, `oci8`, `pdo_oci`, `phalcon3` and `phalcon4` on all supported OS.
- By default, extensions which cannot be added or removed gracefully leave an error message in the logs, the action is not interrupted. To change this behaviour you can set `fail-fast` flag to `true`.
@ -184,7 +194,7 @@ The action supports both `GitHub-hosted` runners and `self-hosted` runners on th
## :wrench: Tools Support
These tools can be setup globally using the `tools` input.
These tools can be setup globally using the `tools` input. It accepts a string in csv-format.
`behat`, `blackfire`, `blackfire-player`, `codeception`, `composer`, `composer-normalize`, `composer-prefetcher`, `composer-require-checker`, `composer-unused`, `cs2pr`, `deployer`, `flex`, `grpc_php_plugin`, `infection`, `pecl`, `phan`, `phing`, `phinx`, `phive`, `phpcbf`, `phpcpd`, `php-config`, `php-cs-fixer`, `phpcs`, `phpize`, `phpmd`, `phpspec`, `phpstan`, `phpunit`, `prestissimo`, `protoc`, `psalm`, `symfony`, `vapor-cli`
@ -206,7 +216,7 @@ These tools can be setup globally using the `tools` input.
tools: composer:v2
```
- If you have specified composer plugins `prestissimo` or `composer-prefetcher` in tools, the latest stable version of `composer v1` will be setup. Unless some of your packages require `composer v1`, it is recommended to drop `prestissimo` and use `composer v2`.
- Tools `prestissimo` and `composer-prefetcher` will be skipped unless `composer:v1` is also specified in tools input. It is recommended to drop `prestissimo` and use `composer v2`.
- The latest versions of both agent `blackfire-agent` and client `blackfire` are setup when `blackfire` is specified in tools input. Please refer to the [official documentation](https://blackfire.io/docs/integrations/ci/github-actions "Blackfire.io documentation for GitHub Actions") for using `blackfire` with GitHub Actions.
@ -252,12 +262,24 @@ Runs on all [PHP versions supported](#tada-php-support "List of PHP versions sup
coverage: xdebug
```
- The latest version of Xdebug compatible with the PHP version is set up by default.
- If you need Xdebug 2.x on PHP 7.2, 7.3 or 7.4, you can specify `coverage: xdebug2`.
```yaml
- name: Setup PHP with Xdebug 2.x
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
coverage: xdebug2
```
### PCOV
Specify `coverage: pcov` to use `PCOV` and disable `Xdebug`.
`PCOV` supports `PHP 7.1` and newer PHP versions.
Tests with `PCOV` run much faster than with `Xdebug`.
If your source code directory is other than `src`, `lib` or, `app`, specify `pcov.directory` using the `ini-values` input.
Specify `coverage: pcov` to use PCOV and disable Xdebug.
Runs on PHP 7.1 and newer PHP versions.
- In most cases, tests with `PCOV` execute much faster than with `Xdebug`.
- If your source code directory is other than `src`, `lib` or, `app`, specify `pcov.directory` using the `ini-values` input.
```yaml
- name: Setup PHP with PCOV
@ -268,9 +290,8 @@ If your source code directory is other than `src`, `lib` or, `app`, specify `pco
coverage: pcov
```
`PHPUnit` 8 and above supports `PCOV` out of the box.
If you are using `PHPUnit` 5, 6 or 7, you will need `krakjoe/pcov-clobber`.
Before executing your tests add the following step.
- PHPUnit 8.x and above supports PCOV out of the box.
- If you are using PHPUnit 5.x, 6.x or 7.x, you need to set up `pcov/clobber` before executing your tests.
```yaml
- name: Setup PCOV
@ -308,6 +329,7 @@ Consider disabling the coverage using this PHP action for these reasons.
- Specify the PHP version you want to set up.
- Accepts a `string`. For example `'7.4'`.
- Accepts `latest` to set up the latest stable PHP version.
- Accepts the format `d.x`, where `d` is the major version. For example `5.x`, `7.x` and `8.x`.
- See [PHP support](#tada-php-support) for supported PHP versions.
#### `extensions` (optional)
@ -319,8 +341,9 @@ Consider disabling the coverage using this PHP action for these reasons.
#### `ini-values` (optional)
- Specify the values you want to add to `php.ini`.
- Accepts a `string` in csv-format. For example `post_max_size=256M, short_open_tag=On`.
- Specify the values you want to add to `php.ini`.
- Accepts a `string` in csv-format. For example `post_max_size=256M, max_execution_time=180`.
- Accepts ini values with commas if wrapped in quotes. For example `xdebug.mode="develop,coverage"`.
#### `coverage` (optional)
@ -357,7 +380,7 @@ Consider disabling the coverage using this PHP action for these reasons.
- Specify to update PHP on the runner to the latest patch version.
- Accepts `true` and `false`.
- By default, it is set to `false`.
- See [force update](#force-update) for more info.
- See [force update setup](#force-update-setup) for more info.
See below for more info.
@ -375,7 +398,7 @@ steps:
with:
php-version: '7.4'
extensions: mbstring, intl
ini-values: post_max_size=256M, short_open_tag=On
ini-values: post_max_size=256M, max_execution_time=180
coverage: xdebug
tools: php-cs-fixer, phpunit
```
@ -390,9 +413,13 @@ jobs:
runs-on: ${{ matrix.operating-system }}
strategy:
matrix:
operating-system: [ubuntu-latest, windows-latest, macos-latest]
php-versions: ['5.6', '7.0', '7.1', '7.2', '7.3', '7.4']
name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }}
operating-system: ['ubuntu-latest', 'windows-latest', 'macos-latest']
php-versions: ['7.3', '7.4']
phpunit-versions: ['latest']
include:
- operating-system: 'ubuntu-latest'
php-versions: '7.2'
phpunit-versions: '8.5.13'
steps:
- name: Checkout
uses: actions/checkout@v2
@ -402,9 +429,85 @@ jobs:
with:
php-version: ${{ matrix.php-versions }}
extensions: mbstring, intl
ini-values: post_max_size=256M, short_open_tag=On
ini-values: post_max_size=256M, max_execution_time=180
coverage: xdebug
tools: php-cs-fixer, phpunit
tools: php-cs-fixer, phpunit:${{ matrix.phpunit-versions }}
```
### Nightly Build Setup
> Setup a nightly build of `PHP 8.1`.
- This version is currently in development.
- Some user space extensions might not support this version currently.
```yaml
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup nightly PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
extensions: mbstring
ini-values: post_max_size=256M, max_execution_time=180
coverage: xdebug
tools: php-cs-fixer, phpunit
```
### Thread Safe Setup
> Setup `TS` or `NTS` PHP on `Windows`.
- `NTS` versions are setup by default.
- On `Ubuntu` and `macOS` only `NTS` versions are supported.
- On `Windows` both `TS` and `NTS` versions are supported.
```yaml
jobs:
run:
runs-on: windows-latest
name: Setup PHP TS on Windows
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
env:
phpts: ts # specify ts or nts
```
### Force Update Setup
> Update to the latest patch of PHP versions.
- Pre-installed PHP versions on the GitHub Actions runner are not updated to their latest patch release by default.
- You can specify the `update` environment variable to `true` to force update to the latest release.
```yaml
- name: Setup PHP with latest versions
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
env:
update: true # specify true or false
```
### Verbose Setup
> Debug your workflow
To debug any issues, you can use the `verbose` tag instead of `v2`.
```yaml
- name: Setup PHP with logs
uses: shivammathur/setup-php@verbose
with:
php-version: '7.4'
```
### Multi-Arch Setup
@ -433,36 +536,11 @@ jobs:
# Install PHP
spc --php-version "7.4" \
--extensions "mbstring, intl" \
--ini-values "post_max_size=256M, short_open_tag=On" \
--ini-values "post_max_size=256M, max_execution_time=180" \
--coverage "xdebug" \
--tools "php-cs-fixer, phpunit"
```
### Nightly Build Setup
> Setup a nightly build of `PHP 8.0` or `PHP 8.1`.
- These versions are currently in development.
- `PECL` is installed by default with these versions on `ubuntu` and `macOS`.
- Some user space extensions might not support these versions currently.
- Refer to this [RFC](https://wiki.php.net/rfc/jit "PHP JIT RFC configuration") for configuring `PHP JIT` on these versions.
- Refer to this [list of RFCs](https://wiki.php.net/rfc#php_80 "List of RFCs implemented in PHP8") for features implemented in `PHP 8.0`.
```yaml
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup nightly PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
extensions: mbstring
ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1
coverage: pcov
tools: php-cs-fixer, phpunit
```
### Self Hosted Setup
> Setup PHP on a self-hosted runner.
@ -517,7 +595,7 @@ jobs:
php-version: 7.4
```
Run the workflow locally with `act` using [`shivammathur/node`](https://github.com/shivammathur/node-docker "Docker image to run setup-php") docker image.
Run the workflow locally with `act` using [`shivammathur/node`](https://github.com/shivammathur/node-docker "Docker image to run setup-php") docker images.
```bash
# For runs-on: ubuntu-latest
@ -533,58 +611,22 @@ act -P ubuntu-18.04=shivammathur/node:bionic
act -P ubuntu-16.04=shivammathur/node:xenial
```
### Thread Safe Setup
### JIT Configuration
> Setup `TS` or `NTS` PHP on `Windows`.
> Enable Just-in-time(JIT) on PHP 8.0 and PHP 8.1.
- `NTS` versions are setup by default.
- On `Ubuntu` and `macOS` only `NTS` versions are supported.
- On `Windows` both `TS` and `NTS` versions are supported.
- To enable JIT, enable `opcache` in cli mode by setting `opcache.enable_cli=1`.
- By default, `opcache.jit=1235` and `opcache.jit_buffer_size=256M` are set which can be changed using `ini-values` input.
- For detailed information about JIT related directives refer to the [`official PHP documentation`](https://www.php.net/manual/en/opcache.configuration.php#ini.opcache.jit "opcache.jit documentation").
For example to enable JIT in `tracing` mode with buffer size of `64 MB`.
```yaml
jobs:
run:
runs-on: windows-latest
name: Setup PHP TS on Windows
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
env:
phpts: ts # specify ts or nts
```
### Force Update
> Update to the latest patch of PHP versions.
- Pre-installed PHP versions on the GitHub Actions runner are not updated to their latest patch release by default.
- You can specify the `update` environment variable to `true` to force update to the latest release.
```yaml
- name: Setup PHP with latest versions
- name: Setup PHP with JIT in tracing mode
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
env:
update: true # specify true or false
```
### Verbose Setup
> Debug your workflow
To debug any issues, you can use the `verbose` tag instead of `v2`.
```yaml
- name: Setup PHP with logs
uses: shivammathur/setup-php@verbose
with:
php-version: '7.4'
php-version: '8.0'
ini-values: opcache.enable_cli=1, opcache.jit=tracing, opcache.jit_buffer_size=64M
```
### Cache Extensions
@ -776,7 +818,7 @@ Examples of using `setup-php` with various PHP Frameworks and Packages.
> Contributions are welcome!
- See [Contributor's Guide](.github/CONTRIBUTING.md "shivammathur/setup-php contribution guide") before you start.
- If you face any issues while using this or want to suggest a feature/improvement, create an issue [here](https://github.com/shivammathur/setup-php/issues "Issues reported").
- If you face any issues or want to suggest a feature/improvement, start a discussion [here](https://github.com/shivammathur/setup-php/discussions "Setup PHP discussions").
*Join the list of setup-php contributors*
@ -788,24 +830,31 @@ Examples of using `setup-php` with various PHP Frameworks and Packages.
## :sparkling_heart: Support This Project
- If setup-php saved your developer time, please consider sponsoring setup-php:
- [Open Collective](https://opencollective.com/setup-php "setup-php Open Collective")
- [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal")
- [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon")
- Please [reach out](mailto:contact@setup-php.com) if you have any questions regarding sponsoring setup-php.
- Please star the project and share it. If you blog, please share your experience of using this action.
- Please consider supporting our work by sponsoring using [Open Collective](https://opencollective.com/setup-php), [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal") or [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon").
- If you use `setup-php` at your company, please [reach out](mailto:contact@setup-php.com) to sponsor the project.
*Huge thanks to the following companies for supporting `setup-php`*
<p>
<a href="https://www.jetbrains.com/?from=setup-php">
<img src="https://shivammathur.com/jetbrains.svg" alt="JetBrains" width="106" height="60">
<img src="https://setup-php.com/sponsors/jetbrains.svg" alt="JetBrains" width="106" height="60">
</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://blackfire.io/?utm_source=setup-php">
<img src="https://shivammathur.com/blackfire.svg" alt="Blackfire" width="212" height="60">
<img src="https://setup-php.com/sponsors//blackfire.svg" alt="Blackfire" width="212" height="60">
</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://www.macstadium.com/?source=setup-php">
<img src="https://setup-php.com/sponsors//macstadium.png" alt="Mac Stadium" width="148" height="60">
</a>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="https://tidelift.com/subscription/pkg/npm-setup-php">
<img src="https://shivammathur.com/tidelift.png" alt="Tidelift" width="70" height="60">
</a>
<img src="https://setup-php.com/sponsors//tidelift.png" alt="Tidelift" width="70" height="60">
</a>
</p>
## :package: Dependencies

View File

@ -24,7 +24,7 @@ describe('Config tests', () => {
true
);
expect(linux).toContain(
'echo "post_max_size=256M\nshort_open_tag=On\ndate.timezone=Asia/Kolkata"'
'echo "post_max_size=256M\nshort_open_tag=On\ndate.timezone=Asia/Kolkata" | sudo tee -a "${pecl_file:-${ini_file[@]}}"'
);
linux = await config.addINIValues(
@ -40,7 +40,7 @@ describe('Config tests', () => {
'darwin'
);
expect(darwin).toContain(
'echo "post_max_size=256M\nshort_open_tag=On\ndate.timezone=Asia/Kolkata"'
'echo "post_max_size=256M\nshort_open_tag=On\ndate.timezone=Asia/Kolkata" | sudo tee -a "${pecl_file:-${ini_file[@]}}"'
);
darwin = await config.addINIValues(

View File

@ -30,39 +30,29 @@ describe('Config tests', () => {
expect(win32).toContain('Add-Extension xdebug');
});
it('checking addCoverage with Xdebug3 on windows', async () => {
const win32: string = await coverage.addCoverage('xdebug3', '7.4', 'win32');
expect(win32).toContain('Add-Extension xdebug');
});
it('checking addCoverage with Xdebug2 on windows', async () => {
const win32: string = await coverage.addCoverage('xdebug2', '7.4', 'win32');
expect(win32).toContain('Add-Extension xdebug stable 2.9.8');
});
it('checking addCoverage with Xdebug on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug', '8.0', 'linux');
expect(linux).toContain('add_extension xdebug');
});
it('checking addCoverage with Xdebug3 on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug3', '7.4', 'linux');
expect(linux).toContain('add_extension_from_source xdebug');
expect(linux).toContain('echo "xdebug.mode=coverage"');
});
it('checking addCoverage with Xdebug3 on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug3', '8.0', 'linux');
expect(linux).toContain('add_extension xdebug');
expect(linux).toContain('echo "xdebug.mode=coverage"');
});
it('checking addCoverage with Xdebug on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug', '8.0', 'linux');
expect(linux).toContain('add_extension xdebug');
expect(linux).toContain('echo "xdebug.mode=coverage"');
});
it('checking addCoverage with Xdebug3 on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug3', '8.1', 'linux');
expect(linux).toContain('add_extension xdebug');
expect(linux).toContain('echo "xdebug.mode=coverage"');
});
it('checking addCoverage with Xdebug on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug', '8.1', 'linux');
expect(linux).toContain('add_extension xdebug');
expect(linux).toContain('echo "xdebug.mode=coverage"');
it('checking addCoverage with Xdebug2 on linux', async () => {
const linux: string = await coverage.addCoverage('xdebug2', '7.4', 'linux');
expect(linux).toContain('add_pecl_extension xdebug 2.9.8 zend_extension');
});
it('checking addCoverage with Xdebug on darwin', async () => {
@ -74,6 +64,24 @@ describe('Config tests', () => {
expect(darwin).toContain('add_brew_extension xdebug');
});
it('checking addCoverage with Xdebug3 on darwin', async () => {
const darwin: string = await coverage.addCoverage(
'xdebug3',
'7.4',
'darwin'
);
expect(darwin).toContain('add_brew_extension xdebug');
});
it('checking addCoverage with Xdebug2 on darwin', async () => {
const darwin: string = await coverage.addCoverage(
'xdebug2',
'7.4',
'darwin'
);
expect(darwin).toContain('add_brew_extension xdebug2');
});
it('checking disableCoverage windows', async () => {
const win32 = await coverage.addCoverage('none', '7.4', 'win32');
expect(win32).toContain('Remove-Extension xdebug');

View File

@ -25,6 +25,9 @@ describe('Extension tests', () => {
'Add-Log "$cross" "pcov" "pcov is not supported on PHP 5.6"'
);
win32 = await extensions.addExtension('xdebug2', '7.2', 'win32');
expect(win32).toContain('Add-Extension xdebug stable 2.9.8');
win32 = await extensions.addExtension('mysql', '7.4', 'win32');
expect(win32).toContain('Add-Extension mysqli');
expect(win32).toContain('Add-Extension mysqlnd');
@ -59,13 +62,11 @@ describe('Extension tests', () => {
it('checking addExtensionOnLinux', async () => {
let linux: string = await extensions.addExtension(
'Xdebug, xdebug3, pcov, sqlite, :intl, ast, ast-beta, pdo_mysql, pdo-odbc, xdebug-alpha, grpc-1.2.3',
'Xdebug, pcov, sqlite, :intl, ast, ast-beta, pdo_mysql, pdo-odbc, xdebug-alpha, grpc-1.2.3',
'7.4',
'linux'
);
expect(linux).toContain(
'add_extension_from_source xdebug xdebug/xdebug master --enable-xdebug zend_extension'
);
expect(linux).toContain('add_extension xdebug');
expect(linux).toContain('add_extension sqlite3');
expect(linux).toContain('remove_extension intl');
expect(linux).toContain('add_unstable_extension ast beta extension');
@ -96,6 +97,9 @@ describe('Extension tests', () => {
linux = await extensions.addExtension('cubrid', '7.4', 'linux');
expect(linux).toContain('add_cubrid cubrid');
linux = await extensions.addExtension('xdebug2', '7.2', 'linux');
expect(linux).toContain('add_pecl_extension xdebug 2.9.8 zend_extension');
linux = await extensions.addExtension('xdebug', '7.2', 'openbsd');
expect(linux).toContain('Platform openbsd is not supported');
@ -106,6 +110,9 @@ describe('Extension tests', () => {
linux = await extensions.addExtension('ioncube', '7.3', 'linux');
expect(linux).toContain('add_ioncube');
linux = await extensions.addExtension('geos', '7.3', 'linux');
expect(linux).toContain('add_geos');
linux = await extensions.addExtension('oci8, pdo_oci', '7.3', 'linux');
expect(linux).toContain('add_oci oci8');
expect(linux).toContain('add_oci pdo_oci');
@ -121,19 +128,24 @@ describe('Extension tests', () => {
linux = await extensions.addExtension('intl-67.1', '7.3', 'linux');
expect(linux).toContain('add_intl intl-67.1');
linux = await extensions.addExtension('intl-68.2', '8.0', 'linux');
expect(linux).toContain('add_intl intl-68.2');
});
it('checking addExtensionOnDarwin', async () => {
let darwin: string = await extensions.addExtension(
'Xdebug, pcov, grpc, igbinary, imagick, protobuf, swoole, sqlite, oci8, pdo_oci, :intl, ast-beta, grpc-1.2.3',
'amqp, Xdebug, pcov, grpc, igbinary, imagick, imap, protobuf, swoole, sqlite, oci8, pdo_oci, :intl, ast-beta, grpc-1.2.3',
'7.2',
'darwin'
);
expect(darwin).toContain('add_brew_extension amqp extension');
expect(darwin).toContain('add_brew_extension xdebug zend_extension');
expect(darwin).toContain('add_brew_extension pcov extension');
expect(darwin).toContain('add_brew_extension grpc extension');
expect(darwin).toContain('add_brew_extension igbinary extension');
expect(darwin).toContain('add_brew_extension imagick extension');
expect(darwin).toContain('add_brew_extension imap extension');
expect(darwin).toContain('add_brew_extension protobuf extension');
expect(darwin).toContain('add_brew_extension swoole extension');
expect(darwin).toContain('add_extension sqlite3');
@ -156,6 +168,9 @@ describe('Extension tests', () => {
darwin = await extensions.addExtension('ioncube', '7.3', 'darwin');
expect(darwin).toContain('add_ioncube');
darwin = await extensions.addExtension('geos', '7.3', 'darwin');
expect(darwin).toContain('add_geos');
darwin = await extensions.addExtension('oci8, pdo_oci', '7.3', 'darwin');
expect(darwin).toContain('add_oci oci8');
expect(darwin).toContain('add_oci pdo_oci');
@ -177,6 +192,9 @@ describe('Extension tests', () => {
darwin = await extensions.addExtension('xdebug', '7.2', 'darwin');
expect(darwin).toContain('add_brew_extension xdebug');
darwin = await extensions.addExtension('xdebug2', '7.2', 'darwin');
expect(darwin).toContain('add_brew_extension xdebug2');
darwin = await extensions.addExtension('redis', '5.6', 'darwin');
expect(darwin).toContain('add_extension redis-2.2.8');

View File

@ -117,7 +117,7 @@ describe('Install', () => {
script = '' + (await install.run());
expect(script).toContain('initial script');
expect(script).toContain('bash linux.sh 7.4 ');
expect(script).toContain('bash linux.sh 8.0 ');
setEnv('7.3', 'linux', 'a, b', 'a=b', 'x', 'phpunit');

View File

@ -167,14 +167,22 @@ describe('Tools tests', () => {
});
it('checking addPhive', async () => {
let script: string = await tools.addPhive('1.2.3', 'linux');
let script: string = await tools.addPhive('1.2.3', '7.4', 'linux');
expect(script).toContain(
'add_tool https://github.com/phar-io/phive/releases/download/1.2.3/phive-1.2.3.phar phive'
);
script = await tools.addPhive('latest', 'win32');
script = await tools.addPhive('latest', '5.5', 'win32');
expect(script).toContain('Phive is not supported on PHP 5.5');
script = await tools.addPhive('latest', '5.6', 'win32');
expect(script).toContain(
'Add-Tool https://phar.io/releases/phive.phar phive'
'Add-Tool https://github.com/phar-io/phive/releases/download/0.12.1/phive-0.12.1.phar phive'
);
script = await tools.addPhive('latest', '7.1', 'win32');
expect(script).toContain(
'Add-Tool https://github.com/phar-io/phive/releases/download/0.13.5/phive-0.13.5.phar phive'
);
});
@ -251,9 +259,6 @@ describe('Tools tests', () => {
expect(
await tools.addComposer(['a', 'b', 'c', 'composer:v2'])
).toStrictEqual(['composer:2', 'a', 'b', 'c']);
expect(
await tools.addComposer(['hirak', 'b', 'c', 'composer:v2'])
).toStrictEqual(['composer:1', 'hirak', 'b', 'c']);
});
it('checking getComposerUrl', async () => {
@ -629,6 +634,7 @@ describe('Tools tests', () => {
});
it('checking addTools with composer tool using user/tool as input', async () => {
const listOfTools = [
'composer:v1',
'hirak/prestissimo',
'narrowspark/automatic-composer-prefetcher',
'robmorgan/phinx'

View File

@ -8,6 +8,12 @@ jest.mock('@actions/core', () => ({
})
}));
jest.spyOn(utils, 'fetch').mockImplementation(
async (url): Promise<string> => {
return `{ "latest": "8.0", "5.x": "5.6", "url": "${url}" }`;
}
);
async function cleanup(path: string): Promise<void> {
fs.unlink(path, error => {
if (error) {
@ -33,10 +39,18 @@ describe('Utils tests', () => {
}).rejects.toThrow('Input required and not supplied: DoesNotExist');
});
it('checking fetch', async () => {
expect(await utils.fetch('test_url')).toBe(
'{ "latest": "8.0", "5.x": "5.6", "url": "test_url" }'
);
});
it('checking parseVersion', async () => {
expect(await utils.parseVersion('latest')).toBe('8.0');
expect(await utils.parseVersion('7')).toBe('7.0');
expect(await utils.parseVersion('7.4')).toBe('7.4');
expect(await utils.parseVersion('latest')).toBe('7.4');
expect(await utils.parseVersion('5.x')).toBe('5.6');
expect(await utils.parseVersion('4.x')).toBe(undefined);
});
it('checking asyncForEach', async () => {
@ -111,6 +125,20 @@ describe('Utils tests', () => {
'b=2',
'c=3'
]);
expect(await utils.CSVArray('\'a=1,2\', "b=3, 4", c=5, d=~e~')).toEqual([
'a=1,2',
'b=3, 4',
'c=5',
"d='~e~'"
]);
expect(await utils.CSVArray('a=\'1,2\', b="3, 4", c=5')).toEqual([
'a=1,2',
'b=3, 4',
'c=5'
]);
expect(
await utils.CSVArray('a=E_ALL, b=E_ALL & ~ E_ALL, c="E_ALL", d=\'E_ALL\'')
).toEqual(['a=E_ALL', 'b=E_ALL & ~ E_ALL', 'c=E_ALL', 'd=E_ALL']);
expect(await utils.CSVArray('')).toEqual([]);
expect(await utils.CSVArray(' ')).toEqual([]);
});

View File

@ -1,13 +1,13 @@
name: 'Setup PHP Action'
author: shivammathur
description: 'Setup PHP with required extensions, php.ini configuration, code-coverage support and various tools like composer'
description: 'GitHub Action for PHP'
branding:
color: 'purple'
icon: 'play-circle'
inputs:
php-version:
description: 'Setup PHP version.'
default: '7.4'
default: '8.0'
required: true
extensions:
description: 'Setup PHP extensions.'

178
dist/index.js vendored
View File

@ -1054,8 +1054,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.customPackage = exports.scriptTool = exports.scriptExtension = exports.joins = exports.getCommand = exports.getUnsupportedLog = exports.suppressOutput = exports.getExtensionPrefix = exports.CSVArray = exports.extensionArray = exports.writeScript = exports.readScript = exports.addLog = exports.stepLog = exports.log = exports.color = exports.asyncForEach = exports.parseVersion = exports.getInput = exports.readEnv = void 0;
exports.customPackage = exports.scriptTool = exports.scriptExtension = exports.joins = exports.getCommand = exports.getUnsupportedLog = exports.suppressOutput = exports.getExtensionPrefix = exports.CSVArray = exports.extensionArray = exports.writeScript = exports.readScript = exports.addLog = exports.stepLog = exports.log = exports.color = exports.asyncForEach = exports.parseVersion = exports.fetch = exports.getInput = exports.readEnv = void 0;
const fs = __importStar(__webpack_require__(747));
const https = __importStar(__webpack_require__(211));
const path = __importStar(__webpack_require__(622));
const core = __importStar(__webpack_require__(470));
/**
@ -1094,15 +1095,34 @@ async function getInput(name, mandatory) {
}
}
exports.getInput = getInput;
/**
* Function to fetch an URL
*
* @param url
*/
async function fetch(url) {
const fetch_promise = new Promise(resolve => {
const req = https.get(url, (res) => {
res.setEncoding('utf8');
let body = '';
res.on('data', chunk => (body += chunk));
res.on('end', () => resolve(body));
});
req.end();
});
return await fetch_promise;
}
exports.fetch = fetch;
/**
* Function to parse PHP version.
*
* @param version
*/
async function parseVersion(version) {
switch (version) {
case 'latest':
return '7.4';
const manifest = 'https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/php-versions.json';
switch (true) {
case /latest|\d.x/.test(version):
return JSON.parse(await fetch(manifest))[version];
default:
switch (true) {
case version.length > 1:
@ -1241,8 +1261,7 @@ async function extensionArray(extension_csv) {
return extension
.trim()
.toLowerCase()
.replace('php-', '')
.replace('php_', '');
.replace(/^php[-_]/, '');
})
.filter(Boolean);
}
@ -1261,9 +1280,12 @@ async function CSVArray(values_csv) {
return [];
default:
return values_csv
.split(',')
.split(/,(?=(?:(?:[^"']*["']){2})*[^"']*$)/)
.map(function (value) {
return value.trim();
return value
.trim()
.replace(/^["']|["']$|(?<==)["']/g, '')
.replace(/=(((?!E_).)*[?{}|&~![()^]+((?!E_).)+)/, "='$1'");
})
.filter(Boolean);
}
@ -1275,18 +1297,11 @@ exports.CSVArray = CSVArray;
* @param extension
*/
async function getExtensionPrefix(extension) {
const zend = [
'xdebug',
'xdebug3',
'opcache',
'ioncube',
'eaccelerator'
];
switch (zend.indexOf(extension)) {
switch (true) {
default:
return 'zend_extension';
case -1:
return 'extension';
case /xdebug([2-3])?$|opcache|ioncube|eaccelerator/.test(extension):
return 'zend_extension';
}
}
exports.getExtensionPrefix = getExtensionPrefix;
@ -1399,6 +1414,13 @@ async function customPackage(pkg, type, version, os_version) {
exports.customPackage = customPackage;
/***/ }),
/***/ 211:
/***/ (function(module) {
module.exports = require("https");
/***/ }),
/***/ 357:
@ -1908,9 +1930,20 @@ exports.getCodeceptionUri = getCodeceptionUri;
* Helper function to get script to setup phive
*
* @param version
* @param php_version
* @param os_version
*/
async function addPhive(version, os_version) {
async function addPhive(version, php_version, os_version) {
switch (true) {
case /5\.[3-5]/.test(php_version):
return await utils.addLog('$cross', 'phive', 'Phive is not supported on PHP ' + php_version, os_version);
case /5\.6|7\.0/.test(php_version):
version = version.replace('latest', '0.12.1');
break;
case /7\.1/.test(php_version):
version = version.replace('latest', '0.13.5');
break;
}
switch (version) {
case 'latest':
return ((await utils.getCommand(os_version, 'tool')) +
@ -2023,14 +2056,10 @@ exports.getWpCliUrl = getWpCliUrl;
async function addComposer(tools_list) {
const regex_any = /^composer($|:.*)/;
const regex_valid = /^composer:?($|preview$|snapshot$|v?[1-2]$|v?\d+\.\d+\.\d+[\w-]*$)/;
const regex_composer1_tools = /hirak|prestissimo|narrowspark|composer-prefetcher/;
const matches = tools_list.filter(tool => regex_valid.test(tool));
let composer = 'composer';
tools_list = tools_list.filter(tool => !regex_any.test(tool));
switch (true) {
case regex_composer1_tools.test(tools_list.join(' ')):
composer = 'composer:1';
break;
case matches[0] == undefined:
break;
default:
@ -2212,7 +2241,7 @@ async function addTools(tools_csv, php_version, os_version) {
script += await addPackage(tool, release, 'robmorgan/', os_version);
break;
case 'phive':
script += await addPhive(version, os_version);
script += await addPhive(version, php_version, os_version);
break;
case 'php-config':
case 'phpize':
@ -2330,16 +2359,8 @@ const config = __importStar(__webpack_require__(641));
async function addCoverageXdebug(extension, version, os_version, pipe) {
const xdebug = (await extensions.addExtension(extension, version, os_version, true)) +
pipe;
const ini = await config.addINIValues('xdebug.mode=coverage', os_version, true);
const log = await utils.addLog('$tick', extension, 'Xdebug enabled as coverage driver', os_version);
switch (true) {
case /^xdebug3$/.test(extension):
case /^8\.\d$/.test(version):
return '\n' + xdebug + '\n' + ini + '\n' + log;
case /^xdebug$/.test(extension):
default:
return xdebug + '\n' + log;
}
return xdebug + '\n' + log;
}
exports.addCoverageXdebug = addCoverageXdebug;
/**
@ -2420,8 +2441,9 @@ async function addCoverage(coverage_driver, version, os_version) {
return script + (await addCoveragePCOV(version, os_version, pipe));
case 'xdebug':
case 'xdebug3':
return (script +
(await addCoverageXdebug(coverage_driver, version, os_version, pipe)));
return (script + (await addCoverageXdebug('xdebug', version, os_version, pipe)));
case 'xdebug2':
return (script + (await addCoverageXdebug('xdebug2', version, os_version, pipe)));
case 'none':
return script + (await disableCoverage(version, os_version, pipe));
default:
@ -2472,7 +2494,10 @@ async function addINIValuesUnix(ini_values_csv) {
script +=
'\n' + (await utils.addLog('$tick', line, 'Added to php.ini', 'linux'));
});
return 'echo "' + ini_values.join('\n') + '" >> $ini_file' + script;
return ('echo "' +
ini_values.join('\n') +
'" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null 2>&1' +
script);
}
exports.addINIValuesUnix = addINIValuesUnix;
/**
@ -2574,10 +2599,7 @@ async function getScript(filename, version, os_version) {
const extension_csv = await utils.getInput('extensions', false);
const ini_values_csv = await utils.getInput('ini-values', false);
const coverage_driver = await utils.getInput('coverage', false);
let tools_csv = await utils.getInput('tools', false);
if (/.*-(beta|alpha|devel|snapshot|\d+\.\d+\.\d+).*/.test(extension_csv)) {
tools_csv = 'pecl, ' + tools_csv;
}
const tools_csv = await utils.getInput('tools', false);
let script = await utils.readScript(filename);
script += await tools.addTools(tools_csv, version, os_version);
if (extension_csv) {
@ -2600,11 +2622,16 @@ exports.getScript = getScript;
async function run() {
try {
const version = await utils.parseVersion(await utils.getInput('php-version', true));
const os_version = process.platform;
const tool = await utils.scriptTool(os_version);
const script = os_version + (await utils.scriptExtension(os_version));
const location = await getScript(script, version, os_version);
await exec_1.exec(await utils.joins(tool, location, version, __dirname));
if (version) {
const os_version = process.platform;
const tool = await utils.scriptTool(os_version);
const script = os_version + (await utils.scriptExtension(os_version));
const location = await getScript(script, version, os_version);
await exec_1.exec(await utils.joins(tool, location, version, __dirname));
}
else {
core.setFailed('Unable to get the PHP version');
}
}
catch (error) {
core.setFailed(error.message);
@ -2879,21 +2906,21 @@ async function addExtensionDarwin(extension_csv, version) {
case /^:/.test(ext_name):
remove_script += '\nremove_extension ' + ext_name.slice(1);
return;
// match 5.3blackfire...5.6blackfire, 7.0blackfire...7.4blackfire
// match 5.3blackfire-(semver)...5.6blackfire-(semver), 7.0blackfire-(semver)...7.4blackfire-(semver)
// match 5.3blackfire...8.0blackfire
// match 5.3blackfire-(semver)...8.0blackfire-(semver)
// match pdo_oci and oci8
// match 5.3ioncube...7.4ioncube, 7.0ioncube...7.4ioncube
// match 5.3ioncube...7.4ioncube, 5.3geos...7.4geos
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
// match 5.6couchbase...7.4couchbase
case /^(5\.[3-6]|7\.[0-4])blackfire(-\d+\.\d+\.\d+)?$/.test(version_extension):
case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(version_extension):
case /^pdo_oci$|^oci8$/.test(extension):
case /^5\.[3-6]ioncube$|^7\.[0-4]ioncube$/.test(version_extension):
case /^(5\.[3-6]|7\.[0-4])(ioncube|geos)$/.test(version_extension):
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
case /^5\.6couchbase$|^7\.[0-4]couchbase$/.test(version_extension):
add_script += await utils.customPackage(ext_name, 'ext', extension, 'darwin');
return;
// match pre-release versions. For example - xdebug-beta
case /.*-(beta|alpha|devel|snapshot)/.test(version_extension):
case /.*-(stable|beta|alpha|devel|snapshot|rc|preview)/.test(version_extension):
add_script += await utils.joins('\nadd_unstable_extension', ext_name, ext_version, ext_prefix);
return;
// match semver
@ -2904,11 +2931,9 @@ async function addExtensionDarwin(extension_csv, version) {
case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'darwin');
return;
// match 5.6xdebug to 8.9xdebug, 5.6igbinary to 8.9igbinary
// match 5.6grpc to 7.4grpc, 5.6imagick to 7.4imagick, 5.6protobuf to 7.4protobuf, 5.6swoole to 7.4swoole
// match 7.1pcov to 8.9pcov
case /(5\.6|7\.[0-4]|8\.[0-9])(xdebug|igbinary)/.test(version_extension):
case /(5\.6|7\.[0-4])(grpc|imagick|protobuf|swoole)/.test(version_extension):
// match 5.6 to 8.9 for amqp, grpc, igbinary, imagick, imap, protobuf, swoole and xdebug
// match 7.1 to 8.9 for pcov
case /(5\.6|7\.[0-4]|8\.[0-9])(amqp|grpc|igbinary|imagick|imap|protobuf|swoole|xdebug)/.test(version_extension):
case /(7\.[1-4]|8\.[0-9])pcov/.test(version_extension):
add_script += await utils.joins('\nadd_brew_extension', ext_name, ext_prefix);
return;
@ -2947,20 +2972,20 @@ async function addExtensionWindows(extension_csv, version) {
case /^:/.test(ext_name):
remove_script += '\nRemove-Extension ' + ext_name.slice(1);
break;
// match 5.3blackfire...5.6blackfire, 7.0blackfire...7.4blackfire
// match 5.3blackfire-(semver)...5.6blackfire-(semver), 7.0blackfire-(semver)...7.4blackfire-(semver)
// match 5.3blackfire...8.0blackfire
// match 5.3blackfire-(semver)...8.0blackfire-(semver)
// match pdo_oci and oci8
// match 5.3ioncube...7.4ioncube, 7.0ioncube...7.4ioncube
// match 5.3ioncube...7.4ioncube
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
case /^(5\.[3-6]|7\.[0-4])blackfire(-\d+\.\d+\.\d+)?$/.test(version_extension):
case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(version_extension):
case /^pdo_oci$|^oci8$/.test(extension):
case /^5\.[3-6]ioncube$|^7\.[0-4]ioncube$/.test(version_extension):
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
add_script += await utils.customPackage(ext_name, 'ext', extension, 'win32');
return;
// match pre-release versions. For example - xdebug-beta
case /.*-(beta|alpha|devel|snapshot)/.test(version_extension):
add_script += await utils.joins('\nAdd-Extension', ext_name, ext_version);
case /.*-(stable|beta|alpha|devel|snapshot)/.test(version_extension):
add_script += await utils.joins('\nAdd-Extension', ext_name, ext_version.replace('stable', ''));
break;
// match semver without state
case /.*-\d+\.\d+\.\d+$/.test(version_extension):
@ -2971,6 +2996,10 @@ async function addExtensionWindows(extension_csv, version) {
matches = /.*-(\d+\.\d+\.\d)([a-zA-Z+]+)\d*/.exec(version_extension);
add_script += await utils.joins('\nAdd-Extension', ext_name, matches[2].replace('preview', 'devel'), matches[1]);
break;
// match 7.2xdebug2 to 7.4xdebug2
case /7\.[2-4]xdebug2/.test(version_extension):
add_script += '\nAdd-Extension xdebug stable 2.9.8';
break;
// match 5.3pcov to 7.0pcov
case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'win32');
@ -3020,24 +3049,24 @@ async function addExtensionLinux(extension_csv, version) {
case /^:/.test(ext_name):
remove_script += '\nremove_extension ' + ext_name.slice(1);
return;
// match 5.3blackfire...5.6blackfire, 7.0blackfire...7.4blackfire
// match 5.3blackfire-(semver)...5.6blackfire-(semver), 7.0blackfire-(semver)...7.4blackfire-(semver)
// match 5.3blackfire...8.0blackfire
// match 5.3blackfire-(semver)...8.0blackfire-(semver)
// match 5.3pdo_cubrid...7.2php_cubrid, 5.3cubrid...7.4cubrid
// match pdo_oci and oci8
// match 5.3ioncube...7.4ioncube, 7.0ioncube...7.4ioncube
// match 5.3ioncube...7.4ioncube, 5.3geos...7.4geos
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
// match 5.6gearman...7.4gearman, 5.6couchbase...7.4couchbase
case /^(5\.[3-6]|7\.[0-4])blackfire(-\d+\.\d+\.\d+)?$/.test(version_extension):
case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(version_extension):
case /^((5\.[3-6])|(7\.[0-2]))pdo_cubrid$|^((5\.[3-6])|(7\.[0-4]))cubrid$/.test(version_extension):
case /^pdo_oci$|^oci8$/.test(extension):
case /^5\.6intl-[\d]+\.[\d]+$|^7\.[0-4]intl-[\d]+\.[\d]+$/.test(version_extension):
case /^5\.[3-6]ioncube$|^7\.[0-4]ioncube$/.test(version_extension):
case /^(5\.6|7\.[0-4]|8\.0)intl-[\d]+\.[\d]+$/.test(version_extension):
case /^(5\.[3-6]|7\.[0-4])(ioncube|geos)$/.test(version_extension):
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
case /^((5\.6)|(7\.[0-4]))(gearman|couchbase)$/.test(version_extension):
add_script += await utils.customPackage(ext_name, 'ext', extension, 'linux');
return;
// match pre-release versions. For example - xdebug-beta
case /.*-(beta|alpha|devel|snapshot)/.test(version_extension):
case /.*-(stable|beta|alpha|devel|snapshot|rc|preview)/.test(version_extension):
add_script += await utils.joins('\nadd_unstable_extension', ext_name, ext_version, ext_prefix);
return;
// match semver versions
@ -3048,15 +3077,10 @@ async function addExtensionLinux(extension_csv, version) {
case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'linux');
return;
// match 7.2xdebug3..7.4xdebug3
case /^7\.[2-4]xdebug3$/.test(version_extension):
add_script +=
'\nadd_extension_from_source xdebug xdebug/xdebug master --enable-xdebug zend_extension';
// match 7.2xdebug2...7.4xdebug2
case /^7\.[2-4]xdebug2$/.test(version_extension):
add_script += await utils.joins('\nadd_pecl_extension', 'xdebug', '2.9.8', ext_prefix);
return;
// match 8.0xdebug3...8.9xdebug3
case /^8\.[0-9]xdebug3$/.test(version_extension):
extension = 'xdebug';
break;
// match pdo extensions
case /.*pdo[_-].*/.test(version_extension):
extension = extension.replace(/pdo[_-]|3/, '');

View File

@ -43,13 +43,14 @@ jobs:
restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies
run: |
composer require --dev symfony/orm-pack symfony/phpunit-bridge
composer install --no-progress --prefer-dist --optimize-autoloader
php bin/phpunit install
- name: Run Migration
run: |
composer require symfony/orm-pack
php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed"
php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed"
env:
DATABASE_URL: mysql://root:symfony@127.0.0.1:${{ job.services.mysql.ports['3306'] }}/symfony
- name: Run Tests
run: php bin/phpunit --coverage-text
run: php bin/phpunit --coverage-text

View File

@ -41,13 +41,14 @@ jobs:
restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies
run: |
composer require --dev symfony/orm-pack symfony/phpunit-bridge
composer install --no-progress --prefer-dist --optimize-autoloader
php bin/phpunit install
- name: Run Migration
run: |
composer require symfony/orm-pack
php bin/console doctrine:schema:update --force || echo "No migrations found or schema update failed"
php bin/console doctrine:migrations:migrate || echo "No migrations found or migration failed"
env:
DATABASE_URL: postgres://postgres:postgres@127.0.0.1:${{ job.services.postgres.ports[5432] }}/postgres?charset=UTF-8
- name: Run Tests
run: php bin/phpunit --coverage-text
run: php bin/phpunit --coverage-text

View File

@ -32,7 +32,8 @@ jobs:
restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies
run: |
composer require symfony/orm-pack
composer require --dev symfony/phpunit-bridge
composer install --no-progress --prefer-dist --optimize-autoloader
php bin/phpunit install
- name: Run Tests
run: php bin/phpunit --coverage-text
run: php bin/phpunit --coverage-text

8455
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "setup-php",
"version": "2.8.0",
"version": "2.9.0",
"private": false,
"description": "Setup PHP for use with GitHub Actions",
"main": "dist/index.js",
@ -30,22 +30,22 @@
"fs": "0.0.1-security"
},
"devDependencies": {
"@types/jest": "^26.0.15",
"@types/node": "^14.14.7",
"@typescript-eslint/eslint-plugin": "^4.7.0",
"@typescript-eslint/parser": "^4.7.0",
"@types/jest": "^26.0.19",
"@types/node": "^14.14.14",
"@typescript-eslint/eslint-plugin": "^4.10.0",
"@typescript-eslint/parser": "^4.10.0",
"@zeit/ncc": "^0.22.3",
"eslint": "^7.13.0",
"eslint-config-prettier": "^6.15.0",
"eslint": "^7.16.0",
"eslint-config-prettier": "^7.1.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jest": "^24.1.3",
"eslint-plugin-prettier": "^3.1.4",
"husky": "^4.3.0",
"eslint-plugin-prettier": "^3.3.0",
"husky": "^4.3.6",
"jest": "^26.6.3",
"jest-circus": "^26.6.3",
"prettier": "^2.1.2",
"prettier": "^2.2.1",
"ts-jest": "^26.4.4",
"typescript": "^4.0.5"
"typescript": "^4.1.3"
},
"husky": {
"skipCI": true,

View File

@ -14,7 +14,12 @@ export async function addINIValuesUnix(
script +=
'\n' + (await utils.addLog('$tick', line, 'Added to php.ini', 'linux'));
});
return 'echo "' + ini_values.join('\n') + '" >> $ini_file' + script;
return (
'echo "' +
ini_values.join('\n') +
'" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null 2>&1' +
script
);
}
/**

View File

@ -0,0 +1,6 @@
{
"latest": "8.0",
"5.x": "5.6",
"7.x": "7.4",
"8.x": "8.0"
}

View File

@ -19,25 +19,13 @@ export async function addCoverageXdebug(
const xdebug =
(await extensions.addExtension(extension, version, os_version, true)) +
pipe;
const ini = await config.addINIValues(
'xdebug.mode=coverage',
os_version,
true
);
const log = await utils.addLog(
'$tick',
extension,
'Xdebug enabled as coverage driver',
os_version
);
switch (true) {
case /^xdebug3$/.test(extension):
case /^8\.\d$/.test(version):
return '\n' + xdebug + '\n' + ini + '\n' + log;
case /^xdebug$/.test(extension):
default:
return xdebug + '\n' + log;
}
return xdebug + '\n' + log;
}
/**
@ -152,8 +140,11 @@ export async function addCoverage(
case 'xdebug':
case 'xdebug3':
return (
script +
(await addCoverageXdebug(coverage_driver, version, os_version, pipe))
script + (await addCoverageXdebug('xdebug', version, os_version, pipe))
);
case 'xdebug2':
return (
script + (await addCoverageXdebug('xdebug2', version, os_version, pipe))
);
case 'none':
return script + (await disableCoverage(version, os_version, pipe));

View File

@ -22,17 +22,17 @@ export async function addExtensionDarwin(
case /^:/.test(ext_name):
remove_script += '\nremove_extension ' + ext_name.slice(1);
return;
// match 5.3blackfire...5.6blackfire, 7.0blackfire...7.4blackfire
// match 5.3blackfire-(semver)...5.6blackfire-(semver), 7.0blackfire-(semver)...7.4blackfire-(semver)
// match 5.3blackfire...8.0blackfire
// match 5.3blackfire-(semver)...8.0blackfire-(semver)
// match pdo_oci and oci8
// match 5.3ioncube...7.4ioncube, 7.0ioncube...7.4ioncube
// match 5.3ioncube...7.4ioncube, 5.3geos...7.4geos
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
// match 5.6couchbase...7.4couchbase
case /^(5\.[3-6]|7\.[0-4])blackfire(-\d+\.\d+\.\d+)?$/.test(
case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(
version_extension
):
case /^pdo_oci$|^oci8$/.test(extension):
case /^5\.[3-6]ioncube$|^7\.[0-4]ioncube$/.test(version_extension):
case /^(5\.[3-6]|7\.[0-4])(ioncube|geos)$/.test(version_extension):
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
case /^5\.6couchbase$|^7\.[0-4]couchbase$/.test(version_extension):
add_script += await utils.customPackage(
@ -43,7 +43,9 @@ export async function addExtensionDarwin(
);
return;
// match pre-release versions. For example - xdebug-beta
case /.*-(beta|alpha|devel|snapshot)/.test(version_extension):
case /.*-(stable|beta|alpha|devel|snapshot|rc|preview)/.test(
version_extension
):
add_script += await utils.joins(
'\nadd_unstable_extension',
ext_name,
@ -64,11 +66,9 @@ export async function addExtensionDarwin(
case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'darwin');
return;
// match 5.6xdebug to 8.9xdebug, 5.6igbinary to 8.9igbinary
// match 5.6grpc to 7.4grpc, 5.6imagick to 7.4imagick, 5.6protobuf to 7.4protobuf, 5.6swoole to 7.4swoole
// match 7.1pcov to 8.9pcov
case /(5\.6|7\.[0-4]|8\.[0-9])(xdebug|igbinary)/.test(version_extension):
case /(5\.6|7\.[0-4])(grpc|imagick|protobuf|swoole)/.test(
// match 5.6 to 8.9 for amqp, grpc, igbinary, imagick, imap, protobuf, swoole and xdebug
// match 7.1 to 8.9 for pcov
case /(5\.6|7\.[0-4]|8\.[0-9])(amqp|grpc|igbinary|imagick|imap|protobuf|swoole|xdebug)/.test(
version_extension
):
case /(7\.[1-4]|8\.[0-9])pcov/.test(version_extension):
@ -116,12 +116,12 @@ export async function addExtensionWindows(
case /^:/.test(ext_name):
remove_script += '\nRemove-Extension ' + ext_name.slice(1);
break;
// match 5.3blackfire...5.6blackfire, 7.0blackfire...7.4blackfire
// match 5.3blackfire-(semver)...5.6blackfire-(semver), 7.0blackfire-(semver)...7.4blackfire-(semver)
// match 5.3blackfire...8.0blackfire
// match 5.3blackfire-(semver)...8.0blackfire-(semver)
// match pdo_oci and oci8
// match 5.3ioncube...7.4ioncube, 7.0ioncube...7.4ioncube
// match 5.3ioncube...7.4ioncube
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
case /^(5\.[3-6]|7\.[0-4])blackfire(-\d+\.\d+\.\d+)?$/.test(
case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(
version_extension
):
case /^pdo_oci$|^oci8$/.test(extension):
@ -135,11 +135,11 @@ export async function addExtensionWindows(
);
return;
// match pre-release versions. For example - xdebug-beta
case /.*-(beta|alpha|devel|snapshot)/.test(version_extension):
case /.*-(stable|beta|alpha|devel|snapshot)/.test(version_extension):
add_script += await utils.joins(
'\nAdd-Extension',
ext_name,
ext_version
ext_version.replace('stable', '')
);
break;
// match semver without state
@ -163,6 +163,10 @@ export async function addExtensionWindows(
matches[1]
);
break;
// match 7.2xdebug2 to 7.4xdebug2
case /7\.[2-4]xdebug2/.test(version_extension):
add_script += '\nAdd-Extension xdebug stable 2.9.8';
break;
// match 5.3pcov to 7.0pcov
case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'win32');
@ -215,24 +219,22 @@ export async function addExtensionLinux(
case /^:/.test(ext_name):
remove_script += '\nremove_extension ' + ext_name.slice(1);
return;
// match 5.3blackfire...5.6blackfire, 7.0blackfire...7.4blackfire
// match 5.3blackfire-(semver)...5.6blackfire-(semver), 7.0blackfire-(semver)...7.4blackfire-(semver)
// match 5.3blackfire...8.0blackfire
// match 5.3blackfire-(semver)...8.0blackfire-(semver)
// match 5.3pdo_cubrid...7.2php_cubrid, 5.3cubrid...7.4cubrid
// match pdo_oci and oci8
// match 5.3ioncube...7.4ioncube, 7.0ioncube...7.4ioncube
// match 5.3ioncube...7.4ioncube, 5.3geos...7.4geos
// match 7.0phalcon3...7.3phalcon3 and 7.2phalcon4...7.4phalcon4
// match 5.6gearman...7.4gearman, 5.6couchbase...7.4couchbase
case /^(5\.[3-6]|7\.[0-4])blackfire(-\d+\.\d+\.\d+)?$/.test(
case /^(5\.[3-6]|7\.[0-4]|8\.0)blackfire(-\d+\.\d+\.\d+)?$/.test(
version_extension
):
case /^((5\.[3-6])|(7\.[0-2]))pdo_cubrid$|^((5\.[3-6])|(7\.[0-4]))cubrid$/.test(
version_extension
):
case /^pdo_oci$|^oci8$/.test(extension):
case /^5\.6intl-[\d]+\.[\d]+$|^7\.[0-4]intl-[\d]+\.[\d]+$/.test(
version_extension
):
case /^5\.[3-6]ioncube$|^7\.[0-4]ioncube$/.test(version_extension):
case /^(5\.6|7\.[0-4]|8\.0)intl-[\d]+\.[\d]+$/.test(version_extension):
case /^(5\.[3-6]|7\.[0-4])(ioncube|geos)$/.test(version_extension):
case /^7\.[0-3]phalcon3$|^7\.[2-4]phalcon4$/.test(version_extension):
case /^((5\.6)|(7\.[0-4]))(gearman|couchbase)$/.test(version_extension):
add_script += await utils.customPackage(
@ -243,7 +245,9 @@ export async function addExtensionLinux(
);
return;
// match pre-release versions. For example - xdebug-beta
case /.*-(beta|alpha|devel|snapshot)/.test(version_extension):
case /.*-(stable|beta|alpha|devel|snapshot|rc|preview)/.test(
version_extension
):
add_script += await utils.joins(
'\nadd_unstable_extension',
ext_name,
@ -264,15 +268,15 @@ export async function addExtensionLinux(
case /(5\.[3-6]|7\.0)pcov/.test(version_extension):
add_script += await utils.getUnsupportedLog('pcov', version, 'linux');
return;
// match 7.2xdebug3..7.4xdebug3
case /^7\.[2-4]xdebug3$/.test(version_extension):
add_script +=
'\nadd_extension_from_source xdebug xdebug/xdebug master --enable-xdebug zend_extension';
// match 7.2xdebug2...7.4xdebug2
case /^7\.[2-4]xdebug2$/.test(version_extension):
add_script += await utils.joins(
'\nadd_pecl_extension',
'xdebug',
'2.9.8',
ext_prefix
);
return;
// match 8.0xdebug3...8.9xdebug3
case /^8\.[0-9]xdebug3$/.test(version_extension):
extension = 'xdebug';
break;
// match pdo extensions
case /.*pdo[_-].*/.test(version_extension):
extension = extension.replace(/pdo[_-]|3/, '');

View File

@ -25,10 +25,7 @@ export async function getScript(
const extension_csv: string = await utils.getInput('extensions', false);
const ini_values_csv: string = await utils.getInput('ini-values', false);
const coverage_driver: string = await utils.getInput('coverage', false);
let tools_csv: string = await utils.getInput('tools', false);
if (/.*-(beta|alpha|devel|snapshot|\d+\.\d+\.\d+).*/.test(extension_csv)) {
tools_csv = 'pecl, ' + tools_csv;
}
const tools_csv: string = await utils.getInput('tools', false);
let script: string = await utils.readScript(filename);
script += await tools.addTools(tools_csv, version, os_version);
@ -57,11 +54,15 @@ export async function run(): Promise<void> {
const version: string = await utils.parseVersion(
await utils.getInput('php-version', true)
);
const os_version: string = process.platform;
const tool = await utils.scriptTool(os_version);
const script = os_version + (await utils.scriptExtension(os_version));
const location = await getScript(script, version, os_version);
await exec(await utils.joins(tool, location, version, __dirname));
if (version) {
const os_version: string = process.platform;
const tool = await utils.scriptTool(os_version);
const script = os_version + (await utils.scriptExtension(os_version));
const location = await getScript(script, version, os_version);
await exec(await utils.joins(tool, location, version, __dirname));
} else {
core.setFailed('Unable to get the PHP version');
}
} catch (error) {
core.setFailed(error.message);
}

View File

@ -2,8 +2,10 @@
export tick="✓"
export cross="✗"
export curl_opts=(-sL)
export nightly_versions="8.[0-1]"
export old_versions="5.[3-5]"
export jit_versions="8.[0-9]"
export nightly_versions="8.[1-9]"
export xdebug3_versions="7.[2-4]|8.[0-9]"
export tool_path_dir="/usr/local/bin"
export composer_bin="$HOME/.composer/vendor/bin"
export composer_json="$HOME/.composer/composer.json"
@ -75,7 +77,7 @@ run_script() {
repo=$1
shift
args=("$@")
get -q -e /tmp/install.sh "$github/$repo/$latest/install.sh" "$bintray/php/$repo.sh"
get -q -e /tmp/install.sh "$bintray/php/$repo.sh" "$github/$repo/$latest/install.sh"
bash /tmp/install.sh "${args[@]}"
}
@ -103,19 +105,30 @@ check_extension() {
# Function to enable existing extensions.
enable_extension() {
if [ -e /tmp/setup_php_dismod ] && grep -q "$1" /tmp/setup_php_dismod; then
sudo phpenmod -v "$version" "$1" >/dev/null 2>&1
fi
modules_dir="/var/lib/php/modules/$version"
[ -d "$modules_dir" ] && sudo find "$modules_dir" -path "*disabled*$1" -delete
if ! check_extension "$1" && [ -e "${ext_dir:?}/$1.so" ]; then
echo "$2=${ext_dir:?}/$1.so" >>"${pecl_file:-$ini_file}"
echo "$2=${ext_dir:?}/$1.so" | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null
fi
}
# Function to configure PHP
configure_php() {
(
echo -e "date.timezone=UTC\nmemory_limit=-1"
[[ "$version" =~ $jit_versions ]] && echo -e "opcache.enable=1\nopcache.jit_buffer_size=256M\nopcache.jit=1235"
[[ "$version" =~ $xdebug3_versions ]] && echo -e "xdebug.mode=coverage"
) | sudo tee -a "${pecl_file:-${ini_file[@]}}" >/dev/null
}
# Function to configure PECL.
configure_pecl() {
if ! [ -e /tmp/pecl_config ] && command -v pecl >/dev/null; then
if ! [ -e /tmp/pecl_config ]; then
if ! command -v pecl >/dev/null || ! command -v pear >/dev/null; then
add_pecl >/dev/null 2>&1
fi
for script in pear pecl; do
sudo "$script" config-set php_ini "${pecl_file:-$ini_file}"
sudo "$script" config-set php_ini "${pecl_file:-${ini_file[@]}}"
sudo "$script" channel-update "$script".php.net
done
echo '' | sudo tee /tmp/pecl_config >/dev/null 2>&1
@ -125,12 +138,12 @@ configure_pecl() {
# Function to get the PECL version of an extension.
get_pecl_version() {
extension=$1
stability="$(echo "$2" | grep -m 1 -Eio "(alpha|beta|rc|snapshot|preview)")"
stability="$(echo "$2" | grep -m 1 -Eio "(stable|alpha|beta|rc|snapshot|preview)")"
pecl_rest='https://pecl.php.net/rest/r/'
response=$(get -s -n "" "$pecl_rest$extension"/allreleases.xml)
pecl_version=$(echo "$response" | grep -m 1 -Pio "(\d*\.\d*\.\d*$stability\d*)")
pecl_version=$(echo "$response" | grep -m 1 -Eio "([0-9]+\.[0-9]+\.[0-9]+${stability}[0-9]+)")
if [ ! "$pecl_version" ]; then
pecl_version=$(echo "$response" | grep -m 1 -Po "(\d*\.\d*\.\d*)")
pecl_version=$(echo "$response" | grep -m 1 -Eo "([0-9]+\.[0-9]+\.[0-9]+)")
fi
echo "$pecl_version"
}
@ -138,6 +151,7 @@ get_pecl_version() {
# Function to install PECL extensions and accept default options
pecl_install() {
local extension=$1
configure_pecl >/dev/null 2>&1
yes '' 2>/dev/null | sudo pecl install -f "$extension" >/dev/null 2>&1
}
@ -176,10 +190,10 @@ configure_composer() {
add_log "$cross" "composer" "Could not download composer"
exit 1
fi
composer -q global config process-timeout 0
composer -q config -g process-timeout 0
echo "$composer_bin" >> "$GITHUB_PATH"
if [ -n "$COMPOSER_TOKEN" ]; then
composer -q global config github-oauth.github.com "$COMPOSER_TOKEN"
composer -q config -g github-oauth.github.com "$COMPOSER_TOKEN"
fi
}
@ -189,6 +203,10 @@ add_tool() {
tool=$2
ver_param=$3
tool_path="$tool_path_dir/$tool"
if ! [[ "$PATH" =~ $tool_path_dir ]] ; then
export PATH=$PATH:"$tool_path_dir"
echo "export PATH=\$PATH:$tool_path_dir" | sudo tee -a "$GITHUB_ENV" >/dev/null
fi
if [ ! -e "$tool_path" ]; then
rm -rf "$tool_path"
fi

View File

@ -11,7 +11,7 @@ self_hosted_helper() {
remove_extension() {
extension=$1
if check_extension "$extension"; then
sudo sed -i '' "/$extension/d" "${ini_file:?}"
sudo sed -Ei '' "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file:?}"
sudo rm -rf "${scan_dir:?}"/*"$extension"* "${ext_dir:?}"/"$extension".so >/dev/null 2>&1
(! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Removed") ||
add_log "${cross:?}" ":$extension" "Could not remove $extension on PHP ${semver:?}"
@ -39,19 +39,47 @@ add_pecl_extension() {
fi
}
# Function to fetch a brew tap
fetch_brew_tap() {
tap=$1
tap_user=$(dirname "$tap")
tap_name=$(basename "$tap")
mkdir -p "$tap_dir/$tap_user"
get -s -n "" "https://github.com/$tap/archive/master.tar.gz" | sudo tar -xzf - -C "$tap_dir/$tap_user"
if [ -d "$tap_dir/$tap_user/$tap_name-master" ]; then
sudo mv "$tap_dir/$tap_user/$tap_name-master" "$tap_dir/$tap_user/$tap_name"
fi
}
# Function to add a brew tap.
add_brew_tap() {
tap=$1
if ! [ -d "$tap_dir/$tap" ]; then
if [ "${runner:?}" = "self-hosted" ]; then
brew tap --shallow "$tap" >/dev/null 2>&1
else
fetch_brew_tap "$tap" >/dev/null 2>&1
if ! [ -d "$tap_dir/$tap" ]; then
brew tap --shallow "$tap" >/dev/null 2>&1
fi
fi
fi
}
# Function to install a php extension from shivammathur/extensions tap.
add_brew_extension() {
extension=$1
formula=$1
prefix=$2
extension=${formula//[0-9]/}
enable_extension "$extension" "$prefix"
if check_extension "$extension"; then
add_log "${tick:?}" "$extension" "Enabled"
else
if ! brew tap | grep -q shivammathur/extensions; then
brew tap --shallow shivammathur/extensions >/dev/null 2>&1
fi
brew install "$extension@$version" >/dev/null 2>&1
sudo cp "$(brew --prefix)/opt/$extension@$version/$extension.so" "$ext_dir"
add_brew_tap shivammathur/homebrew-php
add_brew_tap shivammathur/homebrew-extensions
sudo mv "$tap_dir"/shivammathur/homebrew-extensions/.github/deps/"$extension"/* "$tap_dir/homebrew/homebrew-core/Formula/" 2>/dev/null || true
brew install "$formula@$version" >/dev/null 2>&1
sudo cp "$brew_prefix/opt/$formula@$version/$extension.so" "$ext_dir"
add_extension_log "$extension" "Installed and enabled"
fi
}
@ -85,29 +113,28 @@ add_pecl() {
# Function to update dependencies.
update_dependencies() {
if [[ "$version" =~ ${nightly_versions:?} ]] && [ "${runner:?}" != "self-hosted" ]; then
tap_dir="$(brew --prefix)/Homebrew/Library/Taps"
if [[ "$version" =~ ${nightly_versions:?} ]] && [ "${runner:?}" != "self-hosted" ] && [ "${ImageOS:-}" != "" ] && [ "${ImageVersion:-}" != "" ]; then
while read -r formula; do
get -q -n "$tap_dir/homebrew/homebrew-core/Formula/$formula.rb" "https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/$formula.rb" &
to_wait+=($!)
done <"$tap_dir/shivammathur/homebrew-php/.github/deps/${ImageOS:?}_${ImageVersion:?}"
wait "${to_wait[@]}"
fi
# Remove once commit with bottle syntax breaking change is in images
git -C "$brew_repo" pull origin master
}
# Function to setup PHP 5.6 and newer using Homebrew.
add_php() {
action=$1
if ! brew tap | grep -q shivammathur/php; then
brew tap --shallow shivammathur/php
fi
add_brew_tap shivammathur/homebrew-php
update_dependencies
if ! [[ "$(find "$(brew --cellar)"/php/ -maxdepth 1 -name "$version*" | wc -l 2>/dev/null)" -eq 0 ]] && [ "$action" != "upgrade" ]; then
brew unlink shivammathur/php/php@"$version"
else
brew upgrade "shivammathur/php/php@$version" 2>/dev/null || brew install "shivammathur/php/php@$version"
fi
brew link --force --overwrite php@"$version"
brew link --force --overwrite shivammathur/php/php@"$version"
}
# Function to Setup PHP
@ -128,12 +155,15 @@ setup_php() {
fi
ini_file=$(php -d "date.timezone=UTC" --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
sudo chmod 777 "$ini_file" "${tool_path_dir:?}"
echo -e "date.timezone=UTC\nmemory_limit=-1" >>"$ini_file"
configure_php
ext_dir=$(php -i | grep -Ei "extension_dir => /" | sed -e "s|.*=> s*||")
scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
sudo mkdir -m 777 -p "$ext_dir" "$HOME/.composer"
semver=$(php -v | head -n 1 | cut -f 2 -d ' ')
if [[ ! "$version" =~ $old_versions ]]; then configure_pecl >/dev/null 2>&1; fi
if [ "${semver%.*}" != "$version" ]; then
add_log "$cross" "PHP" "Could not setup PHP $version"
exit 1
fi
sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
add_log "$tick" "PHP" "$status PHP $semver"
}
@ -141,6 +171,10 @@ setup_php() {
# Variables
version=$1
dist=$2
brew_prefix="$(brew --prefix)"
brew_repo="$(brew --repository)"
tap_dir="$brew_repo"/Library/Taps
export HOMEBREW_CHANGE_ARCH_TO_ARM=1
export HOMEBREW_NO_INSTALL_CLEANUP=1
export HOMEBREW_NO_AUTO_UPDATE=1

View File

@ -5,7 +5,7 @@ add_blackfire() {
no_dot_version=${version/./}
platform=$(uname -s | tr '[:upper:]' '[:lower:]')
extension_version=$(echo "$extension" | cut -d '-' -f 2)
blackfire_ini_file="${scan_dir:?}/50-blackfire.ini"
blackfire_ini_file="${pecl_file:-${ini_file[@]}}"
if [ ! -e "${ext_dir:?}/blackfire.so" ]; then
if [ "$extension_version" = "blackfire" ]; then
extension_version=$(get -s -n "" https://blackfire.io/api/v1/releases | grep -Eo 'php":"([0-9]+.[0-9]+.[0-9]+)' | cut -d '"' -f 3)

View File

@ -32,6 +32,8 @@ add_couchbase() {
else
if [[ ${version:?} =~ 5.6|7.[0-1] ]]; then
pecl_install couchbase-2.6.2 >/dev/null 2>&1
elif [[ ${version:?} =~ 7.2 ]]; then
pecl_install couchbase-3.0.4 >/dev/null 2>&1
else
pecl_install couchbase >/dev/null 2>&1
fi

View File

@ -24,7 +24,9 @@ set_cubrid_branch() {
}
add_cubrid_helper() {
if ! [ -e "${ext_dir:?}/$ext.so" ]; then
ext=$1
enable_extension "$ext" extension
if ! check_extension "$ext"; then
status='Installed and enabled'
set_cubrid_repo
set_cubrid_branch
@ -44,7 +46,7 @@ add_cubrid_helper() {
add_cubrid() {
ext=$1
status='Enabled'
add_cubrid_helper >/dev/null 2>&1
add_cubrid_helper "$ext" >/dev/null 2>&1
add_extension_log "$ext" "$status"
check_extension "$ext" && add_license_log
}

51
src/scripts/ext/geos.sh Normal file
View File

@ -0,0 +1,51 @@
# Helper function install geos library and headers
add_geos_libs() {
if [ "$(uname -s)" = "Darwin" ]; then
brew install geos
else
sudo apt-get install libgeos-dev
if [ "${runner:?}" = "self-hosted" ]; then
${apt_install:?} --no-upgrade --no-install-recommends autoconf automake gcc g++
fi
fi
}
# Patch geos for PHP 7
patch_geos() {
if [ "$(php -r "echo PHP_VERSION_ID;")" -ge 70000 ]; then
sed -i~ -e "s/, ce->name/, ZSTR_VAL(ce->name)/; s/ulong /zend_ulong /" /tmp/php-geos-"$geos_tag"/geos.c
fi
}
# Get geos source
get_geos() {
curl -o /tmp/geos.tar.gz -sL https://github.com/libgeos/php-geos/archive/"$geos_tag".tar.gz
tar -xzf /tmp/geos.tar.gz -C /tmp
patch_geos
}
# Helper function to compile and install geos
add_geos_helper() {
get_geos
(
cd /tmp/php-geos-"$geos_tag" || exit
phpize
./configure --enable-geos --with-geos-config="$(command -v geos-config)"
sudo make -j"$(nproc)"
sudo make install
enable_extension geos extension
)
}
# Function to add geos
add_geos() {
geos_tag='1.0.0'
add_geos_libs >/dev/null 2>&1
enable_extension "geos" "extension"
if check_extension "geos"; then
add_log "${tick:?}" "geos" "Enabled"
else
add_geos_helper >/dev/null 2>&1
add_extension_log "geos" "Installed and enabled"
fi
}

View File

@ -83,7 +83,7 @@ patch_pdo_oci_config() {
add_dependencies() {
if [ "$os" = 'Linux' ]; then
if [ "${runner:?}" = "self-hosted" ]; then
${apt_install:?} --no-upgrade --no-install-recommends autoconf automake libaio-dev gcc g++
${apt_install:?} --no-upgrade --no-install-recommends libaio-dev
fi
! [[ ${version:?} =~ $nightly_versions ]] && add_devtools phpize
fi

View File

@ -9,7 +9,6 @@ add_phalcon_helper() {
${apt_install:?} "php${version:?}-$extension"
fi
else
phalcon_ini_file=${ini_file:?}
sed -i '' '/extension.*psr/d' "${ini_file:?}"
brew tap shivammathur/homebrew-phalcon
brew install phalcon@"${version:?}"_"$extension_major_version"
@ -29,7 +28,7 @@ add_phalcon3() {
fi
else
add_phalcon_helper
fi
fi
}
# Function to add phalcon4.
@ -50,7 +49,7 @@ add_phalcon4() {
fi
else
add_phalcon_helper
fi
fi
}
# Function to add phalcon.
@ -58,7 +57,7 @@ add_phalcon() {
extension=$1
status='Enabled'
os_name=$(uname -s)
phalcon_ini_file="${scan_dir:?}/50-phalcon.ini"
phalcon_ini_file="${pecl_file:-${ini_file[@]}}"
extension_major_version=${extension: -1}
if [ "$extension_major_version" = "4" ]; then
add_phalcon4 >/dev/null 2>&1

View File

@ -3,7 +3,7 @@ self_hosted_helper() {
if ! command -v apt-fast >/dev/null; then
sudo ln -sf /usr/bin/apt-get /usr/bin/apt-fast
fi
install_packages curl make software-properties-common unzip
install_packages curl make software-properties-common unzip autoconf automake gcc g++
add_ppa
}
@ -45,15 +45,20 @@ install_packages() {
$apt_install "${packages[@]}" >/dev/null 2>&1 || update_lists && $apt_install "${packages[@]}" >/dev/null 2>&1
}
# Function to delete extensions.
# Function to disable an extension.
disable_extension() {
extension=$1
sudo sed -Ei "/=(.*\/)?\"?$extension(.so)?$/d" "${ini_file[@]}"
sudo sed -Ei "/=(.*\/)?\"?$extension(.so)?$/d" "$pecl_file"
sudo find "$ini_dir"/.. -name "*$extension.ini" -delete >/dev/null 2>&1 || true
}
# Function to delete an extension.
delete_extension() {
extension=$1
sudo sed -i "/$extension/d" "${ini_file:?}"
sudo sed -i "/$extension/d" "${pecl_file:?}"
sudo rm -rf "${scan_dir:?}"/*"$extension"* "${ext_dir:?}"/"$extension".so >/dev/null 2>&1
if [ "${runner:?}" = "self-hosted" ]; then
$apt_remove "php-$extension" "php$version-$extension" >/dev/null 2>&1 || true
fi
disable_extension "$extension"
sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1
sudo sed -i "/Package: php$version-$extension/,/^$/d" /var/lib/dpkg/status
}
# Function to disable and delete extensions.
@ -62,7 +67,6 @@ remove_extension() {
if check_extension "$extension"; then
if [[ ! "$version" =~ ${old_versions:?} ]] && [ -e /etc/php/"$version"/mods-available/"$extension".ini ]; then
sudo phpdismod -v "$version" "$extension" >/dev/null 2>&1
echo "$extension" | sudo tee -a /tmp/setup_php_dismod >/dev/null 2>&1
fi
delete_extension "$extension"
(! check_extension "$extension" && add_log "${tick:?}" ":$extension" "Removed") ||
@ -79,14 +83,22 @@ add_pdo_extension() {
if check_extension "$pdo_ext"; then
add_log "${tick:?}" "$pdo_ext" "Enabled"
else
ext=$1; ext_name=$1;
sudo rm -rf "$scan_dir"/*pdo.ini >/dev/null 2>&1
if ! check_extension "pdo" 2>/dev/null; then echo "extension=pdo.so" >>"$ini_file"; fi
ext=$1
ext_name=$1
disable_extension pdo
echo "extension=pdo.so" | sudo tee "${ini_file[@]/php.ini/conf.d/10-pdo.ini}" >/dev/null 2>&1
if [ "$ext" = "mysql" ]; then
enable_extension "mysqlnd" "extension"
ext_name="mysqli"
ext_name='mysqli'
elif [ "$ext" = "dblib" ]; then
ext_name="sybase"
elif [ "$ext" = "firebird" ]; then
install_packages libfbclient2 >/dev/null 2>&1
enable_extension "pdo_firebird" "extension"
ext_name="interbase"
elif [ "$ext" = "sqlite" ]; then
ext="sqlite3"; ext_name="sqlite3";
ext="sqlite3"
ext_name="sqlite3"
fi
add_extension "$ext_name" "extension" >/dev/null 2>&1
add_extension "$pdo_ext" "extension" >/dev/null 2>&1
@ -111,7 +123,7 @@ add_extension() {
fi
add_extension_log "$extension" "Installed and enabled"
fi
sudo chmod 777 "$ini_file"
sudo chmod 777 "${ini_file[@]}"
}
# Function to install a PECL version.
@ -160,9 +172,7 @@ add_devtools() {
fi
sudo update-alternatives --set php-config /usr/bin/php-config"$version" >/dev/null 2>&1
sudo update-alternatives --set phpize /usr/bin/phpize"$version" >/dev/null 2>&1
if command -v pecl >/dev/null; then
configure_pecl >/dev/null 2>&1
fi
configure_pecl >/dev/null 2>&1
add_log "${tick:?}" "$tool" "Added $tool $semver"
}
@ -174,7 +184,6 @@ setup_nightly() {
# Function to setup PHP 5.3, PHP 5.4 and PHP 5.5.
setup_old_versions() {
run_script "php5-ubuntu" "$version"
configure_pecl
release_version=$(php -v | head -n 1 | cut -d' ' -f 2)
}
@ -194,7 +203,7 @@ switch_version() {
for tool in pear pecl php phar phar.phar php-cgi php-config phpize phpdbg; do
if [ -e "/usr/bin/$tool$version" ]; then
sudo update-alternatives --set $tool /usr/bin/"$tool$version" &
to_wait+=( $! )
to_wait+=($!)
fi
done
wait "${to_wait[@]}"
@ -235,6 +244,15 @@ add_php() {
status="Installed"
}
# Function to ini file for pear and link it to each SAPI.
link_pecl_file() {
echo '' | sudo tee "$pecl_file" >/dev/null 2>&1
for file in "${ini_file[@]}"; do
sapi_scan_dir="$(realpath -m "$(dirname "$file")")/conf.d"
[ "$sapi_scan_dir" != "$scan_dir" ] && ! [ -h "$sapi_scan_dir" ] && sudo ln -sf "$pecl_file" "$sapi_scan_dir/99-pecl.ini"
done
}
# Function to Setup PHP
setup_php() {
step_log "Setup PHP"
@ -259,14 +277,20 @@ setup_php() {
status="Found"
fi
fi
if ! command -v php"$version" >/dev/null; then
add_log "$cross" "PHP" "Could not setup PHP $version"
exit 1
fi
semver=$(php_semver)
ext_dir=$(php -i | grep "extension_dir => /" | sed -e "s|.*=> s*||")
scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
ini_file=$(php --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
ini_dir=$(php --ini | grep "(php.ini)" | sed -e "s|.*: s*||")
pecl_file="$scan_dir"/99-pecl.ini
echo '' | sudo tee "$pecl_file" >/dev/null 2>&1
mapfile -t ini_file < <(sudo find "$ini_dir/.." -name "php.ini" -exec readlink -m {} +)
link_pecl_file
configure_php
sudo rm -rf /usr/local/bin/phpunit >/dev/null 2>&1
sudo chmod 777 "$ini_file" "$pecl_file" "${tool_path_dir:?}"
sudo chmod 777 "${ini_file[@]}" "$pecl_file" "${tool_path_dir:?}"
sudo cp "$dist"/../src/configs/*.json "$RUNNER_TOOL_CACHE/"
add_log "${tick:?}" "PHP" "$status PHP $semver"
}

View File

@ -14,36 +14,49 @@ add_bazel() {
get_grpc_tag() {
if [ "$grpc_tag" = "latest" ]; then
grpc_tag=$(get -s -n "" https://grpc.io/release)
grpc_tag=$(get -s -n "" https://github.com/grpc/grpc/releases/latest | grep -Eo -m 1 "v[0-9]+\.[0-9]+\.[0-9]+" | head -n 1)
else
status_code=$(get -v -n /tmp/grpc.tmp "https://github.com/grpc/grpc/releases/tag/v$grpc_tag")
if [ "$status_code" = "200" ]; then
grpc_tag="v$grpc_tag"
else
grpc_tag=$(get -s -n "" https://grpc.io/release)
if [[ ${grpc_tag:0:1} != "v" ]] ; then grpc_tag="v$grpc_tag"; fi
status_code=$(get -v -n /tmp/grpc.tmp "https://github.com/grpc/grpc/releases/tag/$grpc_tag")
if [ "$status_code" != "200" ]; then
grpc_tag=$(get -s -n "" https://github.com/grpc/grpc/releases/latest | grep -Eo -m 1 "v[0-9]+\.[0-9]+\.[0-9]+" | head -n 1)
fi
fi
}
add_grpc_php_plugin_macos() {
brew install grpc
brew link --force --overwrite grpc >/dev/null 2>&1
grpc_tag="v$(brew info grpc | grep "grpc:" | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+")"
license_path="$(brew --prefix grpc)/LICENSE"
}
add_grpc_php_plugin_linux() {
get_grpc_tag
get -s -n "" "https://github.com/grpc/grpc/archive/$grpc_tag.tar.gz" | tar -xz -C /tmp
cd "/tmp/grpc-${grpc_tag:1}" || exit
add_bazel
if [ "$DISTRIB_RELEASE" = "16.04" ]; then
CC="$(command -v gcc)" CXX="$(command -v g++)" ./tools/bazel build src/compiler:grpc_php_plugin
else
./tools/bazel build src/compiler:grpc_php_plugin
fi
sudo mv ./bazel-bin/src/compiler/grpc_php_plugin /usr/local/bin/grpc_php_plugin
sudo chmod a+x /usr/local/bin/grpc_php_plugin
license_path="/tmp/grpc-${grpc_tag:1}/LICENSE"
}
add_grpc_php_plugin() {
grpc_tag=$1
get_grpc_tag
(
get -s -n "" "https://github.com/grpc/grpc/archive/$grpc_tag.tar.gz" | tar -xz -C /tmp
cd "/tmp/grpc-${grpc_tag:1}" || exit
add_bazel
[ "$(uname -s)" = "Darwin" ] && sudo xcode-select -s /Applications/Xcode_11.7.app
if [ "$DISTRIB_RELEASE" = "16.04" ]; then
CC="$(command -v gcc)" CXX="$(command -v g++)" ./tools/bazel build src/compiler:grpc_php_plugin
else
./tools/bazel build src/compiler:grpc_php_plugin
fi
sudo mv ./bazel-bin/src/compiler/grpc_php_plugin /usr/local/bin/grpc_php_plugin
sudo chmod a+x /usr/local/bin/grpc_php_plugin
) >/dev/null 2>&1
echo "::set-output name=grpc_php_plugin_path::/usr/local/bin/grpc_php_plugin"
license_path=""
if [ "$(uname -s)" = "Darwin" ]; then
add_grpc_php_plugin_macos >/dev/null 2>&1
else
add_grpc_php_plugin_linux >/dev/null 2>&1
fi
echo "::set-output name=grpc_php_plugin_path::$(command -v grpc_php_plugin)"
add_log "${tick:?}" "grpc_php_plugin" "Added grpc_php_plugin ${grpc_tag:1}"
printf "::group::\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" "grpc_php_plugin" "Click to read the grpc_php_plugin related license information"
cat "/tmp/grpc-${grpc_tag:1}/LICENSE"
cat "$license_path"
echo "::endgroup::"
}

View File

@ -8,10 +8,7 @@ param (
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$dist,
[Parameter(Position = 2, Mandatory = $false)]
[string]
$fail_fast = 'false'
$dist
)
# Function to log start of a operation.
@ -25,7 +22,7 @@ Function Add-Log($mark, $subject, $message) {
printf "\033[32;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" $mark $subject $message
} else {
printf "\033[31;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" $mark $subject $message
if($fail_fast -eq 'true') {
if($env:fail_fast -eq 'true') {
exit 1;
}
}
@ -204,10 +201,10 @@ Function Edit-ComposerConfig() {
Add-Log "$cross" "composer" "Could not download composer"
exit 1;
}
composer -q global config process-timeout 0
composer -q config -g process-timeout 0
Write-Output $composer_bin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8
if (Test-Path env:COMPOSER_TOKEN) {
composer -q global config github-oauth.github.com $env:COMPOSER_TOKEN
composer -q config -g github-oauth.github.com $env:COMPOSER_TOKEN
}
}
@ -222,12 +219,12 @@ Function Get-ToolVersion() {
$version_regex = "[0-9]+((\.{1}[0-9]+)+)(\.{0})(-[a-z0-9]+){0,1}"
if($tool -eq 'composer') {
if ($param -eq 'snapshot') {
$trunk = Select-String -Pattern "const\sBRANCH_ALIAS_VERSION" -Path $bin_dir\composer -Raw | Select-String -Pattern $version_regex | ForEach-Object { $_.matches.Value }
$commit = Select-String -Pattern "const\sVERSION" -Path $bin_dir\composer -Raw | Select-String -Pattern "[a-zA-Z0-9]+" -AllMatches | ForEach-Object { $_.matches[2].Value }
return "$trunk+$commit"
$composer_version = (Select-String -Pattern "const\sBRANCH_ALIAS_VERSION" -Path $bin_dir\composer -Raw | Select-String -Pattern $version_regex | ForEach-Object { $_.matches.Value }) + '+' + (Select-String -Pattern "const\sVERSION" -Path $bin_dir\composer -Raw | Select-String -Pattern "[a-zA-Z0-9]+" -AllMatches | ForEach-Object { $_.matches[2].Value })
} else {
return Select-String -Pattern "const\sVERSION" -Path $bin_dir\composer -Raw | Select-String -Pattern $version_regex | ForEach-Object { $_.matches.Value }
$composer_version = Select-String -Pattern "const\sVERSION" -Path $bin_dir\composer -Raw | Select-String -Pattern $version_regex | ForEach-Object { $_.matches.Value }
}
Set-Variable -Name 'composer_version' -Value $composer_version -Scope Global
return "$composer_version"
}
return . $tool $param 2> $null | ForEach-Object { $_ -replace "composer $version_regex", '' } | Select-String -Pattern $version_regex | Select-Object -First 1 | ForEach-Object { $_.matches.Value }
}
@ -310,6 +307,11 @@ Function Add-Composertool() {
[string]
$prefix
)
if($tool -match "prestissimo|composer-prefetcher" -and $composer_version.split('.')[0] -ne "1") {
Write-Output "::warning:: Skipping $tool, as it does not support Composer $composer_version. Specify composer:v1 in tools to use $tool"
Add-Log $cross $tool "Skipped"
Return
}
composer global require $prefix$release 2>&1 | out-null
$json = findstr $prefix$tool $env:APPDATA\Composer\composer.json
if(Test-Path $composer_bin\composer) {
@ -395,12 +397,14 @@ if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version
if ($version -lt '7.0' -and (Get-InstalledModule).Name -notcontains 'VcRedist') {
Install-PSPackage VcRedist VcRedist-main\VcRedist\VcRedist "$github/aaronparker/VcRedist/archive/main.zip" >$null 2>&1
}
if ($version -match $nightly_version) {
Invoke-WebRequest -Uri $bintray/Get-PhpNightly.ps1 -OutFile $php_dir\Get-PhpNightly.ps1 > $null 2>&1
& $php_dir\Get-PhpNightly.ps1 -Architecture $arch -ThreadSafe $ts -Path $php_dir -Version $version > $null 2>&1
} else {
Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1
}
try {
if ($version -match $nightly_version) {
Invoke-WebRequest -Uri $bintray/Get-PhpNightly.ps1 -OutFile $php_dir\Get-PhpNightly.ps1 > $null 2>&1
& $php_dir\Get-PhpNightly.ps1 -Architecture $arch -ThreadSafe $ts -Path $php_dir -Version $version > $null 2>&1
} else {
Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1
}
} catch { }
} else {
if($env:update -eq 'true') {
Update-Php $php_dir >$null 2>&1
@ -411,12 +415,20 @@ if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version
}
$installed = Get-Php -Path $php_dir
('date.timezone=UTC', 'memory_limit=-1') | foreach { $p=$_.split('='); Set-PhpIniKey -Key $p[0] -Value $p[1] -Path $php_dir }
if($installed.MajorMinorVersion -ne $version) {
Add-Log $cross "PHP" "Could not setup PHP $version"
exit 1
}
('date.timezone=UTC', 'memory_limit=-1', 'xdebug.mode=coverage') | ForEach-Object { $p=$_.split('='); Set-PhpIniKey -Key $p[0] -Value $p[1] -Path $php_dir }
if($version -lt "5.5") {
('libeay32.dll', 'ssleay32.dll') | ForEach { Invoke-WebRequest -Uri $bintray/$_ -OutFile $php_dir\$_ >$null 2>&1 }
('libeay32.dll', 'ssleay32.dll') | ForEach-Object { Invoke-WebRequest -Uri $bintray/$_ -OutFile $php_dir\$_ >$null 2>&1 }
} else {
$enable_extensions += ('opcache')
}
# Patch till there is a pcov DLL for PHP 8.0 on pecl
if ($version -eq '8.0') {
Invoke-WebRequest -Uri "https://github.com/shivammathur/php-extensions-windows/releases/latest/download/php$version`_$env:PHPTS`_$arch`_pcov.dll" -OutFile $php_dir"\ext\php`_pcov.dll"
}
Enable-PhpExtension -Extension $enable_extensions -Path $php_dir
Update-PhpCAInfo -Path $php_dir -Source $cert_source
Copy-Item -Path $dist\..\src\configs\*.json -Destination $env:RUNNER_TOOL_CACHE

View File

@ -157,12 +157,29 @@ export async function getCodeceptionUri(
* Helper function to get script to setup phive
*
* @param version
* @param php_version
* @param os_version
*/
export async function addPhive(
version: string,
php_version: string,
os_version: string
): Promise<string> {
switch (true) {
case /5\.[3-5]/.test(php_version):
return await utils.addLog(
'$cross',
'phive',
'Phive is not supported on PHP ' + php_version,
os_version
);
case /5\.6|7\.0/.test(php_version):
version = version.replace('latest', '0.12.1');
break;
case /7\.1/.test(php_version):
version = version.replace('latest', '0.13.5');
break;
}
switch (version) {
case 'latest':
return (
@ -306,14 +323,10 @@ export async function getWpCliUrl(version: string): Promise<string> {
export async function addComposer(tools_list: string[]): Promise<string[]> {
const regex_any = /^composer($|:.*)/;
const regex_valid = /^composer:?($|preview$|snapshot$|v?[1-2]$|v?\d+\.\d+\.\d+[\w-]*$)/;
const regex_composer1_tools = /hirak|prestissimo|narrowspark|composer-prefetcher/;
const matches: string[] = tools_list.filter(tool => regex_valid.test(tool));
let composer = 'composer';
tools_list = tools_list.filter(tool => !regex_any.test(tool));
switch (true) {
case regex_composer1_tools.test(tools_list.join(' ')):
composer = 'composer:1';
break;
case matches[0] == undefined:
break;
default:
@ -543,7 +556,7 @@ export async function addTools(
script += await addPackage(tool, release, 'robmorgan/', os_version);
break;
case 'phive':
script += await addPhive(version, os_version);
script += await addPhive(version, php_version, os_version);
break;
case 'php-config':
case 'phpize':

View File

@ -1,4 +1,6 @@
import {IncomingMessage} from 'http';
import * as fs from 'fs';
import * as https from 'https';
import * as path from 'path';
import * as core from '@actions/core';
@ -41,15 +43,35 @@ export async function getInput(
}
}
/**
* Function to fetch an URL
*
* @param url
*/
export async function fetch(url: string): Promise<string> {
const fetch_promise: Promise<string> = new Promise(resolve => {
const req = https.get(url, (res: IncomingMessage) => {
res.setEncoding('utf8');
let body = '';
res.on('data', chunk => (body += chunk));
res.on('end', () => resolve(body));
});
req.end();
});
return await fetch_promise;
}
/**
* Function to parse PHP version.
*
* @param version
*/
export async function parseVersion(version: string): Promise<string> {
switch (version) {
case 'latest':
return '7.4';
const manifest =
'https://raw.githubusercontent.com/shivammathur/setup-php/develop/src/configs/php-versions.json';
switch (true) {
case /latest|\d.x/.test(version):
return JSON.parse(await fetch(manifest))[version];
default:
switch (true) {
case version.length > 1:
@ -228,8 +250,7 @@ export async function extensionArray(
return extension
.trim()
.toLowerCase()
.replace('php-', '')
.replace('php_', '');
.replace(/^php[-_]/, '');
})
.filter(Boolean);
}
@ -248,9 +269,12 @@ export async function CSVArray(values_csv: string): Promise<Array<string>> {
return [];
default:
return values_csv
.split(',')
.map(function (value: string) {
return value.trim();
.split(/,(?=(?:(?:[^"']*["']){2})*[^"']*$)/)
.map(function (value) {
return value
.trim()
.replace(/^["']|["']$|(?<==)["']/g, '')
.replace(/=(((?!E_).)*[?{}|&~![()^]+((?!E_).)+)/, "='$1'");
})
.filter(Boolean);
}
@ -262,18 +286,11 @@ export async function CSVArray(values_csv: string): Promise<Array<string>> {
* @param extension
*/
export async function getExtensionPrefix(extension: string): Promise<string> {
const zend: Array<string> = [
'xdebug',
'xdebug3',
'opcache',
'ioncube',
'eaccelerator'
];
switch (zend.indexOf(extension)) {
switch (true) {
default:
return 'zend_extension';
case -1:
return 'extension';
case /xdebug([2-3])?$|opcache|ioncube|eaccelerator/.test(extension):
return 'zend_extension';
}
}