Auto Update USB.IDS #27
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Auto Update USB.IDS | |
| permissions: | |
| id-token: write | |
| contents: write | |
| pull-requests: write | |
| on: | |
| schedule: | |
| # 每天UTC 2:30执行(避开高峰期) | |
| - cron: '30 2 * * *' | |
| workflow_dispatch: # 允许手动触发 | |
| jobs: | |
| auto-update: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 # 设置超时时间为30分钟 | |
| steps: | |
| - name: Record execution time | |
| run: | | |
| echo "Workflow started at: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" | |
| echo "Scheduled time was: $(date -u -d 'today 02:30' '+%Y-%m-%d %H:%M:%S UTC')" | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: lts/* | |
| cache: pnpm | |
| registry-url: 'https://registry.npmjs.org' | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| with: | |
| version: 9.15.9 | |
| - name: Install dependencies | |
| run: pnpm install | |
| - name: Check if update is needed | |
| id: check-update | |
| run: | | |
| # 获取npm最新版本的contentHash作为基准 | |
| mkdir -p /tmp/npm-check | |
| cd /tmp/npm-check | |
| npm install usb.ids --silent 2>/dev/null || true | |
| # 获取 npm 最新版本的 contentHash | |
| if [ -f "node_modules/usb.ids/usb.ids.version.json" ]; then | |
| NPM_HASH=$(node -p "require('./node_modules/usb.ids/usb.ids.version.json').contentHash" 2>/dev/null || echo "") | |
| else | |
| NPM_HASH="" | |
| fi | |
| echo "NPM hash: $NPM_HASH" | |
| # 清理临时目录 | |
| cd / | |
| rm -rf /tmp/npm-check | |
| # 回到工作目录,获取远程数据但不保存,只计算hash | |
| cd $GITHUB_WORKSPACE | |
| # 下载远程数据并计算contentHash(不保存文件) | |
| REMOTE_CONTENT=$(curl -s "http://www.linux-usb.org/usb.ids" || curl -s "https://raw.githubusercontent.com/systemd/systemd/main/hwdb.d/usb.ids" || echo "") | |
| if [ -n "$REMOTE_CONTENT" ]; then | |
| # 使用Node.js计算SHA256 hash | |
| REMOTE_HASH=$(node -e "const crypto = require('crypto'); console.log(crypto.createHash('sha256').update(process.argv[1]).digest('hex'));" "$REMOTE_CONTENT") | |
| echo "Remote hash: $REMOTE_HASH" | |
| if [ "$REMOTE_HASH" = "$NPM_HASH" ] && [ -n "$NPM_HASH" ]; then | |
| echo "No update needed, contentHash is the same" | |
| echo "skip=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "Update needed, contentHash is different or no previous version" | |
| echo "skip=false" >> $GITHUB_OUTPUT | |
| fi | |
| else | |
| echo "Failed to fetch remote data, forcing update" | |
| echo "skip=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Fetch USB IDs | |
| if: steps.check-update.outputs.skip != 'true' | |
| run: pnpm run fetch-usb-ids | |
| - name: Build Lib | |
| if: steps.check-update.outputs.skip != 'true' | |
| run: pnpm run build:lib | |
| - name: Build UI | |
| if: steps.check-update.outputs.skip != 'true' | |
| run: pnpm run build:app --outDir dist/ui | |
| - name: Upload build artifacts | |
| if: steps.check-update.outputs.skip != 'true' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: usb-ids-build-${{ github.run_number }} | |
| path: | | |
| dist/ | |
| usb.ids.json | |
| usb.ids.version.json | |
| retention-days: 30 | |
| - name: Update package.json version and README | |
| if: steps.check-update.outputs.skip != 'true' | |
| run: | | |
| # 从 usb.ids.version.json 获取版本号 | |
| NEW_VERSION=$(node -p "require('./usb.ids.version.json').version.replace(/^v/, '')") | |
| echo "New version: $NEW_VERSION" | |
| # 更新 package.json 中的版本 | |
| node -e " | |
| const fs = require('fs'); | |
| const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); | |
| pkg.version = '$NEW_VERSION'; | |
| fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n'); | |
| " | |
| # 使用专门的脚本更新 README.md 版本信息 | |
| pnpm run update-readme-version | |
| # 配置 git 用户信息 | |
| git config --local user.email "action@github.com" | |
| git config --local user.name "GitHub Action" | |
| # 提交更改 | |
| git add package.json README.md | |
| git commit -m "chore: update to version $NEW_VERSION | |
| - Updated package.json version to $NEW_VERSION | |
| - Updated README.md with latest version info | |
| - Data updated automatically" | |
| - name: Create and push tag | |
| if: steps.check-update.outputs.skip != 'true' | |
| run: | | |
| # 从 usb.ids.version.json 获取完整版本号作为标签 | |
| TAG_VERSION=$(node -p "require('./usb.ids.version.json').version") | |
| echo "Creating tag: $TAG_VERSION" | |
| # 创建标签 | |
| git tag "$TAG_VERSION" | |
| # 推送提交和标签 | |
| git push origin main | |
| git push origin "$TAG_VERSION" | |
| - name: Generate changelog | |
| if: steps.check-update.outputs.skip != 'true' | |
| run: pnpm dlx changelogithub | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Publish to npm | |
| if: steps.check-update.outputs.skip != 'true' | |
| run: pnpm publish --no-git-checks | |
| env: | |
| NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} |