Buckets:
| name: nix-hashes | |
| permissions: | |
| contents: write | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: [dev, beta] | |
| paths: | |
| - "bun.lock" | |
| - "package.json" | |
| - "packages/*/package.json" | |
| - "flake.lock" | |
| - "nix/node_modules.nix" | |
| - "nix/scripts/**" | |
| - "patches/**" | |
| - ".github/workflows/nix-hashes.yml" | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| # Native runners required: bun install cross-compilation flags (--os/--cpu) | |
| # do not produce byte-identical node_modules as native installs. | |
| compute-hash: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - system: x86_64-linux | |
| runner: blacksmith-4vcpu-ubuntu-2404 | |
| - system: aarch64-linux | |
| runner: blacksmith-4vcpu-ubuntu-2404-arm | |
| - system: x86_64-darwin | |
| runner: macos-15-intel | |
| - system: aarch64-darwin | |
| runner: macos-latest | |
| runs-on: ${{ matrix.runner }} | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| - name: Setup Nix | |
| uses: nixbuild/nix-quick-install-action@2c9db80fb984ceb1bcaa77cdda3fdf8cfba92035 # v34 | |
| - name: Compute node_modules hash | |
| id: hash | |
| env: | |
| SYSTEM: ${{ matrix.system }} | |
| run: | | |
| set -euo pipefail | |
| BUILD_LOG=$(mktemp) | |
| trap 'rm -f "$BUILD_LOG"' EXIT | |
| HASH="" | |
| MAX_ATTEMPTS=3 | |
| for ((ATTEMPT = 1; ATTEMPT <= MAX_ATTEMPTS; ATTEMPT++)); do | |
| # Build with fakeHash to trigger hash mismatch and reveal correct hash | |
| nix build ".#packages.${SYSTEM}.node_modules_updater" --no-link 2>&1 | tee "$BUILD_LOG" || true | |
| HASH="$(nix run --inputs-from . nixpkgs#gnugrep -- -oP 'got:\s*\Ksha256-[A-Za-z0-9+/=]+' "$BUILD_LOG" | tail -n1 || true)" | |
| [ -n "$HASH" ] && break | |
| if [ "$ATTEMPT" -lt "$MAX_ATTEMPTS" ]; then | |
| echo "::warning::Attempt ${ATTEMPT}/${MAX_ATTEMPTS} produced no hash for ${SYSTEM}; retrying in $((ATTEMPT * 10))s" | |
| sleep $((ATTEMPT * 10)) | |
| fi | |
| done | |
| if [ -z "$HASH" ]; then | |
| echo "::error::Failed to compute hash for ${SYSTEM} after ${MAX_ATTEMPTS} attempts" | |
| cat "$BUILD_LOG" | |
| exit 1 | |
| fi | |
| echo "$HASH" > hash.txt | |
| echo "Computed hash for ${SYSTEM}: $HASH" | |
| - name: Upload hash | |
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 | |
| with: | |
| name: hash-${{ matrix.system }} | |
| path: hash.txt | |
| retention-days: 1 | |
| update-hashes: | |
| needs: compute-hash | |
| if: github.event_name != 'pull_request' | |
| runs-on: blacksmith-4vcpu-ubuntu-2404 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 | |
| with: | |
| persist-credentials: false | |
| fetch-depth: 0 | |
| ref: ${{ github.ref_name }} | |
| - name: Setup git committer | |
| uses: ./.github/actions/setup-git-committer | |
| with: | |
| opencode-app-id: ${{ vars.OPENCODE_APP_ID }} | |
| opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }} | |
| - name: Pull latest changes | |
| run: | | |
| git pull --rebase --autostash origin "$GITHUB_REF_NAME" | |
| - name: Download hash artifacts | |
| uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 | |
| with: | |
| path: hashes | |
| pattern: hash-* | |
| - name: Update hashes.json | |
| run: | | |
| set -euo pipefail | |
| HASH_FILE="nix/hashes.json" | |
| [ -f "$HASH_FILE" ] || echo '{"nodeModules":{}}' > "$HASH_FILE" | |
| for SYSTEM in x86_64-linux aarch64-linux x86_64-darwin aarch64-darwin; do | |
| FILE="hashes/hash-${SYSTEM}/hash.txt" | |
| if [ -f "$FILE" ]; then | |
| HASH="$(tr -d '[:space:]' < "$FILE")" | |
| echo "${SYSTEM}: ${HASH}" | |
| jq --arg sys "$SYSTEM" --arg h "$HASH" '.nodeModules[$sys] = $h' "$HASH_FILE" > tmp.json | |
| mv tmp.json "$HASH_FILE" | |
| else | |
| echo "::warning::Missing hash for ${SYSTEM}" | |
| fi | |
| done | |
| cat "$HASH_FILE" | |
| - name: Commit changes | |
| run: | | |
| set -euo pipefail | |
| HASH_FILE="nix/hashes.json" | |
| if [ -z "$(git status --short -- "$HASH_FILE")" ]; then | |
| echo "No changes to commit" | |
| echo "### Nix hashes" >> "$GITHUB_STEP_SUMMARY" | |
| echo "Status: no changes" >> "$GITHUB_STEP_SUMMARY" | |
| exit 0 | |
| fi | |
| git add "$HASH_FILE" | |
| git commit -m "chore: update nix node_modules hashes" | |
| git pull --rebase --autostash origin "$GITHUB_REF_NAME" | |
| git push origin HEAD:"$GITHUB_REF_NAME" | |
| echo "### Nix hashes" >> "$GITHUB_STEP_SUMMARY" | |
| echo "Status: committed $(git rev-parse --short HEAD)" >> "$GITHUB_STEP_SUMMARY" | |
Xet Storage Details
- Size:
- 5.08 kB
- Xet hash:
- ce4676f4772b3cb085eaabddfbe1332d116800b599d837051001853781e2b386
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.