summaryrefslogtreecommitdiffhomepage
path: root/.github/workflows/nix-hashes.yml
blob: 6b5b3929adcbf8360ae7021ab9d1492d39c4e34d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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@v6

      - name: Setup Nix
        uses: nixbuild/nix-quick-install-action@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

          # 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

          # Extract hash from build log with portability
          HASH="$(nix run --inputs-from . nixpkgs#gnugrep -- -oP 'got:\s*\Ksha256-[A-Za-z0-9+/=]+' "$BUILD_LOG" | tail -n1 || true)"

          if [ -z "$HASH" ]; then
            echo "::error::Failed to compute hash for ${SYSTEM}"
            cat "$BUILD_LOG"
            exit 1
          fi

          echo "$HASH" > hash.txt
          echo "Computed hash for ${SYSTEM}: $HASH"

      - name: Upload hash
        uses: actions/upload-artifact@v4
        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@v4
        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@v4
        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"