2026-04-25 学习日志
今日主题
- jenv 版本管理机制
- IntelliJ 插件 CI/CD 工程实践
- macOS Keychain 安全模型
- GitHub Actions OIDC 认证机制
新增认知
jenv 版本管理机制
- jenv 版本作用域优先级:项目级(.java-version) > 用户级(~/.jenv/version) > Shell 级,项目级由 jenv local 写入文件,不依赖 shell 环境。
- Makefile 中用 $(shell jenv javahome) 而非直接依赖 $JAVA_HOME,是因为前者在 make 解析阶段即时求值,强制读取 .java-version,绕过了 shell 环境变量可能未刷新的问题。
- export 插件让 jenv 在 shell 启动时自动导出 JAVA_HOME,但已打开的 shell 不会自动更新——切换版本后需重新 cd 进入目录或开新终端才能生效。
- jenv javahome 不接受版本参数,只返回当前生效版本的路径;要查询指定版本路径需先 jenv local 再执行 jenv javahome。
IntelliJ 插件 CI/CD 工程实践
- JetBrains 插件签名 Gradle DSL 的字段名是 password(非 privateKeyPassword),查错最直接的方法是看 SignPluginTask.kt 源码,而非靠文档猜测。
- Tag 驱动版本的单一事实来源:build.gradle.kts 用 System.getenv('PLUGIN_VERSION') ?: '1.0.0-dev',CI 从 tag 去掉 v 前缀注入,本地自动回退 dev 版本,无需维护两处版本号。
- workflow_dispatch 手动触发 CI 时 GITHUB_REF_NAME 不是 tag,需用 if: github.event_name == 'push' 保护只在 tag push 时才创建 GitHub Release,避免手动触发时报错。
macOS Keychain 安全模型
- 每个 Keychain 条目有 ACL 列表,记录哪些二进制文件可无弹窗访问。创建者自动入列;其他进程访问会触发授权弹窗。
- git-credential-osxkeychain 不在 PATH,位于 $(git --exec-path)/git-credential-osxkeychain,因在 ACL 列表中故无弹窗。任何同用户进程可直接调用它静默读取 Token。
- Keychain 的安全边界:防止跨用户访问和未授权进程静默读取;不防止同用户恶意进程通过调用已授权二进制(如 git-credential-osxkeychain)获取凭据。
- 没有更好的办法:凭据总要存储在本地某处,Keychain 是在该约束下可用的最佳权衡——至少加密静态存储并阻止 UI 级访问。
GitHub Actions OIDC 认证机制
- GitHub Actions 生成短期 JWT(OIDC Token),由 GitHub 私钥签名。云厂商预先配置 GitHub 为受信 IdP,收到 JWT 后用 GitHub 公钥验签,通过即签发临时凭据。全程无长期 Secret 存储。
- OIDC Discovery(OpenID Connect Discovery 1.0)规范:任何 OIDC Provider 在 {issuer}/.well-known/openid-configuration 暴露元数据,其中 jwks_uri 指向公钥集合。Relying Party 据此自动发现公钥,无需手动配置。
- JWT iss 字段在 RFC 7519 中是纯字符串(仅作标识符);OIDC Core 追加约束:必须是 HTTPS URL,且与 Provider 的 issuer URL 完全一致。这个一致性使 iss 值既是身份标识又是 Discovery 端点的 base URL——同一个值服务于两个用途。
- 厂商判断 JWT 来自 GitHub 的流程:取 iss 字段值 → 访问 {iss}/.well-known/openid-configuration → 获取 jwks_uri → 下载公钥 → 验证签名。依赖 OIDC Discovery 标准,不需要任何 GitHub 专属逻辑。