Files
afilmory/.specstory/history/2025-06-26_17-14-更新流程和-git-上传配置.md
Innei 6d430faa9a feat: implement remote repository support for manifest updates
- Added functionality to push updated manifests to a remote Git repository after building.
- Introduced a Git token configuration in the builder settings to authenticate pushes.
- Enhanced the CLI to handle remote repository synchronization, including cloning and pulling updates.
- Updated the builder to return detailed results on whether updates occurred during the build process.
- Revised documentation to reflect new configuration options and usage instructions.

Signed-off-by: Innei <tukon479@gmail.com>
2025-06-28 13:34:35 +08:00

25 KiB
Raw Blame History

更新流程和 git 上传配置 (2025-06-27 01:14:44)

User

这里需要 pull或者 clone 之后,再跑一下增量更新的流程,如果有更新,还需要吧更新之后生成的 manifest 的上传到 git 仓库。 上传到 git 仓库需要提供 api token如果没有就跳过。 记得增加 logger 输出


Assistant

我需要查看一下相关的配置文件和构建器代码,了解当前的结构,然后修改这段代码来实现你要求的功能。


Searched codebase "builderConfig repo" • **24** results
File Lines
builder.config.example.json L1-6
builder.config.ts L71-113
packages/builder/src/storage/interfaces.ts L59-69
packages/builder/src/builder/builder.ts L42-64
builder.config.ts L128-130
builder.config.ts L1-71
builder.config.ts L113-128
scripts/preinstall.sh L1-3
packages/builder/src/storage/interfaces.ts L69-70
builder.config.ts L130-136
packages/builder/src/storage/interfaces.ts L46-59
README.md L219-311
packages/builder/src/builder/builder.ts L362-369
packages/builder/tsconfig.json L1-43
packages/builder/src/builder/builder.ts L27-42
apps/web/tsconfig.json L1-48
packages/builder/src/index.ts L1-2
packages/builder/src/index.ts L2-3
packages/builder/src/builder/builder.ts L1-27
packages/builder/src/storage/factory.ts L1-21
packages/builder/src/builder/index.ts L1-2
README.md L123-219
packages/builder/src/builder/index.ts L1-1
packages/builder/README.md L1-58

Searched codebase "defaultBuilder buildManifest" • **25** results
File Lines
packages/data/package.json L1-13
packages/builder/src/builder/builder.ts L281-292
packages/builder/src/builder/builder.ts L69-78
packages/builder/src/index.ts L34-42
README.md L219-311
packages/builder/src/builder/builder.ts L1-27
packages/builder/src/builder/builder.ts L228-281
packages/builder/src/builder/builder.ts L78-137
README.md L123-219
packages/builder/src/cli.ts L145-179
packages/builder/src/builder/builder.ts L329-355
scripts/photo-loader.ts L1-35
packages/builder/src/manifest/manager.ts L1-30
packages/builder/src/manifest/manager.ts L44-67
packages/builder/src/types/manifest.ts L1-6
packages/builder/src/builder/builder.ts L137-167
apps/web/src/global.d.ts L1-42
packages/builder/src/manifest/manager.ts L30-44
README.zh.md L219-323
builder.config.ts L113-128
README.zh.md L125-219
packages/builder/src/cli.ts L63-104
packages/builder/README.md L1-58
builder.config.ts L71-113
apps/web/plugins/vite/feed-sitemap.ts L1-55

Searched codebase "builder.config" • **2** results
File
undefined
undefined

现在让我查看一下构建器的更多细节,特别是如何检测更新和当前的 git 操作支持:


Read file: builder.config.ts


