mirror of
https://git.fightbot.fun/hxuanyu/BingPaper.git
synced 2026-02-15 08:49:33 +08:00
前后端构建逻辑优化:新增Node.js支持,完善Dockerfile,更新构建与验证流程
This commit is contained in:
22
.dockerignore
Normal file
22
.dockerignore
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
.git
|
||||||
|
.github
|
||||||
|
node_modules
|
||||||
|
**/node_modules
|
||||||
|
data
|
||||||
|
output
|
||||||
|
scripts
|
||||||
|
docs
|
||||||
|
*.md
|
||||||
|
docker-compose.yml
|
||||||
|
Dockerfile
|
||||||
|
.dockerignore
|
||||||
|
webapp/.vscode
|
||||||
|
webapp/doc
|
||||||
|
webapp/.env*
|
||||||
|
!webapp/.env.production
|
||||||
|
web
|
||||||
|
webapp/dist
|
||||||
|
webapp/node_modules
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
*.log
|
||||||
7
.github/workflows/release.yml
vendored
7
.github/workflows/release.yml
vendored
@@ -20,6 +20,13 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
go-version: '1.25.5'
|
go-version: '1.25.5'
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: 'npm'
|
||||||
|
cache-dependency-path: webapp/package-lock.json
|
||||||
|
|
||||||
- name: Build and Package
|
- name: Build and Package
|
||||||
run: |
|
run: |
|
||||||
chmod +x scripts/build.sh
|
chmod +x scripts/build.sh
|
||||||
|
|||||||
13
.github/workflows/verify.yml
vendored
13
.github/workflows/verify.yml
vendored
@@ -17,6 +17,19 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
go-version: '1.25.5'
|
go-version: '1.25.5'
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: 'npm'
|
||||||
|
cache-dependency-path: webapp/package-lock.json
|
||||||
|
|
||||||
|
- name: Build Frontend
|
||||||
|
run: |
|
||||||
|
cd webapp
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: go mod download
|
run: go mod download
|
||||||
|
|
||||||
|
|||||||
42
Dockerfile
42
Dockerfile
@@ -1,19 +1,45 @@
|
|||||||
FROM golang:1.25.5-alpine AS builder
|
# Stage 1: Build Frontend
|
||||||
|
FROM --platform=$BUILDPLATFORM node:20-alpine AS node-builder
|
||||||
|
WORKDIR /webapp
|
||||||
|
# 复制 package.json 和 lock 文件以利用 layer 缓存
|
||||||
|
COPY webapp/package*.json ./
|
||||||
|
# 使用 npm ci 以获得更快且可重现的构建(如果存在 package-lock.json)
|
||||||
|
RUN if [ -f package-lock.json ]; then npm ci; else npm install; fi
|
||||||
|
# 复制其余源码并构建
|
||||||
|
COPY webapp/ .
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
# Stage 2: Build Backend
|
||||||
|
FROM --platform=$BUILDPLATFORM golang:1.25.5-alpine AS builder
|
||||||
|
# 安装 Git 以支持某些 Go 模块依赖
|
||||||
|
RUN apk add --no-cache git
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
# 复制 go.mod 和 go.sum 以利用 layer 缓存
|
||||||
COPY go.mod go.sum ./
|
COPY go.mod go.sum ./
|
||||||
RUN go mod download
|
RUN go mod download
|
||||||
|
# 复制源码
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN CGO_ENABLED=0 go build -o BingPaper .
|
# 从 node-builder 复制构建好的 web 目录,用于 go embed
|
||||||
|
COPY --from=node-builder /web ./web
|
||||||
FROM alpine:latest
|
# 编译二进制,针对目标平台
|
||||||
|
ARG TARGETOS
|
||||||
|
ARG TARGETARCH
|
||||||
|
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags="-s -w" -o BingPaper .
|
||||||
|
|
||||||
|
# Stage 3: Final Image
|
||||||
|
FROM alpine:3.21
|
||||||
|
# 安装运行时必需的证书和时区数据
|
||||||
|
RUN apk add --no-cache ca-certificates tzdata
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
# 创建必要目录
|
||||||
|
RUN mkdir -p data static
|
||||||
|
# 从构建阶段复制二进制文件
|
||||||
COPY --from=builder /app/BingPaper .
|
COPY --from=builder /app/BingPaper .
|
||||||
RUN mkdir -p data
|
# 复制静态资源(如果有些资源没有被 embed)
|
||||||
COPY --from=builder /app/config.example.yaml ./data/config.yaml
|
COPY --from=builder /app/static ./static
|
||||||
COPY --from=builder /app/web ./web
|
# 复制默认配置
|
||||||
|
COPY config.example.yaml ./data/config.yaml
|
||||||
|
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
VOLUME ["/app/data"]
|
||||||
ENTRYPOINT ["./BingPaper"]
|
ENTRYPOINT ["./BingPaper"]
|
||||||
|
|||||||
@@ -1,9 +1,22 @@
|
|||||||
@echo off
|
@echo off
|
||||||
setlocal enabledelayedexpansion
|
setlocal enabledelayedexpansion
|
||||||
|
|
||||||
|
:: 切换到项目根目录
|
||||||
|
cd /d %~dp0..
|
||||||
|
|
||||||
set APP_NAME=BingPaper
|
set APP_NAME=BingPaper
|
||||||
set OUTPUT_DIR=output
|
set OUTPUT_DIR=output
|
||||||
|
|
||||||
|
echo 开始构建前端...
|
||||||
|
cd webapp
|
||||||
|
call npm install
|
||||||
|
call npm run build
|
||||||
|
if %errorlevel% neq 0 (
|
||||||
|
echo 前端构建失败
|
||||||
|
exit /b %errorlevel%
|
||||||
|
)
|
||||||
|
cd ..
|
||||||
|
|
||||||
echo 开始构建 %APP_NAME% 多平台二进制文件...
|
echo 开始构建 %APP_NAME% 多平台二进制文件...
|
||||||
|
|
||||||
if exist %OUTPUT_DIR% rd /s /q %OUTPUT_DIR%
|
if exist %OUTPUT_DIR% rd /s /q %OUTPUT_DIR%
|
||||||
@@ -25,7 +38,10 @@ for %%p in (%PLATFORMS%) do (
|
|||||||
set PACKAGE_DIR=%OUTPUT_DIR%\!OUTPUT_NAME!
|
set PACKAGE_DIR=%OUTPUT_DIR%\!OUTPUT_NAME!
|
||||||
if not exist !PACKAGE_DIR! mkdir !PACKAGE_DIR!
|
if not exist !PACKAGE_DIR! mkdir !PACKAGE_DIR!
|
||||||
|
|
||||||
env GOOS=%%a GOARCH=%%b CGO_ENABLED=0 go build -o !PACKAGE_DIR!\!BINARY_NAME! main.go
|
set GOOS=%%a
|
||||||
|
set GOARCH=%%b
|
||||||
|
set CGO_ENABLED=0
|
||||||
|
go build -ldflags="-s -w" -o !PACKAGE_DIR!\!BINARY_NAME! main.go
|
||||||
|
|
||||||
if !errorlevel! equ 0 (
|
if !errorlevel! equ 0 (
|
||||||
echo %%a/%%b 编译成功
|
echo %%a/%%b 编译成功
|
||||||
|
|||||||
@@ -1,6 +1,21 @@
|
|||||||
|
# 切换到项目根目录
|
||||||
|
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
||||||
|
if ($ScriptDir) { Set-Location (Join-Path $ScriptDir "..") }
|
||||||
|
|
||||||
$AppName = "BingPaper"
|
$AppName = "BingPaper"
|
||||||
$OutputDir = "output"
|
$OutputDir = "output"
|
||||||
|
|
||||||
|
Write-Host "开始构建前端..."
|
||||||
|
Push-Location webapp
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-Host "前端构建失败" -ForegroundColor Red
|
||||||
|
Pop-Location
|
||||||
|
exit $LASTEXITCODE
|
||||||
|
}
|
||||||
|
Pop-Location
|
||||||
|
|
||||||
Write-Host "开始构建 $AppName 多平台二进制文件..."
|
Write-Host "开始构建 $AppName 多平台二进制文件..."
|
||||||
|
|
||||||
if (Test-Path $OutputDir) {
|
if (Test-Path $OutputDir) {
|
||||||
@@ -38,7 +53,7 @@ foreach ($Platform in $Platforms) {
|
|||||||
$env:GOOS = $OS
|
$env:GOOS = $OS
|
||||||
$env:GOARCH = $Arch
|
$env:GOARCH = $Arch
|
||||||
$env:CGO_ENABLED = "0"
|
$env:CGO_ENABLED = "0"
|
||||||
go build -o (Join-Path $PackageDir $BinaryName) main.go
|
go build -ldflags="-s -w" -o (Join-Path $PackageDir $BinaryName) main.go
|
||||||
|
|
||||||
if ($LASTEXITCODE -eq 0) {
|
if ($LASTEXITCODE -eq 0) {
|
||||||
Write-Host " $OS/$Arch 编译成功"
|
Write-Host " $OS/$Arch 编译成功"
|
||||||
|
|||||||
@@ -20,6 +20,12 @@ PLATFORMS=(
|
|||||||
# 需要包含的额外文件/目录
|
# 需要包含的额外文件/目录
|
||||||
EXTRA_FILES=("web" "config.example.yaml" "README.md")
|
EXTRA_FILES=("web" "config.example.yaml" "README.md")
|
||||||
|
|
||||||
|
echo "开始构建前端..."
|
||||||
|
cd webapp
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
cd ..
|
||||||
|
|
||||||
echo "开始构建 $APP_NAME 多平台二进制文件..."
|
echo "开始构建 $APP_NAME 多平台二进制文件..."
|
||||||
|
|
||||||
# 清理 output 目录
|
# 清理 output 目录
|
||||||
@@ -51,7 +57,8 @@ for PLATFORM in "${PLATFORMS[@]}"; do
|
|||||||
mkdir -p "$PACKAGE_DIR"
|
mkdir -p "$PACKAGE_DIR"
|
||||||
|
|
||||||
# 现在已移除 CGO 依赖,使用 CGO_ENABLED=0 以支持轻松的跨平台编译
|
# 现在已移除 CGO 依赖,使用 CGO_ENABLED=0 以支持轻松的跨平台编译
|
||||||
GOOS=$OS GOARCH=$ARCH CGO_ENABLED=0 go build -o "${PACKAGE_DIR}/${BINARY_NAME}" main.go
|
# 增加 -ldflags="-s -w" 以减少二进制体积
|
||||||
|
GOOS=$OS GOARCH=$ARCH CGO_ENABLED=0 go build -ldflags="-s -w" -o "${PACKAGE_DIR}/${BINARY_NAME}" main.go
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
echo " ${OS}/${ARCH} 编译成功"
|
echo " ${OS}/${ARCH} 编译成功"
|
||||||
|
|||||||
@@ -344,19 +344,19 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="flex gap-4">
|
<div class="flex gap-4">
|
||||||
<code class="text-yellow-400 min-w-32">copyrightlink</code>
|
<code class="text-yellow-400 min-w-32">copyrightlink</code>
|
||||||
<span class="text-white/60">版权详情链接(指向 Bing 搜索页面)⭐ 新增</span>
|
<span class="text-white/60">版权详情链接(指向 Bing 搜索页面)</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-4">
|
<div class="flex gap-4">
|
||||||
<code class="text-yellow-400 min-w-32">startdate</code>
|
<code class="text-yellow-400 min-w-32">startdate</code>
|
||||||
<span class="text-white/60">发布开始日期(格式:YYYYMMDD)⭐ 新增</span>
|
<span class="text-white/60">发布开始日期(格式:YYYYMMDD)</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-4">
|
<div class="flex gap-4">
|
||||||
<code class="text-yellow-400 min-w-32">fullstartdate</code>
|
<code class="text-yellow-400 min-w-32">fullstartdate</code>
|
||||||
<span class="text-white/60">完整发布时间(格式:YYYYMMDDHHMM)⭐ 新增</span>
|
<span class="text-white/60">完整发布时间(格式:YYYYMMDDHHMM)</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-4">
|
<div class="flex gap-4">
|
||||||
<code class="text-yellow-400 min-w-32">hsh</code>
|
<code class="text-yellow-400 min-w-32">hsh</code>
|
||||||
<span class="text-white/60">图片唯一哈希值 ⭐ 新增</span>
|
<span class="text-white/60">图片唯一哈希值 </span>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex gap-4">
|
<div class="flex gap-4">
|
||||||
<code class="text-yellow-400 min-w-32">quiz</code>
|
<code class="text-yellow-400 min-w-32">quiz</code>
|
||||||
|
|||||||
Reference in New Issue
Block a user