RU EN
вчера

Automating ASP.NET Core 9.0 deployment with a PowerShell script

Automating ASP.NET Core 9.0 deployment with a PowerShell script
Автор:
Источник:
Просмотров:
72
Automating ASP.NET Core 9.0 deployment with a PowerShell script favorites 0

Deploying an ASP.NET Core 9.0 application manually can be a time-consuming and error-prone process. To streamline this, I’ve created a PowerShell script that automates the deployment of a .NET Core web application to an IIS server. This ensures minimal downtime while making the process efficient and repeatable.

Overview of the deployment script

This PowerShell script automates key deployment tasks:
→ Publishes the ASP.NET Core 9.0 application.
→ Puts the application into maintenance mode.
→ Stops the IIS Application Pool before deployment.
→ Replaces old files with the new version.
→ Restarts the Application Pool and removes maintenance mode.
→ Opens the application in a browser after deployment.

• • •

Step-by-Step breakdown of the script

1. Define paths and variables

The script starts by setting up key paths such as:
Project directory: The location of the source code.
Publish directory: Where the application will be published.
IIS deployment path: The live website directory.
Application Pool name: The name of the IIS app pool.

# Define variables
# Set base project directory (relative to script location)
$basePath = $PSScriptRoot
$projectPath = Join-Path $basePath ".\Presentation\HRMSuite.Web"
$publishPath = Join-Path $basePath ".\HRMSuite.Web.Publish"
$websitePath = "C:\inetpub\wwwroot\hrms"
$appPoolName = "hrms"
$appOfflineFile = "$websitePath\app_offline.htm"  # Path to the app_offline file

# Stop script execution on error
$ErrorActionPreference = "Stop"

2. Enable maintenance mode

Before deployment, we notify users about the update by creating an app_offline.htm file in the IIS directory.

# Create app_offline.htm to inform users of update (like in the batch script)
Write-Host "Creating app_offline.htm file..." -ForegroundColor Yellow
$offlineContent = "System Update in Progress, please refresh after 2-3 minutes..."
Set-Content -Path $appOfflineFile -Value $offlineContent

This ensures that users see a maintenance message instead of encountering errors during deployment.

3. Publish the application

The script then compiles and publishes the application in release mode to the specified folder.

# Publish the .NET application
dotnet publish "$projectPath" -c Release -o "$publishPath" --self-contained false --nologo --verbosity quiet /p:NoWarn="CS8618;CS8600"

Using --self-contained false reduces the package size by relying on an existing .NET runtime on the server.

4. Stop the IIS Application Pool

Before replacing old files, we ensure that the application is not running by stopping the IIS App Pool.

# Get the application pool state
$appPoolState = (Get-WebAppPoolState -Name $appPoolName).Value

# Stop the App Pool only if it's running
if ($appPoolState -eq "Started") {
    Write-Host "Stopping IIS Application Pool: $appPoolName" -ForegroundColor Yellow
    Stop-WebAppPool -Name $appPoolName
} else {
    Write-Host "Application Pool '$appPoolName' is already stopped." -ForegroundColor Cyan
}

5. Replace old files with new deployment

After stopping the application, the script deletes old files (excluding logs and app_offline.htm).

# Remove existing files in IIS folder (but skip app_offline.htm and logs folder)
Write-Host "Removing old deployment files..." -ForegroundColor Red
Get-ChildItem -Path $websitePath -Exclude "app_offline.htm", "logs" | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

Then, it copies the new published files to the IIS directory using Robocopy.

# Copy new published files
Write-Host "Copying new files to IIS directory..." -ForegroundColor Green
Robocopy $publishPath $websitePath /E /NFL /NDL /njh /njs /np /XO /XF .gitkeep

6. Restart the Application Pool

Once the new files are in place, the IIS App Pool is restarted.

# Start IIS Application Pool
Write-Host "Starting IIS Application Pool: $appPoolName" -ForegroundColor Yellow
Start-WebAppPool -Name $appPoolName

7. Remove maintenance mode

After deployment, app_offline.htm is removed so that the site can go live.

# Remove app_offline.htm after successful deployment
# Check if app_offline.htm exists before removing
if (Test-Path -Path $appOfflineFile) {
    Write-Host "Removing app_offline.htm after deployment..." -ForegroundColor Yellow
    Remove-Item -Path $appOfflineFile -Force
} else {
    Write-Host "app_offline.htm file not found, skipping removal." -ForegroundColor Cyan
}

8. Open the website

Finally, the script automatically opens the application in a web browser.

# Open the website immediately after deployment
$websiteUrl = "http://localhost"
Write-Host "Opening the website: $websiteUrl" -ForegroundColor Green
Start-Process $websiteUrl

• • •

PowerShell deployment script

Below is a PowerShell script that automates the deployment process:

# Define variables
# Set base project directory (relative to script location)
$basePath = $PSScriptRoot
$projectPath = Join-Path $basePath ".\Presentation\HRMSuite.Web"
$publishPath = Join-Path $basePath ".\HRMSuite.Web.Publish"
$websitePath = "C:\inetpub\wwwroot\hrms"
$appPoolName = "hrms"
$appOfflineFile = "$websitePath\app_offline.htm"  # Path to the app_offline file

# Stop script execution on error
$ErrorActionPreference = "Stop"

Write-Host "Publishing ASP.NET Core 9.0 Application..." -ForegroundColor Cyan

# Create app_offline.htm to inform users of update (like in the batch script)
Write-Host "Creating app_offline.htm file..." -ForegroundColor Yellow
$offlineContent = "System Update in Progress, please refresh after 2-3 minutes..."
Set-Content -Path $appOfflineFile -Value $offlineContent

# Publish the .NET application
dotnet publish "$projectPath" -c Release -o "$publishPath" --self-contained false --nologo --verbosity quiet /p:NoWarn="CS8618;CS8600"

# Get the application pool state
$appPoolState = (Get-WebAppPoolState -Name $appPoolName).Value

# Stop the App Pool only if it's running
if ($appPoolState -eq "Started") {
    Write-Host "Stopping IIS Application Pool: $appPoolName" -ForegroundColor Yellow
    Stop-WebAppPool -Name $appPoolName
} else {
    Write-Host "Application Pool '$appPoolName' is already stopped." -ForegroundColor Cyan
}

# Remove existing files in IIS folder (but skip app_offline.htm and logs folder)
Write-Host "Removing old deployment files..." -ForegroundColor Red
Get-ChildItem -Path $websitePath -Exclude "app_offline.htm", "logs" | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

# Copy new published files
Write-Host "Copying new files to IIS directory..." -ForegroundColor Green
Robocopy $publishPath $websitePath /E /NFL /NDL /njh /njs /np /XO /XF .gitkeep

# Start IIS Application Pool
Write-Host "Starting IIS Application Pool: $appPoolName" -ForegroundColor Yellow
Start-WebAppPool -Name $appPoolName

# Remove app_offline.htm after successful deployment
# Check if app_offline.htm exists before removing
if (Test-Path -Path $appOfflineFile) {
    Write-Host "Removing app_offline.htm after deployment..." -ForegroundColor Yellow
    Remove-Item -Path $appOfflineFile -Force
} else {
    Write-Host "app_offline.htm file not found, skipping removal." -ForegroundColor Cyan
}

# Open the website immediately after deployment
$websiteUrl = "http://localhost"
Write-Host "Opening the website: $websiteUrl" -ForegroundColor Green
Start-Process $websiteUrl

Write-Host "Deployment Completed Successfully!" -ForegroundColor Green

• • •

Conclusion

Automating deployment with PowerShell makes the process smooth, predictable, and efficient. This script can be further enhanced with logging and rollback mechanisms. If you’re working with ASP.NET Core and IIS, this deployment script can significantly simplify your workflow.

Happy coding & deploying!

Похожее
Mar 22, 2024
Author: Andriy Kravets
For individuals who work closely with application development, terms like React and ASP.NET Core are not foreign. The most popular uses of these two technologies are in application and software development. Like any other technology, these aren’t flawless, though. The...
Jun 8, 2023
Author: Behdad Kardgar
This is my first article about gRPC on ASP.NET 6. In this article, I will give a short introduction to what gRPC is and the different types of communication in gRPC. In the end, I will share a simple console...
Jun 24, 2024
Author: Andrii Kozhyn
As a developer working on your current project, can you answer the following question: can your system at current state handle a new client with x1000 client compared to your existing user base? Will you know that running in production...
Jul 8, 2024
In this article, let’s learn about how to perform file upload in ASP.NET Core 6. The file for upload can be of any format like image (jpg, BMP, gif, etc), text file, XML file, CSV file, PDF file, etc. We...
Написать сообщение
Тип
Почта
Имя
*Сообщение
RSS
Если вам понравился этот сайт и вы хотите меня поддержать, вы можете
Замыкания в JavaScript для начинающих
Зачем нужен MediatR?
Soft skills: 18 самых важных навыков, которыми должен владеть каждый работник
ИИ не оправдал надежд? Бизнес массово отказывается от новых технологий
Топ 20 ботов которые постоянно сканируют ваши сайты. Не все из них одинаково полезны
Вайб-кодинг: программисты нашли способ зарабатывать, ничего не делая?
Погружение в 0.0.0.0 Day: как «нулевой» IP-адрес позволяет взломать локальную сеть
Задача по языку C#: Игра «Крестики Нолики» в консоли
Вопросы с собеседований, которые означают не то, что вы думаете
Система визуализации и мониторинга. Grafana + Prometheus
Boosty
Donate to support the project
GitHub account
GitHub profile