修复首次发布并压缩镜像传输包

This commit is contained in:
WuYongJie 2026-07-21 16:56:19 +08:00
parent 21ebef37c3
commit e4f7f2ae31
4 changed files with 46 additions and 8 deletions

View File

@ -8,6 +8,10 @@ runtime
.idea
.vscode
node_modules
.caiwu-build
public/js
public/css/app.css
public/mix-manifest.json
database/database.sqlite
storage/debugbar
storage/framework/cache/data/*

View File

@ -60,9 +60,9 @@ WORKDIR /var/www/html
COPY . /var/www/html
COPY --from=vendor /build/vendor /var/www/html/vendor
COPY .caiwu-build/public/js /var/www/html/public/js
COPY .caiwu-build/public/css/app.css /var/www/html/public/css/app.css
COPY .caiwu-build/public/mix-manifest.json /var/www/html/public/mix-manifest.json
COPY --from=frontend /js /var/www/html/public/js
COPY --from=frontend /css/app.css /var/www/html/public/css/app.css
COPY --from=frontend /mix-manifest.json /var/www/html/public/mix-manifest.json
COPY deploy/apache-vhost.conf /etc/apache2/sites-available/000-default.conf
COPY deploy/php.ini /usr/local/etc/php/conf.d/caiwu.ini
COPY deploy/entrypoint.sh /usr/local/bin/caiwu-entrypoint

View File

@ -80,7 +80,7 @@ git pull --ff-only
1. 检查分支和未提交改动;
2. 使用项目专用 Node 20 和本机 npm 缓存构建前端资源;
3. 使用提交 SHA 构建镜像并复用项目专属缓存;
4. 导出临时镜像包并上传;
4. 导出 gzip 临时镜像包并上传;
5. 服务器加载镜像并启动;
6. 检查真实 HTTP 页面;
7. 失败时恢复上一个镜像;

View File

@ -23,7 +23,8 @@ $keyFullPath = (Resolve-Path $KeyPath).Path
$sshTarget = "${SshUser}@${Server}"
$imageName = 'caiwu_akaunting'
$tempRoot = Join-Path ([IO.Path]::GetTempPath()) ("caiwu-deploy-" + [Guid]::NewGuid().ToString('N'))
$localArchive = Join-Path $tempRoot 'image.tar'
$localTar = Join-Path $tempRoot 'image.tar'
$localArchive = Join-Path $tempRoot 'image.tar.gz'
$remoteArchive = $null
$bootstrapRemote = $null
$buildkitConfig = Join-Path $repoRoot 'deploy/buildkitd.toml'
@ -64,6 +65,33 @@ function Remove-OldProjectImages {
}
}
function Compress-Gzip {
param(
[Parameter(Mandatory = $true)]
[string]$Source,
[Parameter(Mandatory = $true)]
[string]$Destination
)
$inputStream = $null
$outputStream = $null
$gzipStream = $null
try {
$inputStream = [IO.File]::OpenRead($Source)
$outputStream = [IO.File]::Create($Destination)
$gzipStream = [IO.Compression.GZipStream]::new(
$outputStream,
[IO.Compression.CompressionLevel]::Fastest
)
$inputStream.CopyTo($gzipStream)
}
finally {
if ($gzipStream) { $gzipStream.Dispose() }
if ($outputStream) { $outputStream.Dispose() }
if ($inputStream) { $inputStream.Dispose() }
}
}
Push-Location $repoRoot
try {
$branch = (git branch --show-current).Trim()
@ -79,7 +107,7 @@ try {
$deploySha = (git rev-parse HEAD).Trim()
$imageTag = $deploySha.Substring(0, 12)
$fullImage = "${imageName}:$imageTag"
$remoteArchive = "$RemotePath/image-$imageTag.tar"
$remoteArchive = "$RemotePath/image-$imageTag.tar.gz"
$buildDate = [DateTime]::UtcNow.ToString('yyyy-MM-ddTHH:mm:ssZ')
if (-not $AppUrl) {
@ -109,6 +137,7 @@ try {
--builder $BuilderName `
--load `
--tag $fullImage `
--build-context 'frontend=.caiwu-build/public' `
--build-arg "VCS_REF=$deploySha" `
--build-arg "BUILD_DATE=$buildDate" `
--label 'com.caiwu.project=CaiWuXiTong' `
@ -116,7 +145,8 @@ try {
.
} '本机镜像构建失败。服务器未发生任何变更。'
$previousSha = (& ssh -i $keyFullPath -o BatchMode=yes -o StrictHostKeyChecking=accept-new $sshTarget "cat '$RemotePath/.deployed-sha' 2>/dev/null || true").Trim()
$previousShaOutput = & ssh -i $keyFullPath -o BatchMode=yes -o StrictHostKeyChecking=accept-new $sshTarget "cat '$RemotePath/.deployed-sha' 2>/dev/null || true"
$previousSha = ([string]$previousShaOutput).Trim()
if ($LASTEXITCODE -ne 0) {
throw '无法连接服务器。'
}
@ -154,7 +184,11 @@ try {
ssh -i $keyFullPath -o BatchMode=yes $sshTarget "docker version >/dev/null && docker compose version >/dev/null && install -d -m 700 '$RemotePath'"
} '服务器 Docker 未就绪;首次发布请添加 -BootstrapServer。'
Invoke-Native { docker save --output $localArchive $fullImage } '导出镜像失败。'
Invoke-Native { docker save --output $localTar $fullImage } '导出镜像失败。'
Compress-Gzip -Source $localTar -Destination $localArchive
Remove-Item -LiteralPath $localTar -Force
$archiveSizeMB = [math]::Round((Get-Item -LiteralPath $localArchive).Length / 1MB, 1)
Write-Host "压缩传输包:$archiveSizeMB MiB"
Invoke-Native { scp -i $keyFullPath -o BatchMode=yes $localArchive "${sshTarget}:$remoteArchive" } '上传镜像失败。'
Invoke-Native { scp -i $keyFullPath -o BatchMode=yes compose.jiangling.yml deploy/activate-release.sh "${sshTarget}:$RemotePath/" } '上传运行配置失败。'