2019-09-06 06:47:43 +07:00
|
|
|
param (
|
2019-12-26 20:01:18 +07:00
|
|
|
[Parameter(Position = 0, Mandatory = $true)]
|
|
|
|
[ValidateNotNull()]
|
|
|
|
[ValidateLength(1, [int]::MaxValue)]
|
|
|
|
[string]
|
|
|
|
$version = '7.4',
|
|
|
|
[Parameter(Position = 1, Mandatory = $true)]
|
|
|
|
[ValidateNotNull()]
|
|
|
|
[ValidateLength(1, [int]::MaxValue)]
|
|
|
|
[string]
|
|
|
|
$dir
|
2019-09-06 06:47:43 +07:00
|
|
|
)
|
|
|
|
|
2019-10-17 03:11:13 +07:00
|
|
|
Function Step-Log($message) {
|
2019-10-23 16:57:40 +07:00
|
|
|
printf "\n\033[90;1m==> \033[0m\033[37;1m%s \033[0m\n" $message
|
2019-10-17 03:11:13 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
Function Add-Log($mark, $subject, $message) {
|
2019-11-25 17:53:13 +07:00
|
|
|
$code = if ($mark -eq $cross) { "31" } else { "32" }
|
2019-10-23 16:57:40 +07:00
|
|
|
printf "\033[%s;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" $code $mark $subject $message
|
2019-10-17 03:11:13 +07:00
|
|
|
}
|
|
|
|
|
2020-05-05 01:36:09 +07:00
|
|
|
Function Get-PathFromRegistry {
|
|
|
|
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" +
|
|
|
|
[System.Environment]::GetEnvironmentVariable("Path","User")
|
|
|
|
if($null -eq (Get-Content $current_profile | findstr 'Get-PathFromRegistry')) {
|
|
|
|
Add-Content -Path $current_profile -Value 'Function Get-PathFromRegistry { $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") }; Get-PathFromRegistry'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Function Add-Path {
|
|
|
|
param(
|
|
|
|
[string]$PathItem
|
|
|
|
)
|
|
|
|
$newPath = (Get-ItemProperty -Path 'hkcu:\Environment' -Name PATH).Path.replace("$PathItem;", '')
|
|
|
|
$newPath = $PathItem + ';' + $newPath
|
|
|
|
Set-ItemProperty -Path 'hkcu:\Environment' -Name Path -Value $newPath
|
|
|
|
Get-PathFromRegistry
|
|
|
|
}
|
|
|
|
|
|
|
|
Function Get-CleanPSProfile {
|
|
|
|
if(-not(Test-Path -LiteralPath $profile)) {
|
|
|
|
New-Item -Path $profile -ItemType "file" -Force
|
|
|
|
}
|
|
|
|
Set-Content $current_profile -Value ''
|
|
|
|
if ($null -eq (Get-Content $profile | FindStr $current_profile.replace('\', '\\'))) {
|
|
|
|
Add-Content $profile -Value ". $current_profile"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-16 12:48:01 +07:00
|
|
|
Function Install-PhpManager() {
|
|
|
|
$repo = "mlocati/powershell-phpmanager"
|
|
|
|
$zip_file = "$php_dir\PhpManager.zip"
|
|
|
|
$tags = Invoke-WebRequest https://api.github.com/repos/$repo/tags | ConvertFrom-Json
|
|
|
|
$tag = $tags[0].Name
|
|
|
|
$module_path = "$php_dir\PhpManager\powershell-phpmanager-$tag\PhpManager"
|
|
|
|
Invoke-WebRequest -UseBasicParsing -Uri https://github.com/$repo/archive/$tag.zip -OutFile $zip_file
|
|
|
|
Expand-Archive -Path $zip_file -DestinationPath $php_dir\PhpManager
|
|
|
|
Import-Module $module_path
|
2020-05-05 01:36:09 +07:00
|
|
|
if($null -eq (Get-Content $current_profile | findstr 'powershell-phpmanager')) {
|
|
|
|
Add-Content -Path $current_profile -Value "Import-Module $module_path"
|
|
|
|
}
|
2020-03-16 12:48:01 +07:00
|
|
|
}
|
|
|
|
|
2019-11-25 22:35:11 +07:00
|
|
|
Function Add-Extension {
|
|
|
|
Param (
|
|
|
|
[Parameter(Position = 0, Mandatory = $true)]
|
|
|
|
[ValidateNotNull()]
|
|
|
|
[ValidateLength(1, [int]::MaxValue)]
|
|
|
|
[string]
|
|
|
|
$extension,
|
|
|
|
[Parameter(Position = 1, Mandatory = $false)]
|
|
|
|
[ValidateNotNull()]
|
|
|
|
[ValidateSet('stable', 'beta', 'alpha', 'devel', 'snapshot')]
|
|
|
|
[string]
|
2020-02-14 00:09:00 +07:00
|
|
|
$mininum_stability = 'stable',
|
|
|
|
[Parameter(Position = 2, Mandatory = $false)]
|
|
|
|
[ValidateNotNull()]
|
|
|
|
[ValidatePattern('^\d+(\.\d+){0,2}$')]
|
|
|
|
[string]
|
|
|
|
$extension_version = ''
|
2019-11-25 22:35:11 +07:00
|
|
|
)
|
2019-10-11 06:11:25 +07:00
|
|
|
try {
|
2019-11-25 17:53:13 +07:00
|
|
|
$extension_info = Get-PhpExtension -Path $php_dir | Where-Object { $_.Name -eq $extension -or $_.Handle -eq $extension }
|
2020-01-30 13:33:30 +07:00
|
|
|
if ($null -ne $extension_info) {
|
2019-11-25 17:53:13 +07:00
|
|
|
switch ($extension_info.State) {
|
|
|
|
'Builtin' {
|
|
|
|
Add-Log $tick $extension "Enabled"
|
|
|
|
}
|
|
|
|
'Enabled' {
|
|
|
|
Add-Log $tick $extension "Enabled"
|
|
|
|
}
|
|
|
|
default {
|
|
|
|
Enable-PhpExtension -Extension $extension_info.Handle -Path $php_dir
|
|
|
|
Add-Log $tick $extension "Enabled"
|
|
|
|
}
|
2019-10-11 06:11:25 +07:00
|
|
|
}
|
|
|
|
}
|
2019-11-25 17:53:13 +07:00
|
|
|
else {
|
2020-02-14 16:39:56 +07:00
|
|
|
if($extension_version -ne '') {
|
2020-02-16 01:55:50 +07:00
|
|
|
Install-PhpExtension -Extension $extension -Version $extension_version -MinimumStability $mininum_stability -Path $php_dir
|
|
|
|
} else {
|
|
|
|
Install-PhpExtension -Extension $extension -MinimumStability $mininum_stability -Path $php_dir
|
2020-02-14 16:39:56 +07:00
|
|
|
}
|
2020-02-16 01:55:50 +07:00
|
|
|
|
2020-01-30 13:33:30 +07:00
|
|
|
Add-Log $tick $extension "Installed and enabled"
|
2019-10-11 06:11:25 +07:00
|
|
|
}
|
|
|
|
}
|
2019-11-25 17:53:13 +07:00
|
|
|
catch {
|
2019-12-09 09:39:03 +07:00
|
|
|
Add-Log $cross $extension "Could not install $extension on PHP $($installed.FullVersion)"
|
2019-11-25 17:53:13 +07:00
|
|
|
}
|
|
|
|
}
|
2019-12-24 00:49:38 +07:00
|
|
|
|
2019-12-26 20:01:18 +07:00
|
|
|
Function Remove-Extension() {
|
2019-12-24 00:49:38 +07:00
|
|
|
Param (
|
|
|
|
[Parameter(Position = 0, Mandatory = $true)]
|
|
|
|
[ValidateNotNull()]
|
2019-12-26 20:01:18 +07:00
|
|
|
[ValidateLength(1, [int]::MaxValue)]
|
2019-12-24 00:49:38 +07:00
|
|
|
[string]
|
|
|
|
$extension
|
|
|
|
)
|
2019-12-26 20:01:18 +07:00
|
|
|
if(php -m | findstr -i $extension) {
|
2020-05-07 04:57:00 +07:00
|
|
|
try {
|
|
|
|
Disable-PhpExtension $extension $php_dir
|
|
|
|
if (Test-Path $ext_dir\php_$extension.dll) {
|
|
|
|
Remove-Item $ext_dir\php_$extension.dll
|
|
|
|
}
|
|
|
|
Add-Log $tick ":$extension" "Removed"
|
|
|
|
} catch {
|
|
|
|
Add-Log $cross ":$extension" "Could not remove $extension on PHP $($installed.FullVersion)"
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
Add-Log $tick ":$extension" "Could not find $extension on PHP $($installed.FullVersion)"
|
2019-12-26 20:01:18 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-27 08:26:49 +07:00
|
|
|
Function Add-Tool() {
|
|
|
|
Param (
|
|
|
|
[Parameter(Position = 0, Mandatory = $true)]
|
|
|
|
[ValidateNotNull()]
|
|
|
|
[ValidateLength(1, [int]::MaxValue)]
|
|
|
|
[string]
|
|
|
|
$url,
|
|
|
|
[Parameter(Position = 1, Mandatory = $true)]
|
|
|
|
[ValidateNotNull()]
|
|
|
|
[ValidateLength(1, [int]::MaxValue)]
|
|
|
|
[string]
|
|
|
|
$tool
|
|
|
|
)
|
2020-01-26 12:41:36 +07:00
|
|
|
if (Test-Path $php_dir\$tool) {
|
|
|
|
Remove-Item $php_dir\$tool
|
|
|
|
}
|
2020-02-06 06:54:45 +07:00
|
|
|
if ($tool -eq "symfony") {
|
2020-01-26 12:41:36 +07:00
|
|
|
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool.exe
|
2020-05-05 01:36:09 +07:00
|
|
|
Add-Content -Path $current_profile -Value "New-Alias $tool $php_dir\$tool.exe" >$null 2>&1
|
2019-12-28 02:12:00 +07:00
|
|
|
} else {
|
2020-01-07 09:36:14 +07:00
|
|
|
try {
|
|
|
|
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool
|
|
|
|
$bat_content = @()
|
|
|
|
$bat_content += "@ECHO off"
|
|
|
|
$bat_content += "setlocal DISABLEDELAYEDEXPANSION"
|
|
|
|
$bat_content += "SET BIN_TARGET=%~dp0/" + $tool
|
|
|
|
$bat_content += "php %BIN_TARGET% %*"
|
|
|
|
Set-Content -Path $php_dir\$tool.bat -Value $bat_content
|
2020-05-05 01:36:09 +07:00
|
|
|
Add-Content -Path $current_profile -Value "New-Alias $tool $php_dir\$tool.bat" >$null 2>&1
|
2020-01-26 12:41:36 +07:00
|
|
|
} catch { }
|
2020-01-07 09:36:14 +07:00
|
|
|
}
|
2020-05-21 05:21:28 +07:00
|
|
|
if($tool -eq "phan") {
|
|
|
|
Add-Extension fileinfo >$null 2>&1
|
|
|
|
Add-Extension ast >$null 2>&1
|
|
|
|
} elseif($tool -eq "phive") {
|
2020-01-21 03:10:24 +07:00
|
|
|
Add-Extension xml >$null 2>&1
|
2020-02-06 06:54:45 +07:00
|
|
|
} elseif($tool -eq "cs2pr") {
|
2020-02-03 01:21:44 +07:00
|
|
|
(Get-Content $php_dir/cs2pr).replace('exit(9)', 'exit(0)') | Set-Content $php_dir/cs2pr
|
2020-02-06 06:54:45 +07:00
|
|
|
} elseif($tool -eq "composer") {
|
|
|
|
composer -q global config process-timeout 0
|
2020-05-10 20:13:58 +07:00
|
|
|
Write-Output "::add-path::$env:APPDATA\Composer\vendor\bin"
|
2020-03-25 09:14:38 +07:00
|
|
|
if (Test-Path env:COMPOSER_TOKEN) {
|
|
|
|
composer -q global config github-oauth.github.com $env:COMPOSER_TOKEN
|
|
|
|
}
|
2020-02-22 23:11:40 +07:00
|
|
|
} elseif($tool -eq "wp-cli") {
|
|
|
|
Copy-Item $php_dir\wp-cli.bat -Destination $php_dir\wp.bat
|
2020-02-03 01:21:44 +07:00
|
|
|
}
|
2020-01-26 18:51:04 +07:00
|
|
|
if (((Get-ChildItem -Path $php_dir/* | Where-Object Name -Match "^$tool(.exe|.phar)*$").Count -gt 0)) {
|
2020-01-26 12:41:36 +07:00
|
|
|
Add-Log $tick $tool "Added"
|
|
|
|
} else {
|
|
|
|
Add-Log $cross $tool "Could not add $tool"
|
|
|
|
}
|
2020-01-07 09:36:14 +07:00
|
|
|
}
|
|
|
|
|
2020-02-28 14:49:12 +07:00
|
|
|
Function Add-Composertool() {
|
2020-01-07 09:36:14 +07:00
|
|
|
Param (
|
|
|
|
[Parameter(Position = 0, Mandatory = $true)]
|
|
|
|
[ValidateNotNull()]
|
|
|
|
[ValidateLength(1, [int]::MaxValue)]
|
|
|
|
[string]
|
|
|
|
$tool,
|
|
|
|
[Parameter(Position = 1, Mandatory = $true)]
|
|
|
|
[ValidateNotNull()]
|
|
|
|
[ValidateLength(1, [int]::MaxValue)]
|
|
|
|
[string]
|
|
|
|
$release,
|
|
|
|
[Parameter(Position = 2, Mandatory = $true)]
|
|
|
|
[ValidateNotNull()]
|
|
|
|
[ValidateLength(1, [int]::MaxValue)]
|
|
|
|
[string]
|
|
|
|
$prefix
|
|
|
|
)
|
|
|
|
composer -q global require $prefix$release 2>&1 | out-null
|
|
|
|
if($?) {
|
|
|
|
Add-Log $tick $tool "Added"
|
|
|
|
} else {
|
|
|
|
Add-Log $cross $tool "Could not setup $tool"
|
2019-12-27 08:26:49 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-28 14:49:12 +07:00
|
|
|
Function Add-Pecl() {
|
2020-01-26 02:34:09 +07:00
|
|
|
Add-Log $tick "PECL" "Use extensions input to setup PECL extensions on windows"
|
2019-12-27 08:26:49 +07:00
|
|
|
}
|
|
|
|
|
2020-02-28 14:49:12 +07:00
|
|
|
Function Add-Blackfire() {
|
2020-05-07 18:44:15 +07:00
|
|
|
$agent_data = Invoke-WebRequest https://blackfire.io/docs/up-and-running/update | ForEach-Object { $_.tostring() -split "[`r`n]" | Select-String '<td class="version">' | Select-Object -Index 0 }
|
|
|
|
$agent_version = [regex]::Matches($agent_data, '<td.*?>(.+)</td>') | ForEach-Object {$_.Captures[0].Groups[1].value }
|
2020-02-28 14:49:12 +07:00
|
|
|
$url = "https://packages.blackfire.io/binaries/blackfire-agent/${agent_version}/blackfire-agent-windows_${arch_name}.zip"
|
|
|
|
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\blackfire.zip >$null 2>&1
|
2020-05-05 01:36:09 +07:00
|
|
|
Expand-Archive -Path $php_dir\blackfire.zip -DestinationPath $php_dir -Force >$null 2>&1
|
|
|
|
Add-Content -Path $current_profile -Value "New-Alias blackfire $php_dir\blackfire.exe"
|
|
|
|
Add-Content -Path $current_profile -Value "New-Alias blackfire-agent $php_dir\blackfire-agent.exe"
|
2020-02-28 14:49:12 +07:00
|
|
|
if ((Test-Path env:BLACKFIRE_SERVER_ID) -and (Test-Path env:BLACKFIRE_SERVER_TOKEN)) {
|
|
|
|
blackfire-agent --register --server-id=$env:BLACKFIRE_SERVER_ID --server-token=$env:BLACKFIRE_SERVER_TOKEN >$null 2>&1
|
|
|
|
}
|
|
|
|
if ((Test-Path env:BLACKFIRE_CLIENT_ID) -and (Test-Path env:BLACKFIRE_CLIENT_TOKEN)) {
|
|
|
|
blackfire --config --client-id=$env:BLACKFIRE_CLIENT_ID --client-token=$env:BLACKFIRE_CLIENT_TOKEN --ca-cert=$php_dir\ssl\cacert.pem >$null 2>&1
|
|
|
|
}
|
2020-03-02 21:09:18 +07:00
|
|
|
Add-Log $tick "blackfire" "Added"
|
|
|
|
Add-Log $tick "blackfire-agent" "Added"
|
2020-02-28 14:49:12 +07:00
|
|
|
}
|
|
|
|
|
2019-12-26 20:01:18 +07:00
|
|
|
# Variables
|
|
|
|
$tick = ([char]8730)
|
|
|
|
$cross = ([char]10007)
|
|
|
|
$php_dir = 'C:\tools\php'
|
2020-05-05 01:36:09 +07:00
|
|
|
$ext_dir = "$php_dir\ext"
|
|
|
|
$current_profile = "$env:TEMP\setup-php.ps1"
|
2019-12-26 20:01:18 +07:00
|
|
|
$ProgressPreference = 'SilentlyContinue'
|
|
|
|
$master_version = '8.0'
|
2020-05-05 01:36:09 +07:00
|
|
|
|
2020-01-20 23:20:44 +07:00
|
|
|
$arch = 'x64'
|
2020-05-05 01:36:09 +07:00
|
|
|
$arch_name ='amd64'
|
|
|
|
if(-not([Environment]::Is64BitOperatingSystem) -or $version -lt '7.0') {
|
|
|
|
$arch = 'x86'
|
|
|
|
$arch_name = '386'
|
2020-01-20 23:20:44 +07:00
|
|
|
}
|
2019-12-26 20:01:18 +07:00
|
|
|
|
2020-05-05 01:36:09 +07:00
|
|
|
$ts = $env:PHPTS -eq 'ts'
|
|
|
|
if($env:PHPTS -ne 'ts') {
|
|
|
|
$env:PHPTS = 'nts'
|
|
|
|
}
|
|
|
|
|
|
|
|
if($env:RUNNER -eq 'self-hosted') {
|
|
|
|
$bin_dir = 'C:\tools\bin'
|
|
|
|
$php_dir = "$php_dir$version"
|
|
|
|
$ext_dir = "$php_dir\ext"
|
|
|
|
Get-CleanPSProfile >$null 2>&1
|
|
|
|
New-Item $bin_dir -Type Directory 2>&1 | Out-Null
|
|
|
|
Add-Path -PathItem $bin_dir
|
|
|
|
if(-not(Test-Path $bin_dir\printf.exe)) {
|
|
|
|
Invoke-WebRequest -UseBasicParsing -Uri "https://github.com/shivammathur/printf/releases/latest/download/printf-$arch.zip" -OutFile "$bin_dir\printf.zip" >$null 2>&1
|
|
|
|
Expand-Archive -Path $bin_dir\printf.zip -DestinationPath $bin_dir -Force >$null 2>&1
|
|
|
|
}
|
|
|
|
if($version -lt 5.6) {
|
|
|
|
Add-Log $cross "PHP" "PHP $version is not supported on self-hosted runner"
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
New-Item $php_dir -Type Directory 2>&1 | Out-Null
|
|
|
|
Add-Path -PathItem $php_dir
|
|
|
|
setx PHPROOT $php_dir >$null 2>&1
|
|
|
|
} else {
|
|
|
|
$current_profile = "$PSHOME\Profile.ps1"
|
|
|
|
}
|
2019-12-26 20:01:18 +07:00
|
|
|
Step-Log "Setup PhpManager"
|
2020-03-16 12:48:01 +07:00
|
|
|
Install-PhpManager >$null 2>&1
|
2019-12-26 20:01:18 +07:00
|
|
|
Add-Log $tick "PhpManager" "Installed"
|
|
|
|
|
2020-05-05 01:36:09 +07:00
|
|
|
Step-Log "Setup PHP"
|
2019-12-26 20:01:18 +07:00
|
|
|
$installed = $null
|
|
|
|
if (Test-Path -LiteralPath $php_dir -PathType Container) {
|
|
|
|
try {
|
|
|
|
$installed = Get-Php -Path $php_dir
|
2020-05-05 01:36:09 +07:00
|
|
|
} catch { }
|
2019-12-24 00:49:38 +07:00
|
|
|
}
|
2020-01-16 11:46:44 +07:00
|
|
|
$status = "Installed"
|
2020-01-20 23:20:44 +07:00
|
|
|
if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version -replace '^(\d+(\.\d+)*).*', '$1.'))) -or $ts -ne $installed.ThreadSafe) {
|
2020-05-05 01:36:09 +07:00
|
|
|
if ($version -lt '7.0' -and (Get-InstalledModule).Name -notcontains 'VcRedist') {
|
2019-12-26 20:01:18 +07:00
|
|
|
Install-Module -Name VcRedist -Force
|
|
|
|
}
|
|
|
|
if ($version -eq $master_version) {
|
|
|
|
$version = 'master'
|
|
|
|
}
|
|
|
|
|
2020-01-20 23:20:44 +07:00
|
|
|
Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force >$null 2>&1
|
2020-01-16 11:46:44 +07:00
|
|
|
} else {
|
2020-05-05 01:36:09 +07:00
|
|
|
if($env:update -eq 'true') {
|
2020-02-28 14:49:12 +07:00
|
|
|
Update-Php $php_dir >$null 2>&1
|
2020-02-14 00:09:00 +07:00
|
|
|
$status = "Updated to"
|
|
|
|
} else {
|
2020-01-16 11:46:44 +07:00
|
|
|
$status = "Found"
|
|
|
|
}
|
2019-12-26 20:01:18 +07:00
|
|
|
}
|
|
|
|
|
2019-12-29 01:59:28 +07:00
|
|
|
$installed = Get-Php -Path $php_dir
|
2019-12-26 20:01:18 +07:00
|
|
|
Set-PhpIniKey -Key 'date.timezone' -Value 'UTC' -Path $php_dir
|
2020-02-06 06:54:45 +07:00
|
|
|
if($version -lt "5.5") {
|
2020-05-05 01:36:09 +07:00
|
|
|
Enable-PhpExtension -Extension openssl, curl, mbstring -Path $php_dir
|
2020-02-06 06:54:45 +07:00
|
|
|
} else {
|
2020-05-05 01:36:09 +07:00
|
|
|
Enable-PhpExtension -Extension openssl, curl, opcache, mbstring -Path $php_dir
|
2020-02-06 06:54:45 +07:00
|
|
|
}
|
2019-12-26 20:01:18 +07:00
|
|
|
Update-PhpCAInfo -Path $php_dir -Source CurrentUser
|
|
|
|
if ($version -eq 'master') {
|
2020-05-05 01:36:09 +07:00
|
|
|
Copy-Item $dir"\..\src\bin\php_$env:PHPTS`_pcov.dll" -Destination $ext_dir"\php_pcov.dll"
|
2019-12-26 20:01:18 +07:00
|
|
|
Set-PhpIniKey -Key 'opcache.jit_buffer_size' -Value '256M' -Path $php_dir
|
|
|
|
Set-PhpIniKey -Key 'opcache.jit' -Value '1235' -Path $php_dir
|
|
|
|
}
|
2020-01-16 11:46:44 +07:00
|
|
|
Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)"
|