|
| 1 | +# 20251217 Bundler Shell Plugin 开发 |
| 2 | + |
| 3 | +## 任务目标 |
| 4 | + |
| 5 | +开发一个 bundler shell plugin,当执行 `bundle install` 命令时,如果需要从环境变量读取 `BUNDLE_RUBYGEMS__PKG__GITHUB__COM`,则从 1Password 中获取。 |
| 6 | + |
| 7 | +## 计划阶段 |
| 8 | + |
| 9 | +### 需求分析 |
| 10 | + |
| 11 | +- **目标**:为 Ruby Bundler 创建 1Password Shell Plugin |
| 12 | +- **功能**:当执行 `bundle install` 时,自动从 1Password 获取 GitHub Personal Access Token 并设置为环境变量 `BUNDLE_RUBYGEMS__PKG__GITHUB__COM` |
| 13 | +- **环境变量**:`BUNDLE_RUBYGEMS__PKG__GITHUB__COM`(注意是双下划线) |
| 14 | +- **认证时机**:仅在 `bundle install` 命令时需要使用认证 |
| 15 | + |
| 16 | +### 技术方案 |
| 17 | + |
| 18 | +1. **插件结构**: |
| 19 | + |
| 20 | + - `plugin.go` - 插件主入口 |
| 21 | + - `personal_access_token.go` - GitHub Personal Access Token 凭证定义 |
| 22 | + - `bundle.go` - Bundle CLI 可执行文件定义 |
| 23 | + - `personal_access_token_test.go` - 测试文件 |
| 24 | + |
| 25 | +### 更新记录 |
| 26 | + |
| 27 | +- **20251217 晚**:将插件名称从 `bundle` 重命名为 `bundler`,更符合 Ruby Bundler 的命名规范 |
| 28 | + |
| 29 | +2. **凭证类型**: |
| 30 | + |
| 31 | + - 使用 `credname.PersonalAccessToken` |
| 32 | + - 字段:`fieldname.Token` |
| 33 | + |
| 34 | +3. **环境变量映射**: |
| 35 | + |
| 36 | + - `BUNDLE_RUBYGEMS__PKG__GITHUB__COM` -> `fieldname.Token` |
| 37 | + |
| 38 | +4. **认证规则**: |
| 39 | + - 仅在 `bundle install` 命令时使用认证 |
| 40 | + - 排除 help、version 等命令 |
| 41 | + |
| 42 | +### 参考示例 |
| 43 | + |
| 44 | +- GitHub 插件:使用 Personal Access Token |
| 45 | +- Homebrew 插件:使用 `needsauth.ForCommand("install")` 检测 install 命令 |
| 46 | + |
| 47 | +## 执行记录 |
| 48 | + |
| 49 | +### 阶段一:需求分析和方案设计 |
| 50 | + |
| 51 | +- **时间**:20251217 |
| 52 | +- **操作**:分析现有插件结构,理解 SDK 使用方式 |
| 53 | +- **结果**:明确了实现方案 |
| 54 | +- **问题**:无 |
| 55 | +- **解决方案**:无 |
| 56 | + |
| 57 | +### 阶段二:创建插件文件 |
| 58 | + |
| 59 | +- **时间**:20251217 |
| 60 | +- **操作**:创建 bundle 插件目录和所有必要文件 |
| 61 | + - `plugin.go` - 插件主入口 |
| 62 | + - `personal_access_token.go` - GitHub Personal Access Token 凭证定义 |
| 63 | + - `bundle.go` - Bundle CLI 可执行文件定义 |
| 64 | + - `personal_access_token_test.go` - 测试文件 |
| 65 | +- **结果**:所有文件创建成功 |
| 66 | +- **问题**:`context` 包被导入但未使用 |
| 67 | +- **解决方案**:移除未使用的 `context` 导入 |
| 68 | + |
| 69 | +### 阶段三:注册和验证 |
| 70 | + |
| 71 | +- **时间**:20251217 |
| 72 | +- **操作**: |
| 73 | + - 运行 `make registry` 注册插件 |
| 74 | + - 运行 `make bundle/validate` 验证插件结构 |
| 75 | + - 运行 `go test ./plugins/bundle/...` 运行测试 |
| 76 | +- **结果**:所有验证和测试通过 |
| 77 | +- **问题**:无 |
| 78 | +- **解决方案**:无 |
| 79 | + |
| 80 | +## 测试记录 |
| 81 | + |
| 82 | +### 验证结果 |
| 83 | + |
| 84 | +- ✅ 插件结构验证:所有检查项通过 |
| 85 | +- ✅ 单元测试:Provisioner 和 Importer 测试通过 |
| 86 | +- ✅ 编译检查:无编译错误 |
| 87 | +- ✅ Linter 检查:无 linter 错误 |
| 88 | + |
| 89 | +### 测试详情 |
| 90 | + |
| 91 | +1. **Provisioner 测试**:验证环境变量 `BUNDLE_RUBYGEMS__PKG__GITHUB__COM` 正确设置 |
| 92 | +2. **Importer 测试**:验证从环境变量导入凭证功能正常 |
| 93 | + |
| 94 | +## 总结 |
| 95 | + |
| 96 | +### 完成的工作 |
| 97 | + |
| 98 | +1. ✅ 创建了完整的 bundle shell plugin |
| 99 | +2. ✅ 实现了 GitHub Personal Access Token 凭证类型 |
| 100 | +3. ✅ 配置了只在 `bundle install` 命令时使用认证 |
| 101 | +4. ✅ 设置了正确的环境变量映射:`BUNDLE_RUBYGEMS__PKG__GITHUB__COM` |
| 102 | +5. ✅ 编写了完整的测试用例 |
| 103 | +6. ✅ 通过了所有验证和测试 |
| 104 | + |
| 105 | +### 关键实现点 |
| 106 | + |
| 107 | +1. **环境变量映射**:使用 `BUNDLE_RUBYGEMS__PKG__GITHUB__COM`(注意双下划线)映射到 `fieldname.Token` |
| 108 | +2. **认证规则**:使用 `needsauth.ForCommand("install")` 确保只在 `bundle install` 时使用认证 |
| 109 | +3. **凭证类型**:复用 `credname.PersonalAccessToken`,符合 GitHub token 的标准格式 |
| 110 | + |
| 111 | +### 文件清单 |
| 112 | + |
| 113 | +- `plugins/bundler/plugin.go` - 插件主入口 |
| 114 | +- `plugins/bundler/personal_access_token.go` - 凭证定义 |
| 115 | +- `plugins/bundler/bundle.go` - 可执行文件定义 |
| 116 | +- `plugins/bundler/personal_access_token_test.go` - 测试文件 |
| 117 | + |
| 118 | +### 下一步 |
| 119 | + |
| 120 | +插件已准备就绪,可以: |
| 121 | + |
| 122 | +1. 使用 `make bundler/build` 构建本地插件 |
| 123 | +2. 在 1Password CLI 中使用该插件 |
| 124 | +3. 提交 PR 到主仓库(如需要) |
| 125 | + |
| 126 | +### 重命名记录 |
| 127 | + |
| 128 | +- **20251217 晚**:将插件名称从 `bundle` 重命名为 `bundler` |
| 129 | + - 重命名目录:`plugins/bundle` → `plugins/bundler` |
| 130 | + - 更新包名:`package bundle` → `package bundler` |
| 131 | + - 更新插件名称:`Name: "bundle"` → `Name: "bundler"` |
| 132 | + - 重新注册插件并验证通过 |
0 commit comments