Searched codebase "git push commit upload manifest" • **23** results
File Lines
scripts/build-update-remote-repo.sh L1-14
packages/builder/src/manifest/manager.ts L44-67
packages/builder/src/index.ts L34-42
packages/builder/src/manifest/manager.ts L30-44
packages/builder/src/manifest/manager.ts L1-30
packages/builder/src/builder/builder.ts L228-281
apps/web/scripts/pull-remote.ts L1-49
.git/refs/remotes/origin/main L1-2
README.md L219-311
apps/web/plugins/vite/manifest-inject.ts L1-50
package.json L1-61
README.md L123-219
packages/builder/src/runAsWorker.ts L20-26
packages/builder/src/builder/builder.ts L69-78
packages/builder/src/builder/builder.ts L78-137
packages/builder/src/builder/builder.ts L281-292
packages/builder/src/runAsWorker.ts L174-237
packages/data/package.json L1-13
apps/web/plugins/vite/__internal__/constants.ts L1-7
apps/web/vite.config.ts L36-103
.git/refs/heads/main L1-2
packages/builder/src/types/manifest.ts L1-6
apps/web/src/pages/(data)/manifest.tsx L187-226

现在我需要查看 env.ts 文件以了解可能的环境变量配置:


Read file: env.ts


现在我基本了解了当前的结构。我需要修改以下几个文件:

  1. 修改 builder.config.ts 中的 BuilderConfig 接口,添加 git token 配置
  2. 修改 env.ts 添加 git token 环境变量
  3. 修改 packages/builder/src/cli.ts 中的逻辑,在 pull/clone 后运行增量更新,并在有更新时上传到 git 仓库
  4. 创建一个 git 操作的工具函数

让我开始实现:


  
      PG_CONNECTION_STRING: z.string().min(1).optional(),
+     
+     // Git token for uploading updated manifest to remote repository
+     GIT_TOKEN: z.string().optional(),
    },
    runtimeEnv: process.env,

      enable: boolean
      url: string
+     // Git token for pushing updates back to the repository
+     token?: string
    }
    // 存储配置

      enable: false,
      url: '',
+     token: env.GIT_TOKEN,
    },
  

现在我需要创建一个 git 操作的工具函数:


  import { workdir } from './path.js'
  import { runAsWorker } from './runAsWorker.js'
+ 
+ /**
+  * 推送更新后的 manifest 到远程仓库
+  */
+ async function pushManifestToRemoteRepo(): Promise<boolean> {
+   if (!builderConfig.repo.enable || !builderConfig.repo.token) {
+     if (!builderConfig.repo.enable) {
+       logger.main.info('🔧 远程仓库未启用,跳过推送')
+     } else {
+       logger.main.warn('⚠️ 未提供 Git Token跳过推送到远程仓库')
+     }
+     return false
+   }
+ 
+   try {
+     const assetsGitDir = path.resolve(workdir, 'assets-git')
+     
+     if (!existsSync(assetsGitDir)) {
+       logger.main.error('❌ assets-git 目录不存在,无法推送')
+       return false
+     }
+ 
+     logger.main.info('📤 开始推送更新到远程仓库...')
+ 
+     // 检查是否有变更
+     const status = await $({
+       cwd: assetsGitDir,
+       stdio: 'pipe',
+     })`git status --porcelain`
+ 
+     if (!status.stdout.trim()) {
+       logger.main.info('💡 没有变更需要推送')
+       return false
+     }
+ 
+     logger.main.info('📋 检测到以下变更:')
+     logger.main.info(status.stdout)
+ 
+     // 配置 git 凭据
+     const repoUrl = builderConfig.repo.url
+     const token = builderConfig.repo.token
+     
+     // 解析仓库 URL添加 token
+     let authenticatedUrl = repoUrl
+     if (repoUrl.startsWith('https://github.com/')) {
+       const urlWithoutProtocol = repoUrl.replace('https://', '')
+       authenticatedUrl = `https://${token}@${urlWithoutProtocol}`
+     }
+ 
+     // 设置远程仓库 URL包含 token
+     await $({
+       cwd: assetsGitDir,
+       stdio: 'pipe',
+     })`git remote set-url origin ${authenticatedUrl}`
+ 
+     // 添加所有变更
+     await $({
+       cwd: assetsGitDir,
+       stdio: 'inherit',
+     })`git add .`
+ 
+     // 提交变更
+     const commitMessage = `chore: update photos-manifest.json and thumbnails - ${new Date().toISOString()}`
+     await $({
+       cwd: assetsGitDir,
+       stdio: 'inherit',
+     })`git commit -m ${commitMessage}`
+ 
+     // 推送到远程仓库
+     await $({
+       cwd: assetsGitDir,
+       stdio: 'inherit',
+     })`git push origin HEAD`
+ 
+     logger.main.success('✅ 成功推送更新到远程仓库')
+     return true
+ 
+   } catch (error) {
+     logger.main.error('❌ 推送到远程仓库失败:', error)
+     return false
+   }
+ }
  
  async function main() {

现在我需要修改 main 函数的逻辑,在 pull/clone 远程仓库后运行增量更新,然后推送更新:



现在我需要在构建完成后调用推送函数:



现在我需要修改 builder 构建器,让它返回是否有更新的信息。首先查看 builder 的返回类型:


Read file: packages/builder/src/builder/builder.ts


我需要修改 BuilderOptionsbuildManifest 方法,使其返回构建结果信息:




我需要修改 #buildManifest 方法的返回类型和返回值:



我需要修改方法末尾,使其返回 BuilderResult以及处理早期返回的情况



现在我需要在方法的最后添加返回语句:



现在我需要更新 builder/index.ts 导出新的类型:


- export type { BuilderOptions } from './builder.js'
+ export type { BuilderOptions, BuilderResult } from './builder.js'
  export { defaultBuilder } from './builder.js'
  

现在我需要修改 CLI 代码,使用返回的构建结果来决定是否推送:



现在我需要更新 builder.config.example.json 文件,添加 token 字段的示例:


Read file: builder.config.example.json


    "repo": {
      "enable": true,
-     "url": "https://github.com/Innei/gallery-public"
+     "url": "https://github.com/Innei/gallery-public",
+     "token": "your_github_token_here"
    }
  }

