Skip to content

🤖 CI/CD 中自动检测与安装

10 分钟,让一个全新初始化的 GitHub Actions runner 自动装好 Composer,再跑 composer install + 安全审计。零预装、跨平台。

为什么需要自动安装

CI runner 镜像不一定预装 Composer,自己写"检测 → 选包管理器 → 装包 → 装扩展"的 bash 又脏又脆。installer 包把这条链路封装成智能安装器,按平台自动选 brew / apt / 直接下载,还能顺带装 PHP。

第 1 步:检测当前状态

installer.IsComposerInstalled() 返回 (bool, path, version) 三元组,先确认是否真的需要装。

go
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

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 环境:

yaml
# .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 同样内置自动安装逻辑:

bash
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
✅ 依赖安装完成,无漏洞

进阶:进度回调与函数式入口

go
// 订阅安装进度
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)

InstallProgressStageMessagePercentTimestamp 字段,Stage 取值为 installer.StageDownloadinginstaller.StageInstalling 等常量。

Windows runner

Windows 上智能安装器会下载官方 .phar 并放到用户目录,确保 workflow 里有写权限;actions/setup-go 默认的 runner 都满足。

下一步

基于 MIT 许可证发布