文档
blight 是一个 PHP CLI 工具,用于检测本地机器与 CI/CD 环境之间的版本和环境漂移。运行一条命令即可确切了解为何本地构建通过而 CI 失败。
简介
由环境不匹配引起的大多数 CI 失败在到达构建服务器之前是不可见的。blight 实时将您的本地环境与 GitHub Actions 日志进行比较——在推送之前发现 PHP 版本不匹配、缺少 Node.js 和 ENV 变量漂移。
- 解析 GitHub Actions 日志文件中的错误、警告和失败步骤
- 将本地 PHP、Node.js 和 ENV 状态与 CI 使用的进行比较
- 将差异分类为
严重、警告或信息 - 以交互式终端表格或机器可读 JSON 输出
安装
克隆并在本地运行
bashgit clone https://github.com/blight-dev/blight.git
cd blight
composer install
php bin/blight --version
Composer 全局安装 (发布到 Packagist 后可用)
composer global require blight/blight
blight --version
bin 目录在您的 $PATH 中:export PATH="$HOME/.composer/vendor/bin:$PATH"
要求:PHP 8.2+、Composer 2.x、ext-json
快速入门
捕获 CI 不匹配的最快方式:
1. 检查本地环境php bin/blight info
2. 解析 CI 日志文件
php bin/blight parse --log /path/to/github-actions.log
3. 本地与 CI 对比
php bin/blight compare --log /path/to/github-actions.log
4. 查看完整摘要报告
php bin/blight report
blight info
显示本地环境:PHP 版本、SAPI、Node.js、npm、操作系统、架构、Git 分支/提交及 ENV 变量(敏感值自动脱敏)。
| 选项 | 描述 |
|---|---|
| --output json | 输出机器可读 JSON 而非表格 |
| --show-secrets | 显示已脱敏的 ENV 值 |
| -v / --verbose | 包含额外环境详情的扩展输出 |
| -q / --quiet | 仅单行摘要 |
$ php bin/blight info
blight.dev – Local Environment Inspector
=========================================
PHP Version 8.2.0
Node Version 20.11.0
OS Linux x86_64
Branch main / abc1234
DATABASE_URL [REDACTED]
blight parse
解析 GitHub Actions 日志文件。检测 CI 步骤、失败步骤、错误行以及 CI 中使用的 PHP/Node 版本。
| 选项 | 描述 |
|---|---|
| --log <path> | 必填。CI 日志文件路径 |
| --output json | 输出 JSON 结果 |
| -q | 单行:错误数量摘要 |
| -v | 显示每条错误行及完整上下文 |
$ php bin/blight parse --log examples/ci-major-mismatch.log
Steps: Set up PHP ✓, Set up Node.js ✓, Run tests ✗
Errors (2): PHP Fatal error in Util.php:42, exit code 255
Summary: 3 steps, 1 failed, 2 errors
blight compare
核心命令。将实时本地环境与 CI 日志中检测到的内容进行比较。将每个差异分类为严重、警告或信息。
| 选项 | 描述 |
|---|---|
| --log <path> | 必填。CI 日志文件路径 |
| --output json | 输出包含差异数组的结构化 JSON |
| --repo <name> | 将分析标记在特定仓库名称下 |
| -q | 单行:严重 N,警告 N,总计 N |
┌──────────┬─────────────────┬───────────┬────────┬─────────────────────────────────────┐
│ Severity │ Key │ Local │ CI │ Message │
├──────────┼─────────────────┼───────────┼────────┼─────────────────────────────────────┤
│ CRITICAL │ PHP Version │ 8.2.0 │ 7.4.33 │ Major version mismatch — will fail │
│ WARNING │ Node.js Version │ not found │ 18.1.0 │ CI uses Node.js, not installed here │
└──────────┴─────────────────┴───────────┴────────┴─────────────────────────────────────┘
blight report
默认命令(不带参数调用 blight 时运行)。显示存储在 .blight_usage.json 中的最近分析摘要。
| 选项 | 描述 |
|---|---|
| --output json | 输出 JSON 摘要 |
| -q | 单行:分析数量 |
blight history Paid
显示所有历史分析的详细记录,可按仓库或严重程度筛选。完整历史需要付费 API 密钥。免费计划显示最近 5 条记录。
| 选项 | 描述 |
|---|---|
| --repo <name> | 按仓库名称筛选历史 |
| --severity <level> | 按严重、警告或信息筛选 |
| --output json | 输出 JSON——仅付费 |
| -q | 单行:数量 |
blight init
在当前目录中交互式创建 .blight.json 配置文件。设置 API 密钥、默认仓库名称和通知偏好。
$ php bin/blight init
? API key (leave blank for free plan): blight_pro_xxxxxxxxx
? Default repo name: my-app
? Enable Slack alerts? No
✔ Created .blight.json
配置 — .blight.json
blight 在当前目录中查找 .blight.json 文件。使用 blight init 创建或手动创建:
{
"api_key": "blight_pro_xxxxxxxxxxxxxxxx",
"repo": "my-app",
"alerts": {
"slack_webhook": "https://hooks.slack.com/services/...",
"discord_webhook": ""
}
}
.blight.json 和 .blight_usage.json 会自动添加到 .gitignore——您的 API 密钥永远不会被提交。
输出格式
所有命令都支持 --output json 以获取结构化机器可读输出。适用于脚本编写、CI 集成或仪表板。
{
"command": "compare",
"repo": "my-app",
"timestamp": "2026-04-09T12:00:00Z",
"mismatches": [
{
"severity": "CRITICAL",
"key": "PHP Version",
"local": "8.2.0",
"ci": "7.4.33",
"message": "Major PHP version mismatch"
}
],
"summary": { "critical": 1, "warning": 0, "info": 0 }
}
静默模式 (-q)
为任意命令添加 -q 以获取单行摘要。适合 shell 脚本和 CI 流水线。
$ php bin/blight compare --log ci.log -q
CRITICAL: 1, WARNING: 1, Total: 2
$ php bin/blight parse --log ci.log -q
Errors: 2, Warnings: 0, Failed steps: 1
Webhook 通知 Paid
每当 compare 发现差异时,blight 可以发送 Webhook 通知。支持 Slack 和 Discord(任何接受 JSON POST 的服务)。
通过 .blight.json 配置
{
"api_key": "blight_pro_xxxxxxxxxxxxxxxx",
"repo": "my-app",
"alerts": {
"slack_webhook": "https://hooks.slack.com/services/T.../B.../xxx",
"discord_webhook": "https://discord.com/api/webhooks/..."
}
}
或通过 compare 内联传入
php bin/blight compare --log ci.log \
--alert slack \
--webhook-url https://hooks.slack.com/services/...
| 选项 | 描述 |
|---|---|
| --alert slack | 将差异摘要发送到 Slack Webhook URL |
| --alert discord | 将差异摘要发送到 Discord Webhook URL |
| --webhook-url <url> | 为本次运行覆盖配置中的 Webhook URL |
GitHub Actions 集成
blight 附带一个可直接使用的 GitHub Actions 流水线,位于 .github/workflows/ci.yml。它在每次推送和拉取请求时运行,涵盖 lint、静态分析和 blight 自身的 dogfood 步骤。
name: CI
on:
push:
pull_request:
jobs:
build:
name: PHP ${{ matrix.php-version }}
runs-on: ubuntu-latest
strategy:
matrix:
php-version: ["8.2"]
steps:
- uses: actions/checkout@v4
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
- name: Validate composer.json
run: composer validate --strict
- name: Cache Composer packages
uses: actions/cache@v4
with:
path: vendor
key: ${{ runner.os }}-composer-${{ hashFiles('composer.lock') }}
- name: Install dependencies
run: composer install --no-interaction --prefer-dist
- name: Lint PHP syntax
run: find src/ -name "*.php" -print0 | xargs -0 -n1 php -l
- name: PHPStan static analysis
run: vendor/bin/phpstan analyse --no-progress --error-format=github
- name: blight — parse sample log (dogfood)
continue-on-error: true
run: php bin/blight parse --log examples/ci-sample.log
- name: blight — compare local vs CI sample (dogfood)
continue-on-error: true
run: php bin/blight compare --log examples/ci-sample.log
continue-on-error: true,因为 blight compare 在发现漂移时以 1 退出——这是其预期行为。这使 CI 输出能够显示差异报告而不阻塞构建。
在您自己的 CI 中使用 blight
要在任何现有 GitHub Actions 工作流中将 blight 用作漂移检测步骤,请添加一个下载实际 CI 日志并运行 compare 的步骤:
- name: Detect environment drift with blight
run: |
php bin/blight compare --log "${{ runner.temp }}/ci-run.log" -q
continue-on-error: true
示例日志格式
blight 解析从仓库 Actions 选项卡下载的 GitHub Actions 日志文件。解析器查找特定模式:
| 模式 | blight 提取的内容 |
|---|---|
| ##[group]Step name | CI step boundary |
| ##[endgroup] | Step end |
| ##[error]... | Error line (increments error count) |
| PHP 8.2.17 (cli)... installed | PHP version used in CI |
| Node.js v20.11.1 installed | Node.js version used in CI |
| Process completed with exit code N | Step failure detection |
examples/ 目录包含两个可用于测试的参考日志:
examples/ci-sample.log— 包含失败测试步骤和错误行的真实 7 步日志examples/ci-major-mismatch.log— 显示 PHP 7.4 与 8.x 主版本不匹配的日志
php bin/blight parse --log examples/ci-sample.log
php bin/blight compare --log examples/ci-major-mismatch.log
Pre-push Git 钩子
通过将 blight 接入 Git pre-push 钩子,在推送前捕获 CI 漂移。保存最新的 CI 日志,并在每次推送时自动进行比较:
.git/hooks/pre-push#!/bin/sh
# blight pre-push hook — abort if CRITICAL drift is found
LOG="$HOME/.blight/last-ci.log"
if [ -f "$LOG" ]; then
RESULT=$(php bin/blight compare --log "$LOG" -q 2>&1)
echo "$RESULT"
if echo "$RESULT" | grep -q "CRITICAL: [1-9]"; then
echo "blight: CRITICAL environment drift detected. Fix before pushing."
exit 1
fi
fi
exit 0
chmod +x .git/hooks/pre-push
PHPStan 集成
blight 使用 PHPStan 在第 5 级进行静态分析。配置位于项目根目录的 phpstan.neon 中:
includes:
- phpstan-baseline.neon
parameters:
level: 5
paths:
- src/
phpstan-baseline.neon 文件将代码库中预先存在的错误设为基线,这样只有新代码必须是干净的。修复错误后重新生成基线:
vendor/bin/phpstan analyse --generate-baseline --memory-limit=512M
PHPStan 通过 CI 流水线在每次推送时自动运行,并使用 --error-format=github 直接在 GitHub 拉取请求中输出注释。
多语言支持
blight 支持英语、土耳其语和简体中文输出。通过 CLI 标志、配置文件或环境变量设置首选语言。
用法
CLI 标志(最高优先级)php bin/blight info --lang tr
php bin/blight compare --log ci.log --lang zh
配置文件 (.blight.json)
{
"lang": "tr"
}
环境变量
BLIGHT_LANG=tr php bin/blight info
优先级顺序
--langCLI 标志.blight.json"lang"字段BLIGHT_LANG环境变量- 默认:
en(英语)
支持的语言
| 代码 | 语言 |
|---|---|
| en | 英语(默认) |
| tr | 土耳其语 / Türkçe |
| zh | 简体中文 |
--lang 标志受所有命令支持:info、parse、compare、report、history 和 init。
免费计划
- 每个仓库 5 次分析
- 1 个仓库
- 所有命令可用
- 历史记录限于最近 5 条
- 无 JSON 历史导出
付费计划
- 无限次分析
- 无限仓库
- 带筛选的完整历史
- JSON 历史导出
- Slack 和 Discord 通知 Webhook
- 优先支持
在 .blight.json 中或通过 blight init 设置 API 密钥以激活付费功能。