This is an exercise resulting from a blog post by Rob Ahnemann and I will cover Install-SitecoreConfiguration
in more details on an example of installing Sitecore modules SPE and SXA as a part of a Sitecore installation by SIF.
Install-SitecoreConfiguration is one of the most what actually SIF is. In my Sitecore installation script I have created a step called Install-Packages. Let's look at how it works:
function Install-Packages {
Unblock-File .\build\PostInstall\Invoke-InstallPackageTask.psm1
Install-SitecoreConfiguration -Path .\build\PostInstall\install-sitecore-package.json -SiteName "$SolutionPrefix.$SitePostFix"
}
This installs a configuration called install-sitecore-package.json
Opening it looks like below:
{
"Parameters": {
"SiteName": {
"Type": "string",
"DefaultValue": "Sitecore",
"Description": "The name of the site to be deployed."
},
"InstallDirectory": {
"Type": "string",
"DefaultValue": "c:\\inetpub\\wwwroot",
"Description": "Base folder to where website is deployed."
}
},
"Variables": {
// The sites full path on disk
"Site.PhysicalPath": "[joinpath(parameter('InstallDirectory'), parameter('SiteName'))]",
"Site.Url": "[concat('http://', parameter('SiteName'))]"
},
"Tasks": {
"InstallPackages":{
"Type": "InstallPackage",
"Params": [
{
"SiteFolder": "[variable('Site.PhysicalPath')]",
"SiteUrl": "[variable('Site.Url')]",
"PackagePath": ".\\build\\assets\\Modules\\Sitecore PowerShell Extensions-4.7.2 for Sitecore 8.zip"
},
{
"SiteFolder": "[variable('Site.PhysicalPath')]",
"SiteUrl": "[variable('Site.Url')]",
"PackagePath": ".\\build\\assets\\Modules\\Sitecore Experience Accelerator 1.6 rev. 180103 for 9.0.zip"
}
]
}
},
"Modules":[
".\\build\\PostInstall\\Invoke-InstallPackageTask.psm1"
]
}
Parameters are values that may be passed when Install-SitecoreConfiguration is called. Parameters must declare a Type and may declare a DefaultValue and Description. Parameters with no DefaultValue are required when Install-SitecoreConfiguration is called.
Variables are values calculated in a configuration. They can reference Parameters, other Variables, and config functions.
Tasks are separate units of work in a configuration. Each task is an action that will be completed when Install-SitecoreConfiguration is called. By default, tasks are applied in the order they are declared. Tasks may reference Parameters, Variables, and config functions.
Finally, the last line is actually referencing the actual task - a PowerShell module script (Invoke-InstallPackageTask.psm1) that will be run with given parameters:
Set-StrictMode -Version 2.0
Function Invoke-InstallPackageTask {
[CmdletBinding(SupportsShouldProcess=$true)]
param(
[Parameter(Mandatory=$true)]
[string]$SiteFolder,
[Parameter(Mandatory=$true)]
[string]$SiteUrl,
[Parameter(Mandatory=$true)]
[string]$PackagePath
)
Write-TaskInfo "Installing Package $PackagePath" -Tag 'PackageInstall'
#Generate a random 10 digit folder name. For security
$folderKey = -join ((97..122) | Get-Random -Count 10 | % {[char]$_})
#Generate a Access Key (hi there TDS)
$accessKey = New-Guid
Write-TaskInfo "Folder Key = $folderKey" -Tag 'PackageInstall'
Write-TaskInfo "Access Guid = $accessKey" -Tag 'PackageInstall'
#The path to the source Agent. Should be in the same folder as I'm running
$sourceAgentPath = Resolve-Path "PackageInstaller.asmx"
#The folder on the Server where the Sitecore PackageInstaller folder is to be created
$packageInstallPath = [IO.Path]::Combine($SiteFolder, 'sitecore', 'PackageInstaller')
#The folder where the actuall install happens
$destPath = [IO.Path]::Combine($SiteFolder, 'sitecore', 'PackageInstaller', $folderKey)
#Full path including the installer name
$fullFileDestPath = Join-Path $destPath "PackageInstaller.asmx"
Write-TaskInfo "Source Agent [$sourceAgentPath]" -Tag 'PackageInstall'
Write-TaskInfo "Dest AgentPath [$destPath]" -Tag 'PackageInstall'
#Forcibly cread the folder
New-Item -ItemType Directory -Force -Path $destPath
#Read contents of the file, and embed the security token
(Get-Content $sourceAgentPath).replace('[TOKEN]', $accessKey) | Set-Content $fullFileDestPath
#How do we get to Sitecore? This URL!
$webURI= "$siteURL/sitecore/PackageInstaller/$folderKey/packageinstaller.asmx?WSDL"
Write-TaskInfo "Url $webURI" -Tag 'PackageInstall'
#Do the install here
$proxy = New-WebServiceProxy -uri $webURI
$proxy.Timeout = 1800000
#Invoke our proxy
$proxy.InstallZipPackage($PackagePath, $accessKey)
#Remove the folderKey
Remove-Item $packageInstallPath -Recurse
}
Register-SitecoreInstallExtension -Command Invoke-InstallPackageTask -As InstallPackage -Type Task
What this task does is locates ASMX file, which is an actual handler and copies it into temp random folder within your Sitecore instance allowing you to execute package installer APIs that itself does require Sitecore context.
Obviously, before running .\install-xp0.ps1
please make sure you have both installers for modules by their paths as per configuration parameters in PackagePath (from example above, they are):
.\build\assets\Modules\Sitecore PowerShell Extensions-4.7.2 for Sitecore 8.zip
.\build\assets\Modules\Sitecore Experience Accelerator 1.6 rev. 180103 for 9.0.zip
So, that's how we added new SitecoreConfiguration in order to achieve automated package installation of SPE and SXA by SIF. Since now new locally installed Sitecore instance already has both SPE and SXA pre-installed and ready to use. This approach also allows installing any other modules as you may need them pre-installed.
Finally, would highly recommend watching a great video by Thomas Eldblom about using SIF configurations:
UPDATE: there is another way of doing this by new built-in SIF functionality, please read the blog post here.