202 lines
5.0 KiB
Markdown
202 lines
5.0 KiB
Markdown
# 文件哈希 GitHub Action
|
||
|
||
一个轻量级的 GitHub Action,用于计算指定文件或文件组的哈希值。非常适合需要文件完整性验证、变更检测或文件指纹识别的 CI/CD 工作流。
|
||
|
||
## 使用方法
|
||
|
||
### 基本示例
|
||
|
||
```yaml
|
||
name: Calculate File Hashes
|
||
on: [push]
|
||
|
||
jobs:
|
||
hash:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: Calculate hash for source files
|
||
uses: actions/files-hash@v0.1
|
||
id: hash-step
|
||
with:
|
||
files: |
|
||
src/**/*.js
|
||
package.json
|
||
algorithm: sha256
|
||
|
||
- name: Use the hash
|
||
run: |
|
||
echo "Hash: ${{ steps.hash-step.outputs.hash }}"
|
||
echo "Files processed: ${{ steps.hash-step.outputs.file-count }}"
|
||
```
|
||
|
||
### 高级示例
|
||
|
||
#### 多种文件模式
|
||
|
||
```yaml
|
||
- name: Hash multiple file types
|
||
uses: actions/files-hash@v0.1
|
||
with:
|
||
files: |
|
||
src/**/*.js
|
||
src/**/*.ts
|
||
*.json
|
||
!node_modules/**
|
||
algorithm: sha512
|
||
```
|
||
|
||
#### 不同的哈希算法
|
||
|
||
```yaml
|
||
- name: MD5 hash for quick comparison
|
||
uses: actions/files-hash@v0.1
|
||
with:
|
||
files: dist/*
|
||
algorithm: md5
|
||
```
|
||
|
||
#### 条件处理
|
||
|
||
```yaml
|
||
- name: Hash only if files exist
|
||
uses: actions/files-hash@v0.1
|
||
with:
|
||
files: |
|
||
build/**/*
|
||
dist/**/*
|
||
algorithm: sha256
|
||
continue-on-error: true
|
||
```
|
||
|
||
## 输入参数
|
||
|
||
| 输入参数 | 描述 | 必需 | 默认值 |
|
||
| ----------------- | ------------------------------------------- | ----- | -------- |
|
||
| `files` | 文件路径或 glob 模式(每行一个) | ✅ 是 | - |
|
||
| `algorithm` | 哈希算法:`md5`、`sha1`、`sha256`、`sha512` | ❌ 否 | `sha256` |
|
||
|
||
### 文件模式
|
||
|
||
`files` 输入支持多种模式:
|
||
|
||
- **单个文件**: `package.json`
|
||
- **多个文件**:
|
||
```yaml
|
||
files: |
|
||
file1.txt
|
||
file2.txt
|
||
```
|
||
- **Glob 模式**: `src/**/*.js`(src 目录及子目录中的所有 JS 文件)
|
||
- **通配符**: `*.json`(当前目录中的所有 JSON 文件)
|
||
- **目录**: `src/`(递归处理 src 目录中的所有文件)
|
||
|
||
## 输出结果
|
||
|
||
| 输出 | 描述 | 类型 |
|
||
| ------------ | ------------------------ | ------ |
|
||
| `hash` | 所有处理文件的组合哈希值 | string |
|
||
| `file-count` | 成功处理的文件数量 | number |
|
||
|
||
## 工作原理
|
||
|
||
1. **文件发现**: 解析输入模式并查找匹配的文件
|
||
2. **验证**: 检查文件存在性和可读性
|
||
3. **哈希计算**: 使用指定算法计算各个文件的哈希值
|
||
4. **组合**: 从所有单个文件哈希值创建组合哈希值
|
||
5. **输出**: 设置 GitHub Actions 输出供后续步骤使用
|
||
|
||
组合哈希值的计算方式:
|
||
|
||
1. 按字母顺序对所有文件路径进行排序(确保一致性)
|
||
2. 计算每个文件的哈希值
|
||
3. 从所有单个哈希值的连接创建新的哈希值
|
||
|
||
这确保了相同的文件集始终产生相同的组合哈希值,无论它们的处理顺序如何。
|
||
|
||
## 支持的算法
|
||
|
||
| 算法 | 输出长度 | 使用场景 |
|
||
| -------- | -------- | --------------------------------- |
|
||
| `md5` | 32 字符 | 快速比较、传统系统 |
|
||
| `sha1` | 40 字符 | Git 兼容性、通用用途 |
|
||
| `sha256` | 64 字符 | **推荐** - 安全性和性能的良好平衡 |
|
||
| `sha512` | 128 字符 | 最高安全性、加密应用 |
|
||
|
||
## 错误处理
|
||
|
||
该 Action 优雅地处理各种错误场景:
|
||
|
||
- **文件缺失**: 直接抛出错误
|
||
- **权限错误**: 提供包含文件路径的清晰错误信息
|
||
- **无效算法**: 列出支持的算法
|
||
- **空文件集**: 失败并提供描述性消息
|
||
|
||
## 性能
|
||
|
||
- **并发处理**: 同时处理多个文件
|
||
- **流式处理**: 高效处理大文件,无需加载到内存中
|
||
- **内存管理**: 针对大文件集和大文件进行优化
|
||
- **进度日志**: 为长时间运行的操作提供清晰的进度指示器
|
||
|
||
## 实际项目示例
|
||
|
||
### 缓存键生成
|
||
|
||
```yaml
|
||
- name: Generate cache key
|
||
uses: actions/files-hash@v0.1
|
||
id: cache-key
|
||
with:
|
||
files: |
|
||
package-lock.json
|
||
yarn.lock
|
||
pnpm-lock.yaml
|
||
algorithm: sha256
|
||
|
||
- name: Cache dependencies
|
||
uses: actions/cache@v3
|
||
with:
|
||
path: node_modules
|
||
key: deps-${{ steps.cache-key.outputs.hash }}
|
||
```
|
||
|
||
### 构建产物验证
|
||
|
||
```yaml
|
||
- name: Build application
|
||
run: npm run build
|
||
|
||
- name: Calculate build hash
|
||
uses: actions/files-hash@v0.1
|
||
id: build-hash
|
||
with:
|
||
files: dist/**/*
|
||
algorithm: sha256
|
||
|
||
- name: Upload artifacts with hash
|
||
uses: actions/upload-artifact@v3
|
||
with:
|
||
name: build-${{ steps.build-hash.outputs.hash }}
|
||
path: dist/
|
||
```
|
||
|
||
### 配置变更检测
|
||
|
||
```yaml
|
||
- name: Check config changes
|
||
uses: actions/files-hash@v0.1
|
||
id: config-hash
|
||
with:
|
||
algorithm: sha1
|
||
files: |
|
||
.github/workflows/**
|
||
config/**
|
||
*.config.js
|
||
|
||
- name: Notify on config changes
|
||
if: steps.config-hash.outputs.hash != env.LAST_CONFIG_HASH
|
||
run: echo "Configuration files have changed!"
|
||
```
|