最后,我需要更新帮助信息,说明新的 token 配置:



现在我需要在 --config 选项中显示 token 的状态信息:



现在我测试一下代码是否正常工作。让我运行构建命令查看配置:


cd packages/builder && pnpm run cli -- --config

> @afilmory/builder@0.0.1 cli /Users/innei/git/vibe-coding/photo-gallery-site/pa
ckages/builder
> tsx src/cli.ts -- --config

 🔄 同步远程仓库...
            MAIN 5:05:04 PM
 🔄 拉取远程仓库更新...
          MAIN 5:05:04 PM
Already up to date.
✔ ✅ 远程仓库同步完成
         MAIN 5:05:05 PM
 🔧 当前配置:
             MAIN 5:05:05 PM
    存储提供商s3
            MAIN 5:05:05 PM
    存储桶images
              MAIN 5:05:05 PM
    区域us-east-1
               MAIN 5:05:05 PM
    端点http://10.0.0.33:18888
               MAIN 5:05:05 PM
    自定义域名https://s3-private.innei.in/images
            MAIN 5:05:05 PM
    前缀:无
              MAIN 5:05:05 PM
    默认并发数10
            MAIN 5:05:05 PM
    Live Photo 检测:启用
             MAIN 5:05:05 PM
    Worker 数24
                MAIN 5:05:05 PM
    Worker 超时30000ms
               MAIN 5:05:05 PM
    集群模式:启用
           MAIN 5:05:05 PM

                  MAIN 5:05:05 PM
 📦 远程仓库配置:
           MAIN 5:05:05 PM
    启用状态:启用
           MAIN 5:05:05 PM
    仓库地址https://github.com/Innei/gallery-public
             MAIN 5:05:05 PM
    推送权限:未配置
          MAIN 5:05:05 PM


太好了!配置显示功能正常工作。现在让我测试帮助信息:


pnpm run cli -- --help
at 17:05:05  pnpm run cli -- --help

> @afilmory/builder@0.0.1 cli /Users/innei/git/vibe-coding/photo-gallery-site/packages/builder
> tsx src/cli.ts -- --help

 🔄 同步远程仓库...                                                                              MAIN 5:05:11 PM
 🔄 拉取远程仓库更新...                                                                          MAIN 5:05:11 PM
Already up to date.
✔ ✅ 远程仓库同步完成                                                                             MAIN 5:05:12 PM
                                                                                                 MAIN 5:05:12 PM
