207 lines
4.7 KiB
PowerShell
207 lines
4.7 KiB
PowerShell
$NGINX_CONFIG_PATH = "/etc/nginx/sites-available/blog.stevanfreeborn.com"
|
|
|
|
function StartContainer {
|
|
param (
|
|
[string]$containerColor,
|
|
[string]$dockerTag
|
|
)
|
|
|
|
$containerName = "blog.stevanfreeborn.com.$containerColor"
|
|
$postDirEnv = "FilePostServiceOptions__PostsDirectory=wwwroot/posts"
|
|
$containerId = docker run -d -p 8080 --name $containerName --env $postDirEnv $dockerTag
|
|
|
|
if ($LASTEXITCODE -ne 0)
|
|
{
|
|
Write-Host "Failed to run $containerName container."
|
|
exit 1;
|
|
}
|
|
|
|
$containerHostPort = $(docker port $containerId).Split(":")[1]
|
|
$running = $false
|
|
$attemptLimit = 12
|
|
$attempts = 0
|
|
$waitTimeInSeconds = 10
|
|
|
|
while ($running -eq $false -and $attempts -lt $attemptLimit)
|
|
{
|
|
$response = Invoke-WebRequest -Uri "http://localhost:$containerHostPort/rss" -UseBasicParsing
|
|
|
|
if ($response.StatusCode -eq 200)
|
|
{
|
|
$running = $true
|
|
}
|
|
else
|
|
{
|
|
Write-Host "Waiting for $containerName container to start..."
|
|
Start-Sleep -Seconds $waitTimeInSeconds
|
|
}
|
|
}
|
|
|
|
if ($running -eq $false)
|
|
{
|
|
Write-Host "Failed to start $containerName container."
|
|
exit 1
|
|
}
|
|
|
|
return $containerHostPort
|
|
}
|
|
|
|
function UpdateNginxConfig {
|
|
param (
|
|
[string]$filePath,
|
|
[string]$portNumber
|
|
)
|
|
|
|
$nginxConfig = Get-Content $filePath
|
|
$pattern = "proxy_pass http://localhost:\d+;"
|
|
$replacement = "proxy_pass http://localhost:$portNumber;"
|
|
|
|
$modifiedContent = @()
|
|
|
|
foreach ($line in $nginxConfig) {
|
|
if ($line -match $pattern) {
|
|
$line = $line -replace $pattern, $replacement
|
|
}
|
|
|
|
$modifiedContent += $line
|
|
}
|
|
|
|
Set-Content -Path $filePath -Value $modifiedContent
|
|
}
|
|
|
|
# Get the version number from the command line
|
|
$version = $args[0];
|
|
|
|
if ($null -eq $version)
|
|
{
|
|
Write-Host "Please provide a version number."
|
|
exit 1
|
|
}
|
|
|
|
# check if docker is installed
|
|
$dockerVersion = docker --version
|
|
|
|
if ($null -eq $dockerVersion)
|
|
{
|
|
Write-Host "Docker is not installed. Please install Docker and try again."
|
|
exit 1
|
|
}
|
|
|
|
if (-not (Test-Path $NGINX_CONFIG_PATH))
|
|
{
|
|
Write-Host "Nginx configuration file not found: $NGINX_CONFIG_PATH"
|
|
exit 1
|
|
}
|
|
|
|
# attempt to pull docker image
|
|
$dockerTag = "stevanfreeborn/blog.stevanfreeborn.com:$version"
|
|
docker pull $dockerTag
|
|
|
|
if ($LASTEXITCODE -ne 0)
|
|
{
|
|
Write-Host "Failed to pull docker image: $dockerTag"
|
|
exit 1
|
|
}
|
|
|
|
# Checkif green container is running
|
|
$greenContainerId = docker ps --filter "name=blog.stevanfreeborn.com.green" --format "{{.ID}}"
|
|
|
|
Write-Host "Green container ID: $greenContainerId"
|
|
|
|
if ($null -eq $greenContainerId)
|
|
{
|
|
Write-Host "Green container is not running. Starting green container."
|
|
|
|
$greenContainerHostPort = StartContainer -containerColor "green" -dockerTag $dockerTag
|
|
|
|
Write-Host "Green container is running."
|
|
|
|
UpdateNginxConfig -filePath $NGINX_CONFIG_PATH -portNumber $greenContainerHostPort
|
|
|
|
Write-Host "Nginx configuration updated to point to green container on port $greenContainerHostPort."
|
|
|
|
nginx -t
|
|
|
|
if ($LASTEXITCODE -ne 0)
|
|
{
|
|
Write-Host "Nginx configuration test failed. Reverting changes."
|
|
Set-Content -Path $filePath -Value $nginxConfig
|
|
exit 1
|
|
}
|
|
|
|
nginx -s reload
|
|
|
|
if ($LASTEXITCODE -ne 0)
|
|
{
|
|
Write-Host "Failed to reload Nginx."
|
|
exit 1
|
|
}
|
|
|
|
Write-Host "Nginx reloaded. Successfully deployed version $version."
|
|
exit 0
|
|
}
|
|
else
|
|
{
|
|
Write-Host "Green container is running. Starting blue container."
|
|
|
|
$blueContainerHostPort = StartContainer -containerColor "blue" -dockerTag $dockerTag
|
|
|
|
Write-Host "Blue container is running."
|
|
|
|
UpdateNginxConfig -filePath $NGINX_CONFIG_PATH -portNumber $blueContainerHostPort
|
|
|
|
Write-Host "Nginx configuration updated to point to blue container on port $blueContainerHostPort."
|
|
|
|
nginx -t
|
|
|
|
if ($LASTEXITCODE -ne 0)
|
|
{
|
|
Write-Host "Nginx configuration test failed. Reverting changes."
|
|
Set-Content -Path $filePath -Value $nginxConfig
|
|
exit 1
|
|
}
|
|
|
|
nginx -s reload
|
|
|
|
if ($LASTEXITCODE -ne 0)
|
|
{
|
|
Write-Host "Failed to reload Nginx."
|
|
exit 1
|
|
}
|
|
|
|
Write-Host "Nginx reloaded. Successfully deployed version $version."
|
|
|
|
Write-Host "Stopping and removing green container."
|
|
|
|
docker stop $greenContainerId
|
|
|
|
if ($LASTEXITCODE -ne 0)
|
|
{
|
|
Write-Host "Failed to stop green container."
|
|
exit 1
|
|
}
|
|
|
|
docker rm $greenContainerId
|
|
|
|
if ($LASTEXITCODE -ne 0)
|
|
{
|
|
Write-Host "Failed to remove green container."
|
|
exit 1
|
|
}
|
|
|
|
Write-Host "Green container stopped and removed."
|
|
|
|
Write-Host "Switching blue container to green container."
|
|
|
|
docker rename "blog.stevanfreeborn.com.blue" "blog.stevanfreeborn.com.green"
|
|
|
|
if ($LASTEXITCODE -ne 0)
|
|
{
|
|
Write-Host "Failed to rename blue container to green container."
|
|
exit 1
|
|
}
|
|
|
|
Write-Host "Successfully deployed version $version."
|
|
|
|
exit 0
|
|
} |