sp-dev-fx-webparts/samples/react-real-time/Deploy-Solution.ps1

165 lines
6.4 KiB
PowerShell

[CmdletBinding()]
Param(
[Parameter(Mandatory=$True,Position=1)]
[string]$SiteUrl,
[Parameter(Mandatory=$True)]
[string]$UserName,
[Parameter(Mandatory=$True)]
[string]$Password
)
$0 = $myInvocation.MyCommand.Definition
$CommandDirectory = [System.IO.Path]::GetDirectoryName($0)
Set-Location $CommandDirectory
# -----------------------------------------------------
# SharePoint Configuration
# -----------------------------------------------------
# Connect to the site
$PasswordAsSecure = ConvertTo-SecureString $Password -AsPlainText -Force
$Credentials = New-Object System.Management.Automation.PSCredential ($UserName , $PasswordAsSecure)
Connect-SPOnline -Url $SiteUrl -Credentials $Credentials
Write-Host -ForegroundColor Magenta "Apply PnP template to site '$SiteUrl'..."
# Create the SharePoint list in the dev site
Apply-SPOProvisioningTemplate -Path ".\template.xml"
Write-Host -ForegroundColor Green "Done!"
# -----------------------------------------------------
# Azure Configuration
# -----------------------------------------------------
Write-Host -ForegroundColor Magenta "Login to Azure..."
Login-AzureRmAccount
$GitPublishingUserName = "tempdeployuser" + [Guid]::NewGuid();
$GitPublishingUserPassword = "socketio123!"
$LogicAppName = "LogicApp" + [Guid]::NewGuid();
$AzureSBNamespace = "ServiceBus" + [Guid]::NewGuid();
$AzureWebAppName = "WebApp" + [Guid]::NewGuid()
$AppServicePlanName = "ServicePlan" + [Guid]::NewGuid()
$TemplateFilePath = ".\azure-deploy.json"
$AzureResourceGroupLocation = "East US2"
$AzureResourceGroupName = "SPFxSocketIODemo"
$AzureRmResourceGroupDeploymentName = $AzureResourceGroupName
$ServerCodeFolderLocation = ".\server"
# Set the publishing user and password for the local Git deployment
$PropertiesObject = @{
"publishingUserName" = $GitPublishingUserName;
"publishingPassword" = $GitPublishingUserPassword;
}
Try {
Set-AzureRmResource -PropertyObject $PropertiesObject -ResourceId /providers/Microsoft.Web/publishingUsers/web -ApiVersion 2015-08-01 -Force
Write-Host -ForegroundColor Magenta "Creating the Azure resource Group [$AzureResourceGroupName]..."
New-AzureRmResourceGroup -Name $AzureResourceGroupName -Location $AzureResourceGroupLocation
# Deploy the Azure Resource Group using an ARM template
# More information here: https://azure.microsoft.com/en-us/documentation/articles/resource-group-authoring-templates/#resources
$TemplateParameters = @{
"LogicAppName" = $LogicAppName
"ServiceBusNameSpace"=$AzureSBNamespace;
"AppServicePlanName"= $AppServicePlanName;
"SiteName"=$AzureWebAppName;
"Location"=$AzureResourceGroupLocation
}
Write-Host -ForegroundColor Magenta "Deploying Azure resources using ARM template..."
Test-AzureRmResourceGroupDeployment -ResourceGroupName $AzureResourceGroupName -TemplateFile $TemplateFilePath -TemplateParameterObject $TemplateParameters
New-AzureRmResourceGroupDeployment -Name $AzureRmResourceGroupDeploymentName -ResourceGroupName $AzureResourceGroupName -TemplateFile $TemplateFilePath -TemplateParameterObject $TemplateParameters
Write-Host -ForegroundColor Green "Done!"
Write-Host -ForegroundColor Magenta "Updating Web Application settings..."
$CurrentNamespace = Get-AzureSBNamespace -Name $AzureSBNamespace
# Check if the namespace already exists or needs to be created
if ($CurrentNamespace) {
Write-Host -ForegroundColor Magenta "Set application settings for service bus connection..."
# Set the Web Application settings
$AppSettings = New-Object Hashtable
$AppSettings["AZURE_SERVICEBUS_ACCESS_KEY"]=$CurrentNamespace.ConnectionString
# Set application settings and enable WebSockets
Set-AzureWebsite -Name $AzureWebAppName -AppSettings $AppSettings
} else {
Write-Warning "Azure Service Bus namespace '$AzureSBNamespace' not found. Make sure you've selected the right Azure subscription (forgot to run the Add-AzureAccount cmdlet?)"
}
Write-Host -ForegroundColor Green "Done!"
# Deploy the code to the Web Application using Local Git
# Note: the part below is only valid for this demo. In a real world situation, you may want link to your TFS/GitHub/BitBucket repository instead.
# See https://azure.microsoft.com/en-us/documentation/articles/app-service-deploy-local-git/ for more information
Write-Host -ForegroundColor Magenta "Deploying the Web Application Node JS code using Local Git..."
# Go to the location where the code for the server is located and commit/push it to the local git repository of the web application.
Push-Location $ServerCodeFolderLocation
# Remove previous git config if exists
if (Test-Path .git) {
Remove-Item -Recurse .git -Force
}
git init
git add -A
git commit -m "SPFx Socket IO Demo - Server code"
# Build the git clone URL with embbed password
$GitCloneURL = "https://$GitPublishingUserName" + ":$GitPublishingUserPassword@$AzureWebAppName.scm.azurewebsites.net:443/$AzureWebAppName.git"
# Make sure there is no 502 error and the git URL is up and running (can take few seconds)
$Timeout = New-TimeSpan -Minutes 1
$sw = [Diagnostics.Stopwatch]::StartNew()
Write-Host -ForegroundColor Yellow "Wait for the git clone URL is up and running" -NoNewline
while ($sw.elapsed -lt $Timeout) {
if ((Invoke-WebRequest -Uri $GitCloneURL).StatusCode -eq 200) {
Write-Host "`n"
git remote add azure $GitCloneURL 2>&1 | %{ "$_" }
# We force the push to overwrite remote with local files avoiding update conflicts (don't use this in production)
git push azure master --force 2>&1 | %{ "$_" }
# Update URLs in the client side code according to the web app name
Pop-Location
$files = @(".\client\config\config.json",".\client\src\webparts\realTimeNewsFeed\components\RealTimeNewsFeed.tsx")
$files | ForEach-Object { (Get-Content $_) -replace 'https:\/\/(\S*)\.azurewebsites\.net', "https://$AzureWebAppName.azurewebsites.net" | Set-Content $_ }
Write-Host -ForegroundColor Green "Done!"
return
}
Start-Sleep -Seconds 5
Write-Host -ForegroundColor Yellow "."
}
Write-Warning "The git clone URL timed out!"
} Catch {
$ErrorMessage = $_.Exception.Message
Write-Error $ErrorMessage
Exit
}