照片库构建工具 (新版本 - 使用适配器模式)

用法tsx src/core/cli.ts [选项]

选项:
  --force              强制重新处理所有照片
  --force-manifest     强制重新生成 manifest
  --force-thumbnails   强制重新生成缩略图
  --config             显示当前配置信息
  --help, -h          显示帮助信息

示例:
  tsx src/core/cli.ts                           # 增量更新
  tsx src/core/cli.ts --force                   # 全量更新
  tsx src/core/cli.ts --force-thumbnails        # 强制重新生成缩略图
  tsx src/core/cli.ts --config                  # 显示配置信息

配置:
  在 builder.config.ts 中设置 performance.worker.useClusterMode = true 
  可启用多进程集群模式,发挥多核心优势。

远程仓库:
  如果启用了远程仓库 (repo.enable = true),构建完成后会自动推送更新。
  需要配置 repo.token 或设置 GIT_TOKEN 环境变量以提供推送权限。
  如果没有提供 token将跳过推送步骤。


innei in photo-gallery-site/packages/builder on  main [$!?] via  v22.15.0 on ☁️  innei@rss3.io at     6668425 "f
eat: add Vite plugins for enhanced functionality and localization support"  by tukon479@gmail.com 
at 17:05:12 

很好!帮助信息显示正常。现在让我回到根目录测试一下实际的构建流程:


cd ../.. && pnpm run build:manifest
at 17:05:12  cd ../.. && pnpm run build:manifest

> @afilmory/monorepo@0.1.0 build:manifest /Users/innei/git/vibe-coding/photo-gallery-site
> pnpm --filter @afilmory/builder cli


> @afilmory/builder@0.0.1 cli /Users/innei/git/vibe-coding/photo-gallery-site/packages/builder
> tsx src/cli.ts

 🔄 同步远程仓库...                                                                              MAIN 5:05:21 PM
 🔄 拉取远程仓库更新...                                                                          MAIN 5:05:21 PM
Already up to date.
✔ ✅ 远程仓库同步完成                                                                             MAIN 5:05:22 PM
 🚀 运行模式:增量更新                                                                           MAIN 5:05:22 PM
 ⚡ 最大并发数24                                                                               MAIN 5:05:22 PM
 🔧 处理模式:多进程集群                                                                         MAIN 5:05:22 PM
 🏗️ 使用构建器PhotoGalleryBuilder (适配器模式)                                                 MAIN 5:05:22 PM
 Perl 已安装                                                                                     MAIN 5:05:22 PM
 🚀 开始从存储获取照片列表...                                                                    MAIN 5:05:22 PM
 🔗 使用端点http://10.0.0.33:18888                                                             MAIN 5:05:22 PM
 🌐 自定义域名https://s3-private.innei.in/images                                               MAIN 5:05:22 PM
 🪣 存储桶images                                                                               MAIN 5:05:22 PM
 📂 前缀:无前缀                                                                                 MAIN 5:05:22 PM
 现有 manifest 包含 79 张照片                                                                    MAIN 5:05:22 PM
 存储中找到 67 个文件                                                                            MAIN 5:05:22 PM
 检测到 3 个 Live Photo                                                                          MAIN 5:05:22 PM
 存储中找到 55 张照片                                                                            MAIN 5:05:22 PM
 存储中找到 55 张照片,实际需要处理 1 张                                                         MAIN 5:05:22 PM
 开始并发处理任务Worker数24                                                                  MAIN 5:05:22 PM
 开始并发处理任务工作池模式并发数24                                                        MAIN 5:05:22 PM
◐ Worker 1 启动                                                                                WORKER-1 5:05:22 PM
 开始处理任务 1/1                                                                            WORKER-1 5:05:22 PM
 📸 [1/1] 风光/DSCF3007.jpg                                                            WORKER-1:IMAGE 5:05:22 PM
 🆕 新照片:风光/DSCF3007.jpg                                                          WORKER-1:IMAGE 5:05:22 PM
 下载文件:风光/DSCF3007.jpg                                                                       S3 5:05:22 PM
