mirror of
https://github.com/acedanger/finance.git
synced 2025-12-05 22:50:12 -08:00
feat: add PowerShell build script for Windows users (#29)
- Add build-and-push.ps1 script for Windows users - Update ENVIRONMENT_SETUP.md with cross-platform build instructions - Improve error handling and feedback in build scripts - Add proper Windows path handling Part of #29
This commit is contained in:
115
.devcontainer/build-and-push.ps1
Normal file
115
.devcontainer/build-and-push.ps1
Normal file
@@ -0,0 +1,115 @@
|
||||
# Requires -Version 5.0
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
[string]$GitHubUsername
|
||||
)
|
||||
|
||||
# Stop on first error
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
# Configuration
|
||||
$ImageName = "finance-devcontainer"
|
||||
$ImageTag = "latest"
|
||||
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||
$DockerfilePath = Join-Path $ScriptDir "Dockerfile"
|
||||
$EnvFile = Join-Path $ScriptDir ".env"
|
||||
$FullImageName = "ghcr.io/$GitHubUsername/$ImageName`:$ImageTag"
|
||||
|
||||
# Function to check required tools
|
||||
function Test-RequiredTools {
|
||||
$tools = @("docker", "gh")
|
||||
foreach ($tool in $tools) {
|
||||
if (-not (Get-Command $tool -ErrorAction SilentlyContinue)) {
|
||||
Write-Error "Error: $tool is required but not installed"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Function to load environment variables from .env file
|
||||
function Get-EnvContent {
|
||||
if (Test-Path $EnvFile) {
|
||||
Write-Host "Loading environment from $EnvFile"
|
||||
$envContent = Get-Content $EnvFile
|
||||
foreach ($line in $envContent) {
|
||||
if ($line -match '^GITHUB_PERSONAL_ACCESS_TOKEN=(.*)$') {
|
||||
return $matches[1]
|
||||
}
|
||||
}
|
||||
}
|
||||
Write-Error "Error: GITHUB_PERSONAL_ACCESS_TOKEN not found in $EnvFile"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Verify prerequisites
|
||||
Write-Host "=== Building Development Container ==="
|
||||
Write-Host "Username: $GitHubUsername"
|
||||
Write-Host "Image: $FullImageName"
|
||||
Write-Host "Dockerfile: $DockerfilePath"
|
||||
|
||||
# Check required tools
|
||||
Test-RequiredTools
|
||||
|
||||
# Check GitHub authentication
|
||||
try {
|
||||
gh auth status
|
||||
} catch {
|
||||
Write-Error "Error: Not authenticated with GitHub. Please run 'gh auth login' first"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Get GitHub PAT from .env file
|
||||
$GitHubPAT = Get-EnvContent
|
||||
|
||||
if ([string]::IsNullOrEmpty($GitHubPAT)) {
|
||||
Write-Error "Error: GITHUB_PERSONAL_ACCESS_TOKEN is empty"
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host "Using PAT: $($GitHubPAT.Substring(0, 4))... (first 4 chars)"
|
||||
|
||||
# Build the image
|
||||
Write-Host "`n=> Building image..."
|
||||
try {
|
||||
docker build -t $FullImageName -f $DockerfilePath $ScriptDir
|
||||
} catch {
|
||||
Write-Error "Error: Docker build failed"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Log in to GitHub Container Registry
|
||||
Write-Host "`n=> Logging into GitHub Container Registry..."
|
||||
$GitHubPAT | docker login ghcr.io -u $GitHubUsername --password-stdin
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Error: Failed to authenticate with GitHub Container Registry"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Push to GitHub Container Registry
|
||||
Write-Host "`n=> Pushing image to GitHub Container Registry..."
|
||||
docker push $FullImageName
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error @"
|
||||
Error: Failed to push image
|
||||
Please check your GitHub PAT has the required permissions:
|
||||
- read:packages
|
||||
- write:packages
|
||||
"@
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host "`n=== Success! ==="
|
||||
Write-Host "The development container image has been built and pushed"
|
||||
Write-Host "`nTo use this image, update your devcontainer.json with:"
|
||||
Write-Host @"
|
||||
{
|
||||
"image": "$FullImageName"
|
||||
}
|
||||
"@
|
||||
|
||||
Write-Host "`nNext steps:"
|
||||
Write-Host "1. Update .devcontainer/devcontainer.json with the image reference above"
|
||||
Write-Host "2. Rebuild your development container in VS Code"
|
||||
Write-Host " (Command Palette -> 'Dev Containers: Rebuild Container')"
|
||||
Reference in New Issue
Block a user