Last active
December 7, 2022 17:08
-
-
Save manzanit0/3908ad6ba3136fcde328a4eccdd5613f to your computer and use it in GitHub Desktop.
PowerShell Script to deploy repository to Salesforce. It uses SFDX CLI.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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