✔ 下载完成:风光/DSCF3007.jpg (26335KB, 426ms)                                                      S3 5:05:22 PM
 开始提取 EXIF 数据                                                                     WORKER-1:EXIF 5:05:22 PM
✔ EXIF 数据提取完成                                                                      WORKER-1:EXIF 5:05:23 PM
 提取照片信息:风光/DSCF3007.jpg                                                       WORKER-1:IMAGE 5:05:23 PM
 从路径提取标签:[风光]                                                                WORKER-1:IMAGE 5:05:23 PM
 使用 EXIF Date 对象作为拍摄时间                                                       WORKER-1:IMAGE 5:05:23 PM
 照片信息提取完成:"DSCF3007"                                                          WORKER-1:IMAGE 5:05:23 PM
✔ ✅ 处理完成:风光/DSCF3007.jpg                                                        WORKER-1:IMAGE 5:05:23 PM
 完成任务 1/1 - 1167ms                                                                       WORKER-1 5:05:23 PM
✔ Worker 1 完成,处理了 1 个任务                                                              WORKER-1 5:05:23 PM
 🔍 检查已删除的图片...                                                                          MAIN 5:05:23 PM
[FS 5:05:23 PM]  📁 Manifest 保存至: /Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-mani
fest.json
✔ 🎉 Manifest 构建完成!                                                                           MAIN 5:05:23 PM
 📊 处理统计:                                                                                    MAIN 5:05:23 PM
    📸 总照片数55                                                                              MAIN 5:05:23 PM
    🆕 新增照片1                                                                               MAIN 5:05:23 PM
    🔄 处理照片1                                                                               MAIN 5:05:23 PM
    ⏭️ 跳过照片54                                                                              MAIN 5:05:23 PM
    🗑️ 删除照片25                                                                              MAIN 5:05:23 PM
    ⏱️ 总耗时1秒                                                                               MAIN 5:05:23 PM
 🔄 检测到更新,推送到远程仓库...                                                                MAIN 5:05:23 PM

 WARN  ⚠️ 未提供 Git Token跳过推送到远程仓库                                                     MAIN 5:05:23 PM


innei in photo-gallery-site on  main [$!?] via 🐳 orbstack via  v22.15.0 on ☁️  innei@rss3.io at     6668425 "fe
at: add Vite plugins for enhanced functionality and localization support"  by tukon479@gmail.com took 2s 
at 17:05:23 

完美!功能工作正常。我可以看到:

  1. 成功检测到了更新新增了1张照片删除了25张照片
  2. 由于 hasUpdates = true,所以尝试推送到远程仓库
  3. 但由于没有配置 Git Token所以跳过了推送并正确显示了警告信息

现在让我检查一下构建后软链接是否正确建立:


ls -la apps/web/src/data/
at 17:05:23  ls -la apps/web/src/data/
total 0
drwxr-xr-x   4 innei  staff  128 Jun 27 17:05 .
drwxrwxr-x  25 innei  staff  800 Jun 27 01:52 ..
-rw-r--r--   1 innei  staff    0 Jun  8 22:04 .gitkeep
lrwxr-xr-x   1 innei  staff   88 Jun 27 17:05 photos-manifest.json -> /Users/innei/git/vibe-coding/photo-gallery-sit
e/apps/web/assets-git/photos-manifest.json

innei in photo-gallery-site on  main [$!?] via 🐳 orbstack via  v22.15.0 on ☁️  innei@rss3.io at     6668425 "fe
at: add Vite plugins for enhanced functionality and localization support"  by tukon479@gmail.com 
at 17:05:30 

