🤖 CI/CD 中自动检测与安装
10 分钟,让一个全新初始化的 GitHub Actions runner 自动装好 Composer,再跑 composer install + 安全审计。零预装、跨平台。
为什么需要自动安装
CI runner 镜像不一定预装 Composer,自己写"检测 → 选包管理器 → 装包 → 装扩展"的 bash 又脏又脆。installer 包把这条链路封装成智能安装器,按平台自动选 brew / apt / 直接下载,还能顺带装 PHP。
第 1 步:检测当前状态
installer.IsComposerInstalled() 返回 (bool, path, version) 三元组,先确认是否真的需要装。
ok, path, ver := installer.IsComposerInstalled()第 2 步:智能安装
installer.NewSmartInstaller(installer.DefaultInstallOptions()) 创建智能安装器;InstallWithProgress() 返回 (*InstallResult, error),会按阶段报告进度。
第 3 步:装完即可用
安装完成后,直接 composer.New(composer.DefaultOptions()) 创建 Composer 实例——它的 AutoInstall 默认开启,后续即便 Composer 又消失也会自愈。
Go 代码:ensure-and-audit.go
package main
import (
"fmt"
"log"
"github.com/scagogogo/composer-skills/pkg/composer"
"github.com/scagogogo/composer-skills/pkg/installer"
)
func main() {
// 1️⃣ 检测
if ok, path, ver := installer.IsComposerInstalled(); ok {
fmt.Printf("✅ Composer 已安装: %s (%s)\n", path, ver)
} else {
fmt.Println("⚠️ 未检测到 Composer,开始智能安装...")
si := installer.NewSmartInstaller(installer.DefaultInstallOptions())
result, err := si.InstallWithProgress()
if err != nil {
log.Fatalf("安装失败: %v", err)
}
fmt.Printf("🎉 安装完成: %s\n", result.ComposerPath)
}
// 2️⃣ 拿到 Composer 实例
comp, err := composer.New(composer.DefaultOptions())
if err != nil {
log.Fatal(err)
}
comp.SetWorkingDir(".")
// 3️⃣ 装依赖 + 审计
if err := comp.Install(false, true); err != nil {
log.Fatalf("install 失败: %v", err)
}
audit, err := comp.AuditWithJSON()
if err != nil {
log.Fatal(err)
}
if audit.Found > 0 {
log.Fatalf("❌ 发现 %d 个漏洞,CI 失败", audit.Found)
}
fmt.Println("✅ 依赖安装完成,无漏洞")
}第 4 步:GitHub Actions workflow
把上面的 Go 程序作为 CI 入口,workflow 只需准备 Go 环境:
# .github/workflows/audit.yml
name: Install & Audit
on: [push, pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '1.23'
- name: Ensure Composer & Audit
run: go run ./ensure-and-audit.go不想写 Go?
workflow 里直接用现成 CLI 也行,CLI 同样内置自动安装逻辑:
go run ./cmd/composer-skills local install --working-dir .
go run ./cmd/composer-skills local audit --working-dir .预期输出(全新 runner)
⚠️ 未检测到 Composer,开始智能安装...
[stage] detecting platform... (25%)
[stage] downloading composer... (60%)
[stage] verifying... (85%)
🎉 安装完成: /usr/local/bin/composer
✅ 依赖安装完成,无漏洞进阶:进度回调与函数式入口
// 订阅安装进度
opts := installer.DefaultInstallOptions()
opts.ProgressCallback = func(p installer.InstallProgress) {
fmt.Printf("[%s] %s (%d%%)\n", p.Stage, p.Message, p.Percent)
}
si := installer.NewSmartInstaller(opts)
result, err := si.InstallWithProgress()
_ = result
// 或用一次性函数,适合在库内部确保依赖
r, err := installer.EnsureComposerInstalled(nil)InstallProgress 含 Stage、Message、Percent、Timestamp 字段,Stage 取值为 installer.StageDownloading、installer.StageInstalling 等常量。
Windows runner
Windows 上智能安装器会下载官方 .phar 并放到用户目录,确保 workflow 里有写权限;actions/setup-go 默认的 runner 都满足。
下一步
- 把审计升级成完整流水线:🔒 构建安全审计流水线。
- 给团队搭一个私有 Composer 仓库:🏭 Satis 私有仓库构建器。