From fbf71990c9ca8ee89f3c09b67cd684d1f7fe179e Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 9 Mar 2025 17:17:07 -0700 Subject: [PATCH] Use separate workflows for regular build and entropy builds (#1405) * Experiment with separate workflows * Fix * Fix * Fix * Fix * Fix * Add compare to verify * Add space * Update * Test compare workflow * Test * Cancel naming * Cancel * Remove space * Fixes * fix typo --- .github/workflows/build.yml | 144 ++------------------------ .github/workflows/compare.yml | 190 ++++++++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+), 135 deletions(-) create mode 100644 .github/workflows/compare.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 245009a663..982d946810 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,10 +2,6 @@ name: Build on: [push, pull_request] -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - jobs: fetch-deps: name: Download original binaries @@ -104,104 +100,9 @@ jobs: build/LEGO1.DLL build/LEGO1.PDB - build-with-entropy: - name: 'MSVC 4.20 with entropy' - needs: [fetch-deps] - runs-on: windows-latest - strategy: - matrix: - instance: [0, 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] - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - - uses: actions/checkout@v4 - with: - repository: itsmattkc/msvc420 - path: msvc420 - - - name: Setup cmake - uses: jwlawson/actions-setup-cmake@v2 - with: - # Use minimum supported version - cmake-version: '3.15.x' - - - name: Patch MSVC 4.2 - run: | - tools/patch_c2.py msvc420/bin/C2.EXE - - - name: Generate Entropy - shell: bash - run: | - # Get the first 8 characters of the SHA (enough for a decent seed) - SHA_PREFIX=$(echo "${{ github.sha }}" | cut -c 1-8) - ENTROPY_SEED=$((16#$SHA_PREFIX + ${{ matrix.instance }})) - - echo "Using seed: $ENTROPY_SEED" - python3 tools/entropy.py $ENTROPY_SEED > entropy.h - - - name: Build - shell: cmd - run: | - call .\msvc420\bin\VCVARS32.BAT x86 - cmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo -DISLE_INCLUDE_ENTROPY=ON -G "NMake Makefiles" - cmake --build build - - - name: Restore cached original binaries - id: cache-original-binaries - uses: actions/cache/restore@v4 - with: - enableCrossOsArchive: true - path: legobin - key: legobin - - - name: Install python packages - shell: bash - run: | - pip install -r tools/requirements.txt - - - name: Detect binaries - run: | - reccmp-project detect --what original --search-path legobin - reccmp-project detect --what recompiled --search-path build - - - name: Summarize Accuracy - shell: bash - run: | - reccmp-reccmp --target CONFIG --json CONFIGPROGRESS.json - reccmp-reccmp --target ISLE --json ISLEPROGRESS.json - reccmp-reccmp --target LEGO1 --json LEGO1PROGRESS.json - - - name: Upload Artifact - uses: actions/upload-artifact@main - with: - name: Win32-Entropy-${{ matrix.instance }} - path: | - CONFIGPROGRESS.json - ISLEPROGRESS.json - LEGO1PROGRESS.json - - merge-entropy-artifacts: - name: 'Merge entropy artifacts' - runs-on: ubuntu-latest - needs: build-with-entropy - steps: - - name: Merge Artifacts - uses: actions/upload-artifact/merge@v4 - with: - name: Win32-Entropy - pattern: Win32-Entropy-* - separate-directories: true - - compare: - name: Compare with master - needs: [build, merge-entropy-artifacts, fetch-deps] + verify: + name: Verify decomp + needs: [build, fetch-deps] runs-on: windows-latest steps: - uses: actions/checkout@main @@ -212,13 +113,8 @@ jobs: - uses: actions/download-artifact@main with: - name: Win32 - path: build - - - uses: actions/download-artifact@main - with: - name: Win32-Entropy - path: build-entropy + name: Win32 + path: build - name: Restore cached original binaries id: cache-original-binaries @@ -260,28 +156,6 @@ jobs: reccmp-reccmp --target ISLE --diff ISLEPROGRESS-old.json || echo "Current master not found" reccmp-reccmp --target LEGO1 --diff LEGO1PROGRESS-old.json || echo "Current master not found" - - name: Aggregate Accuracy - shell: bash - run: | - reccmp-aggregate --samples $(find build-entropy -type f -name "CONFIGPROGRESS.json") --output CONFIGPROGRESS-agg.json --html CONFIGPROGRESS-agg.html - reccmp-aggregate --samples $(find build-entropy -type f -name "ISLEPROGRESS.json") --output ISLEPROGRESS-agg.json --html ISLEPROGRESS-agg.html - reccmp-aggregate --samples $(find build-entropy -type f -name "LEGO1PROGRESS.json") --output LEGO1PROGRESS-agg.json --html LEGO1PROGRESS-agg.html - - - name: Compare Aggregate Accuracy With Current Master - shell: bash - env: - RELEASE_URL: https://github.com/isledecomp/isle/releases/download/continuous - run: | - # Download the current master state - curl -fLSs -o CONFIGPROGRESS-agg-old.json $RELEASE_URL/CONFIGPROGRESS-agg.json || echo "" >CONFIGPROGRESS-agg-old.json - curl -fLSs -o ISLEPROGRESS-agg-old.json $RELEASE_URL/ISLEPROGRESS-agg.json || echo "" >ISLEPROGRESS-agg-old.json - curl -fLSs -o LEGO1PROGRESS-agg-old.json $RELEASE_URL/LEGO1PROGRESS-agg.json || echo "" >LEGO1PROGRESS-agg-old.json - - # Compare with current master - reccmp-aggregate --diff CONFIGPROGRESS-agg-old.json CONFIGPROGRESS-agg.json || echo "Current master not found" - reccmp-aggregate --diff ISLEPROGRESS-agg-old.json ISLEPROGRESS-agg.json || echo "Current master not found" - reccmp-aggregate --diff LEGO1PROGRESS-agg-old.json LEGO1PROGRESS-agg.json || echo "Current master not found" - - name: Test Exports shell: bash run: | @@ -297,9 +171,9 @@ jobs: - name: Check Variables shell: bash run: | - reccmp-datacmp --target CONFIG - reccmp-datacmp --target ISLE - reccmp-datacmp --target LEGO1 + reccmp-datacmp --target CONFIG + reccmp-datacmp --target ISLE + reccmp-datacmp --target LEGO1 - name: Upload Artifact uses: actions/upload-artifact@main @@ -312,7 +186,7 @@ jobs: upload: name: Upload artifacts - needs: [build, compare] + needs: [verify] runs-on: ubuntu-latest if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'isledecomp/isle' }} steps: diff --git a/.github/workflows/compare.yml b/.github/workflows/compare.yml new file mode 100644 index 0000000000..615fd9fe78 --- /dev/null +++ b/.github/workflows/compare.yml @@ -0,0 +1,190 @@ +name: Compare + +on: + push: + branches: + - master + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + fetch-deps: + name: Download original binaries + uses: ./.github/workflows/legobin.yml + + build: + name: 'MSVC 4.20' + needs: [fetch-deps] + runs-on: windows-latest + strategy: + matrix: + high: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] + low: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - uses: actions/checkout@v4 + with: + repository: itsmattkc/msvc420 + path: msvc420 + + - name: Setup cmake + uses: jwlawson/actions-setup-cmake@v2 + with: + # Use minimum supported version + cmake-version: '3.15.x' + + - name: Patch MSVC 4.2 + run: | + tools/patch_c2.py msvc420/bin/C2.EXE + + - name: Generate Entropy + shell: bash + run: | + # Calculate instance number based on matrix inputs + INSTANCE=$((${{ matrix.high }} << 4 | ${{ matrix.low }})) + + # Get the first 8 characters of the SHA (enough for a decent seed) + SHA_PREFIX=$(echo "${{ github.sha }}" | cut -c 1-8) + ENTROPY_SEED=$((16#$SHA_PREFIX + $INSTANCE)) + + echo "Using seed: $ENTROPY_SEED (instance $INSTANCE)" + python3 tools/entropy.py $ENTROPY_SEED > entropy.h + + - name: Build + shell: cmd + run: | + call .\msvc420\bin\VCVARS32.BAT x86 + cmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo -DISLE_INCLUDE_ENTROPY=ON -G "NMake Makefiles" + cmake --build build + + - name: Restore cached original binaries + id: cache-original-binaries + uses: actions/cache/restore@v4 + with: + enableCrossOsArchive: true + path: legobin + key: legobin + + - name: Install python packages + shell: bash + run: | + pip install -r tools/requirements.txt + + - name: Detect binaries + run: | + reccmp-project detect --what original --search-path legobin + reccmp-project detect --what recompiled --search-path build + + - name: Summarize Accuracy + shell: bash + run: | + reccmp-reccmp --target CONFIG --json CONFIGPROGRESS.json + reccmp-reccmp --target ISLE --json ISLEPROGRESS.json + reccmp-reccmp --target LEGO1 --json LEGO1PROGRESS.json + + - name: Upload Artifact + uses: actions/upload-artifact@main + with: + name: Win32-Entropy-${{ matrix.high }}-${{ matrix.low }} + path: | + CONFIGPROGRESS.json + ISLEPROGRESS.json + LEGO1PROGRESS.json + + merge-artifacts: + name: 'Merge entropy artifacts' + runs-on: ubuntu-latest + needs: build + steps: + - name: Merge Artifacts + uses: actions/upload-artifact/merge@v4 + with: + name: Win32-Entropy + pattern: Win32-Entropy-* + separate-directories: true + + compare: + name: Compare with master + needs: [merge-artifacts] + runs-on: windows-latest + steps: + - uses: actions/checkout@main + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - uses: actions/download-artifact@main + with: + name: Win32-Entropy + path: build-entropy + + - name: Install python packages + shell: bash + run: | + pip install -r tools/requirements.txt + + - name: Aggregate Accuracy + shell: bash + run: | + reccmp-aggregate --samples $(find build-entropy -type f -name "CONFIGPROGRESS.json") --output CONFIGPROGRESS-agg.json --html CONFIGPROGRESS-agg.html + reccmp-aggregate --samples $(find build-entropy -type f -name "ISLEPROGRESS.json") --output ISLEPROGRESS-agg.json --html ISLEPROGRESS-agg.html + reccmp-aggregate --samples $(find build-entropy -type f -name "LEGO1PROGRESS.json") --output LEGO1PROGRESS-agg.json --html LEGO1PROGRESS-agg.html + + - name: Compare Aggregate Accuracy With Current Master + shell: bash + env: + RELEASE_URL: https://github.com/isledecomp/isle/releases/download/continuous-accuracy + run: | + # Download the current master state + curl -fLSs -o CONFIGPROGRESS-agg-old.json $RELEASE_URL/CONFIGPROGRESS-agg.json || echo "" >CONFIGPROGRESS-agg-old.json + curl -fLSs -o ISLEPROGRESS-agg-old.json $RELEASE_URL/ISLEPROGRESS-agg.json || echo "" >ISLEPROGRESS-agg-old.json + curl -fLSs -o LEGO1PROGRESS-agg-old.json $RELEASE_URL/LEGO1PROGRESS-agg.json || echo "" >LEGO1PROGRESS-agg-old.json + + # Compare with current master + reccmp-aggregate --diff CONFIGPROGRESS-agg-old.json CONFIGPROGRESS-agg.json || echo "Current master not found" + reccmp-aggregate --diff ISLEPROGRESS-agg-old.json ISLEPROGRESS-agg.json || echo "Current master not found" + reccmp-aggregate --diff LEGO1PROGRESS-agg-old.json LEGO1PROGRESS-agg.json || echo "Current master not found" + + - name: Upload Artifact + uses: actions/upload-artifact@main + with: + name: Accuracy Report + path: | + CONFIGPROGRESS* + ISLEPROGRESS* + LEGO1PROGRESS* + + upload: + name: Upload artifacts + needs: [compare] + runs-on: ubuntu-latest + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'isledecomp/isle' }} + steps: + - uses: actions/checkout@v4 + with: + repository: probonopd/uploadtool + + - uses: actions/download-artifact@main + with: + name: Accuracy Report + + - name: Upload Continuous Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + UPLOAD_KEY: ${{ secrets.UPLOAD_KEY }} + run: | + export UPLOADTOOL_SUFFIX=accuracy + ./upload.sh \ + CONFIGPROGRESS* \ + ISLEPROGRESS* \ + LEGO1PROGRESS*