ls -la apps/web/public/
at 17:05:30  ls -la apps/web/public/
total 134528
-rw-r--r--   1 innei  staff       267 Jun  5 13:51 _routes.json
drwxr-xr-x  19 innei  staff       608 Jun 27 17:05 .
drwxr-xr-x  18 innei  staff       576 Jun 27 01:52 ..
-rw-r--r--   1 innei  staff     14643 Jun 27 16:57 android-chrome-192x192.png
-rw-r--r--   1 innei  staff     60803 Jun 27 16:57 android-chrome-512x512.png
-rw-r--r--   1 innei  staff     14228 Jun 27 16:57 apple-touch-icon.png
-rw-r--r--   1 innei  staff       778 Jun 27 16:57 favicon-16x16.png
-rw-r--r--   1 innei  staff      1736 Jun 27 16:57 favicon-32x32.png
-rw-r--r--   1 innei  staff      2803 Jun 27 16:57 favicon-48x48.png
-rw-r--r--   1 innei  staff      1736 Jun 27 16:57 favicon.ico
-rw-r--r--   1 innei  staff    308114 Jun 27 01:52 og-image-1750960326224.png
-rw-r--r--   1 innei  staff    308114 Jun 27 01:54 og-image-1750960455628.png
-rw-r--r--   1 innei  staff    308114 Jun 27 16:57 og-image-1751014676160.png
-rw-r--r--   1 innei  staff       375 Jun 27 16:57 site.webmanifest
-rw-r--r--   1 innei  staff     98940 May 25 23:59 test-svg-font-rendering.png
-rw-r--r--   1 innei  staff     97309 May 25 23:59 test-traditional-font-rendering.png
-rw-r--r--@  1 innei  staff  67527869 May 27 13:13 thomas-x2d-xcd-25v-1.jpg
-rw-r--r--   1 innei  staff     92258 May 27 13:24 thomas-x2d-xcd-25v-1.webp
lrwxr-xr-x   1 innei  staff        78 Jun 27 17:05 thumbnails -> /Users/innei/git/vibe-coding/photo-gallery-site/app
s/web/assets-git/thumbnails

innei in photo-gallery-site on  main [$!?] via 🐳 orbstack via  v22.15.0 on ☁️  innei@rss3.io at     6668425 "fe
at: add Vite plugins for enhanced functionality and localization support"  by tukon479@gmail.com 
at 17:05:34 

很好!软链接都正确建立了。现在让我创建一个简单的测试来验证推送功能:


cd apps/web/assets-git && git status
at 17:05:34  cd apps/web/assets-git && git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   photos-manifest.json
        deleted:    thumbnails/DSCF3755.webp
        deleted:    thumbnails/DSCF3756.webp
        deleted:    thumbnails/DSCF3768.webp
        deleted:    thumbnails/DSCF3819.webp
        deleted:    thumbnails/DSCF3837.webp
        deleted:    thumbnails/DSCF3838.webp
        deleted:    thumbnails/DSCF3859.webp
        deleted:    thumbnails/DSCF3868.webp
        deleted:    thumbnails/DSCF3884.webp
        deleted:    thumbnails/DSCF3946.webp
        deleted:    thumbnails/DSCF4016.webp
        deleted:    thumbnails/DSCF4020.webp
        deleted:    thumbnails/DSCF4032.webp
        deleted:    thumbnails/DSCF4069.webp
        deleted:    thumbnails/DSCF4072.webp
        deleted:    thumbnails/DSCF4075.webp
        deleted:    thumbnails/DSCF4086.webp
        deleted:    thumbnails/DSCF4113.webp
        deleted:    thumbnails/DSCF4115.webp
        deleted:    thumbnails/DSCF4116.webp
        deleted:    thumbnails/DSCF4127.webp
        deleted:    thumbnails/DSCF4149.webp
        deleted:    thumbnails/IMG_1401.webp
        deleted:    thumbnails/IMG_1461.webp
        deleted:    thumbnails/IMG_8186.webp

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        thumbnails/DSCF3007.webp

no changes added to commit (use "git add" and/or "git commit -a")

innei in assets-git on  main [✘!?] on ☁️  innei@rss3.io at     c4335c2 "chore: update photos-manifest.json and th
umbnails"  by tukon479@gmail.com 
at 17:05:40 

完美!可以看到确实有更改需要推送:

  • photos-manifest.json 被修改了
  • 删除了很多旧的缩略图文件
  • 添加了一个新的缩略图 DSCF3007.webp

现在让我创建一个简单的说明文档,总结一下这次实现的功能:


Cancelled


User


Assistant