330 lines
13 KiB
PowerShell
330 lines
13 KiB
PowerShell
# 由壹点3D素材 - 构建机一键配置脚本
|
||
# 功能:安装 Docker Compose + Registry + UI
|
||
# 目标:192.168.40.206(构建机)
|
||
|
||
param(
|
||
[string]$BuildServerIP = '192.168.40.206',
|
||
[string]$BuildServerUser = 'root',
|
||
[string]$BuildServerPassword = $env:BUILD_SERVER_PASSWORD,
|
||
[switch]$SkipDockerCompose, # 跳过 Docker Compose 安装
|
||
[switch]$SkipRegistry, # 跳过 Registry 安装
|
||
[switch]$Help
|
||
)
|
||
|
||
# 设置编码
|
||
try {
|
||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||
$OutputEncoding = [System.Text.Encoding]::UTF8
|
||
chcp 65001 | Out-Null
|
||
} catch {}
|
||
|
||
# ==================== 辅助函数 ====================
|
||
|
||
function Write-Success {
|
||
param([string]$Message)
|
||
Write-Host "✅ $Message" -ForegroundColor Green
|
||
}
|
||
|
||
function Write-Error-Custom {
|
||
param([string]$Message)
|
||
Write-Host "❌ $Message" -ForegroundColor Red
|
||
}
|
||
|
||
function Write-Info {
|
||
param([string]$Message)
|
||
Write-Host "ℹ️ $Message" -ForegroundColor Cyan
|
||
}
|
||
|
||
function Write-Warning-Custom {
|
||
param([string]$Message)
|
||
Write-Host "⚠️ $Message" -ForegroundColor Yellow
|
||
}
|
||
|
||
function Write-Step {
|
||
param([int]$Step, [string]$Message)
|
||
Write-Host ""
|
||
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Cyan
|
||
Write-Host "📦 步骤 $Step`: $Message" -ForegroundColor Magenta
|
||
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Cyan
|
||
}
|
||
|
||
function Write-SubStep {
|
||
param([string]$Message)
|
||
Write-Host " ▶ $Message" -ForegroundColor Yellow
|
||
}
|
||
|
||
function Invoke-BuildServer {
|
||
param([string]$Command, [switch]$Silent)
|
||
|
||
$result = & "C:\Program Files\PuTTY\plink.exe" -batch -pw $BuildServerPassword "$BuildServerUser@$BuildServerIP" $Command 2>&1
|
||
|
||
if (-not $Silent) {
|
||
$result | ForEach-Object {
|
||
if ($_ -match "error|failed|fatal") {
|
||
Write-Host " $_" -ForegroundColor Red
|
||
} elseif ($_ -match "warning|warn") {
|
||
Write-Host " $_" -ForegroundColor Yellow
|
||
} elseif ($_ -match "success|complete|done|✓|Successfully") {
|
||
Write-Host " $_" -ForegroundColor Green
|
||
} else {
|
||
Write-Host " $_" -ForegroundColor Gray
|
||
}
|
||
}
|
||
}
|
||
|
||
return $result
|
||
}
|
||
|
||
function Show-Help {
|
||
Write-Host @"
|
||
由壹点3D素材 - 构建机一键配置脚本
|
||
|
||
用法:
|
||
.\setup-build-server.ps1 # 完整配置
|
||
.\setup-build-server.ps1 -SkipDockerCompose # 跳过 Docker Compose 安装
|
||
.\setup-build-server.ps1 -SkipRegistry # 跳过 Registry 安装
|
||
|
||
功能:
|
||
1. 安装 Docker Compose
|
||
2. 安装 Docker Registry(端口 5000)
|
||
3. 安装 Registry UI(端口 5001)
|
||
4. 验证安装
|
||
|
||
目标服务器:
|
||
IP:$BuildServerIP
|
||
用户:$BuildServerUser
|
||
|
||
注意:
|
||
- 此脚本只配置构建机,不会影响生产服务器
|
||
- 所有操作都是安全的,不会影响现有服务
|
||
"@
|
||
}
|
||
|
||
# ==================== 主逻辑 ====================
|
||
|
||
function Main {
|
||
Write-Host ""
|
||
Write-Host "╔════════════════════════════════════════════════════════════╗" -ForegroundColor Cyan
|
||
Write-Host "║ ║" -ForegroundColor Cyan
|
||
Write-Host "║ 由壹点3D素材 - 构建机一键配置 ║" -ForegroundColor Cyan
|
||
Write-Host "║ ║" -ForegroundColor Cyan
|
||
Write-Host "╚════════════════════════════════════════════════════════════╝" -ForegroundColor Cyan
|
||
Write-Host ""
|
||
|
||
if ($Help) { Show-Help; return }
|
||
if ([string]::IsNullOrWhiteSpace($BuildServerPassword)) {
|
||
throw '缺少构建机密码,请先设置 BUILD_SERVER_PASSWORD 环境变量'
|
||
}
|
||
|
||
Write-Host "📋 配置信息" -ForegroundColor Magenta
|
||
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Cyan
|
||
Write-Info "目标服务器:$BuildServerIP(构建机)"
|
||
Write-Info "用户:$BuildServerUser"
|
||
Write-Info "操作:安装 Docker Compose + Registry + UI"
|
||
Write-Host ""
|
||
|
||
Write-Warning-Custom "⚠️ 重要提示:"
|
||
Write-Info " - 此脚本只配置构建机($BuildServerIP)"
|
||
Write-Info " - 不会影响生产服务器(192.168.58.20)"
|
||
Write-Info " - 不会影响任何现有服务"
|
||
Write-Host ""
|
||
|
||
$confirm = Read-Host "确认开始配置?(y/n)"
|
||
if ($confirm -ne 'y') {
|
||
Write-Info "已取消配置"
|
||
return
|
||
}
|
||
|
||
# ==================== 步骤 0:检查连接 ====================
|
||
Write-Step 0 "检查构建机连接"
|
||
|
||
Write-SubStep "测试 SSH 连接..."
|
||
$testResult = Invoke-BuildServer -Command "echo 'OK'" -Silent
|
||
if ($testResult -notmatch "OK") {
|
||
Write-Error-Custom "无法连接构建机"
|
||
return
|
||
}
|
||
Write-Success "SSH 连接正常"
|
||
|
||
Write-SubStep "检查 Docker 版本..."
|
||
$dockerVersion = Invoke-BuildServer -Command "docker --version" -Silent
|
||
if ($dockerVersion -match "Docker version") {
|
||
Write-Success "Docker 已安装:$($dockerVersion -replace 'Docker version ', '')"
|
||
} else {
|
||
Write-Error-Custom "Docker 未安装,请先安装 Docker"
|
||
return
|
||
}
|
||
|
||
# ==================== 步骤 1:安装 Docker Compose ====================
|
||
if (-not $SkipDockerCompose) {
|
||
Write-Step 1 "安装 Docker Compose"
|
||
|
||
Write-SubStep "检查是否已安装..."
|
||
$composeCheck = Invoke-BuildServer -Command "docker-compose --version 2>&1" -Silent
|
||
|
||
if ($composeCheck -match "docker-compose version" -or $composeCheck -match "Docker Compose version") {
|
||
Write-Success "Docker Compose 已安装:$composeCheck"
|
||
} else {
|
||
Write-SubStep "开始下载 Docker Compose..."
|
||
Write-Info " 下载地址:GitHub(可能需要 1-2 分钟)"
|
||
|
||
$installCmd = @"
|
||
curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-`$(uname -s)-`$(uname -m)" -o /usr/local/bin/docker-compose && \
|
||
chmod +x /usr/local/bin/docker-compose && \
|
||
docker-compose --version
|
||
"@
|
||
|
||
$installResult = Invoke-BuildServer -Command $installCmd
|
||
|
||
if ($installResult -match "Docker Compose version") {
|
||
Write-Success "Docker Compose 安装成功"
|
||
} else {
|
||
Write-Error-Custom "Docker Compose 安装失败"
|
||
Write-Info "请检查网络连接或手动安装"
|
||
return
|
||
}
|
||
}
|
||
} else {
|
||
Write-Step 1 "跳过 Docker Compose 安装"
|
||
}
|
||
|
||
# ==================== 步骤 2:创建 Registry 配置 ====================
|
||
if (-not $SkipRegistry) {
|
||
Write-Step 2 "配置 Docker Registry"
|
||
|
||
Write-SubStep "创建 Registry 目录..."
|
||
Invoke-BuildServer -Command "mkdir -p /opt/docker-registry" -Silent | Out-Null
|
||
Write-Success "目录已创建:/opt/docker-registry"
|
||
|
||
Write-SubStep "创建 docker-compose.yml 配置文件..."
|
||
|
||
$composeYml = @"
|
||
version: '3.8'
|
||
|
||
services:
|
||
registry:
|
||
image: registry:2
|
||
container_name: docker-registry
|
||
restart: always
|
||
ports:
|
||
- "5000:5000"
|
||
environment:
|
||
REGISTRY_STORAGE_DELETE_ENABLED: "true"
|
||
volumes:
|
||
- ./data:/var/lib/registry
|
||
networks:
|
||
- registry-net
|
||
|
||
ui:
|
||
image: joxit/docker-registry-ui:latest
|
||
container_name: docker-registry-ui
|
||
restart: always
|
||
ports:
|
||
- "5001:80"
|
||
environment:
|
||
- SINGLE_REGISTRY=true
|
||
- REGISTRY_TITLE=由壹点3D素材 - 镜像仓库
|
||
- DELETE_IMAGES=true
|
||
- SHOW_CONTENT_DIGEST=true
|
||
- NGINX_PROXY_PASS_URL=http://registry:5000
|
||
- SHOW_CATALOG_NB_TAGS=true
|
||
- CATALOG_MIN_BRANCHES=1
|
||
- CATALOG_MAX_BRANCHES=1
|
||
- TAGLIST_PAGE_SIZE=100
|
||
- REGISTRY_SECURED=false
|
||
- CATALOG_ELEMENTS_LIMIT=1000
|
||
depends_on:
|
||
- registry
|
||
networks:
|
||
- registry-net
|
||
|
||
networks:
|
||
registry-net:
|
||
driver: bridge
|
||
"@
|
||
|
||
# 将配置写入远程服务器
|
||
$createConfigCmd = @"
|
||
cat > /opt/docker-registry/docker-compose.yml << 'EOFCONFIG'
|
||
$composeYml
|
||
EOFCONFIG
|
||
"@
|
||
|
||
Invoke-BuildServer -Command $createConfigCmd -Silent | Out-Null
|
||
Write-Success "配置文件已创建"
|
||
|
||
# ==================== 步骤 3:启动 Registry ====================
|
||
Write-Step 3 "启动 Docker Registry"
|
||
|
||
Write-SubStep "拉取镜像(可能需要 1-2 分钟)..."
|
||
Write-Info " 正在拉取 registry:2 和 joxit/docker-registry-ui:latest"
|
||
|
||
$startCmd = "cd /opt/docker-registry && docker-compose up -d"
|
||
$startResult = Invoke-BuildServer -Command $startCmd
|
||
|
||
Write-SubStep "等待服务启动..."
|
||
Start-Sleep -Seconds 5
|
||
|
||
Write-SubStep "检查服务状态..."
|
||
$statusResult = Invoke-BuildServer -Command "cd /opt/docker-registry && docker-compose ps"
|
||
|
||
if ($statusResult -match "docker-registry.*Up" -and $statusResult -match "docker-registry-ui.*Up") {
|
||
Write-Success "Registry 服务启动成功"
|
||
} else {
|
||
Write-Warning-Custom "服务可能未完全启动,请检查日志"
|
||
}
|
||
|
||
# ==================== 步骤 4:验证安装 ====================
|
||
Write-Step 4 "验证安装"
|
||
|
||
Write-SubStep "测试 Registry API..."
|
||
$apiTest = Invoke-BuildServer -Command "curl -s http://localhost:5000/v2/_catalog" -Silent
|
||
if ($apiTest -match "repositories") {
|
||
Write-Success "Registry API 正常:http://$BuildServerIP`:5000"
|
||
} else {
|
||
Write-Warning-Custom "Registry API 测试失败"
|
||
}
|
||
|
||
Write-SubStep "测试 Registry UI..."
|
||
$uiTest = Invoke-BuildServer -Command "curl -s http://localhost:5001 | head -5" -Silent
|
||
if ($uiTest -match "html" -or $uiTest -match "DOCTYPE") {
|
||
Write-Success "Registry UI 正常:http://$BuildServerIP`:5001"
|
||
} else {
|
||
Write-Warning-Custom "Registry UI 测试失败"
|
||
}
|
||
|
||
Write-SubStep "查看运行中的容器..."
|
||
Invoke-BuildServer -Command "docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' | grep registry"
|
||
|
||
} else {
|
||
Write-Step 2 "跳过 Registry 安装"
|
||
}
|
||
|
||
# ==================== 完成 ====================
|
||
Write-Host ""
|
||
Write-Host "╔════════════════════════════════════════════════════════════╗" -ForegroundColor Green
|
||
Write-Host "║ ║" -ForegroundColor Green
|
||
Write-Host "║ ✅ 配置完成! ║" -ForegroundColor Green
|
||
Write-Host "║ ║" -ForegroundColor Green
|
||
Write-Host "╚════════════════════════════════════════════════════════════╝" -ForegroundColor Green
|
||
Write-Host ""
|
||
Write-Host "📊 配置结果" -ForegroundColor Magenta
|
||
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Cyan
|
||
Write-Info "构建机:$BuildServerIP"
|
||
Write-Info "Registry API:http://$BuildServerIP`:5000"
|
||
Write-Info "Registry UI:http://$BuildServerIP`:5001"
|
||
Write-Host ""
|
||
Write-Host "🎯 下一步操作" -ForegroundColor Magenta
|
||
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -ForegroundColor Cyan
|
||
Write-Info "1. 在浏览器访问 Registry UI:http://$BuildServerIP`:5001"
|
||
Write-Info "2. 配置生产服务器(运行下面的命令):"
|
||
Write-Host " .\setup-production-server.ps1" -ForegroundColor Yellow
|
||
Write-Info "3. 测试 Git 增量部署:"
|
||
Write-Host " .\scripts\git-incremental-deploy.ps1 -DryRun" -ForegroundColor Yellow
|
||
Write-Host " .\scripts\git-incremental-deploy.ps1 -Target shadow" -ForegroundColor Yellow
|
||
Write-Host ""
|
||
}
|
||
|
||
# 执行
|
||
Main
|