Skip to content

Instantly share code, notes, and snippets.

@Manzanit0
Last active December 7, 2022 17:08
Show Gist options
  • Save Manzanit0/3908ad6ba3136fcde328a4eccdd5613f to your computer and use it in GitHub Desktop.
Save Manzanit0/3908ad6ba3136fcde328a4eccdd5613f to your computer and use it in GitHub Desktop.
PowerShell Script to deploy repository to Salesforce. It uses SFDX CLI.
# https://codereview.stackexchange.com/questions/200870/powershell-script-to-deploy-repository-to-salesforce
param([string] $repositoryDirectory, [bool] $isProduction)
# TODO - git integration. Select a branch and check it out for deploy.
# TODO - break stuff into functions and reusable pieces. ¿piping? ¿cmdlets?
# TODO - Allow directory structures?
Write-Host -ForegroundColor green ":: Validating Repository ::"
$srcDirectory = [System.IO.Path]::Combine($repositoryDirectory, "src")
if(![System.IO.File]::Exists([System.IO.Path]::Combine($srcDirectory,"package.xml"))) {
Write-Host -ForegroundColor red "ERROR: package.xml not found in the ./src directory."
exit
}
Write-Host -ForegroundColor green "`n:: Authenticating to Salesforce ::"
if($isProduction) {
sfdx force:auth:web:login -s -r "https://login.salesforce.com"
}
else {
sfdx force:auth:web:login -s -r "https://test.salesforce.com"
}
Write-Host -ForegroundColor green "`n:: Deploying source code ::"
$deployJob = sfdx force:mdapi:deploy -d $srcDirectory -l "RunLocalTests" --json | ConvertFrom-Json
$deployJobId = $deployJob.result.id
$startedTests = $false
do {
$report = sfdx force:mdapi:deploy:report -i $deployJobId --json --verbose 2>&1 | ConvertFrom-Json
if($null -eq $report) {
continue
}
# Deployment progress block.
if($report.result.numberComponentsTotal -ne 0 -and $componentsRemaining -ne 0) {
$deploymentRatio = [Math]::Ceiling(100 * ($report.result.numberComponentsDeployed / $report.result.numberComponentsTotal))
$componentsRemaining = $report.result.numberComponentsTotal - $report.result.numberComponentsDeployed - $report.result.numberComponentsFailed
# If the percentage is not yet 100%, update it.
if($deploymentRatio -le 100) {
Write-Host -NoNewLine "`rComponents deployed: " $deploymentRatio "%"
}
# If the deployment has failed
if($report.result.status -eq "Failed") {
break
}
}
# Write next header.
if(($report.result.numberTestsTotal -ne 0) -and ($startedTests -eq $false)) {
$startedTests = $true
Write-Host -ForegroundColor green "`n`n:: Running tests ::"
}
# Write Test progress
if($report.result.numberTestsTotal -ne 0 -and $testsRemaining -ne 0) {
$testRatio = [Math]::Ceiling((100 * ($report.result.numberTestsCompleted / $report.result.numberTestsTotal)))
$testsRemaining = $report.result.numberTestsTotal - $report.result.numberTestErrors - $report.result.numberTestsCompleted
Write-Host -NoNewLine "`rTests passed: " $testRatio "% | Tests remaining: " $testsRemaining
}
if($testsRemaining -eq 0 -and $report.result.numberTestErrors -gt 0) {
Write-Host -ForegroundColor red "`nERROR: $($report.result.numberTestErrors) tests have failed"
exit
}
} while(($report.result.status -eq "InProgress") -or ($report.result.status -eq "Pending"))
# FAILED DEPLOYMENT ANALYSIS
if($report.result.status -eq "Failed") {
Write-Host -ForegroundColor red "`n`nERROR Deployment Failed!"
$report = sfdx force:mdapi:deploy:report -i $deployJobId --json --verbose 2>&1 | ConvertFrom-Json
foreach($failure in $report.result.details.componentFailures) {
Write-Host -ForegroundColor red "`t - " $failure.problem
}
exit
}
# SUCCESSFUL DEPLOYMENT MESSAGE
Write-Host -ForegroundColor green "`n`n:: Deployment Successful! ::"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment