name: CI
permissions: read-all

on:
  # For manual tests.
  workflow_dispatch:
  push:
    tags:
      - "*" # new tag version, like `0.8.4` or else
    branches:
      - master
  pull_request:
    branches:
      - master
  schedule:
    # Run daily at 4:45 A.M. to catch dependencies that break us.
    - cron: '45 4 * * *'

jobs:
  build-linux:
    permissions:
      contents: write
    outputs:
      digests-gcc: ${{ steps.hash-gcc.outputs.hashes }}
      digests-clang: ${{ steps.hash-clang.outputs.hashes }}
    name: Build Linux
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        cxx: [g++-13, clang++-18]
      fail-fast: false
    steps:
    - uses: actions/checkout@v6
    - name: cmake
      run: CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON -DFLATBUFFERS_STATIC_FLATC=ON .
    - name: build
      run: make -j
    - name: test
      run: ./flattests
    - name: make flatc executable
      run: |
        chmod +x flatc
        ./flatc --version
    - name: upload build artifacts
      uses: actions/upload-artifact@v4
      with:
        name: Linux flatc binary ${{ matrix.cxx }}
        path: flatc
    # Below if only for release.
    - name: Zip file
      if: startsWith(github.ref, 'refs/tags/')
      run: zip Linux.flatc.binary.${{ matrix.cxx }}.zip flatc
    - name: Release zip file
      uses: softprops/action-gh-release@v2
      if: startsWith(github.ref, 'refs/tags/')
      with:
        files: Linux.flatc.binary.${{ matrix.cxx }}.zip
    - name: Generate SLSA subjects - clang
      if: matrix.cxx == 'clang++-18' && startsWith(github.ref, 'refs/tags/')
      id: hash-clang
      run: echo "hashes=$(sha256sum Linux.flatc.binary.${{ matrix.cxx }}.zip | base64 -w0)" >> $GITHUB_OUTPUT
    - name: Generate SLSA subjects - gcc
      if: matrix.cxx == 'g++-13' && startsWith(github.ref, 'refs/tags/')
      id: hash-gcc
      run: echo "hashes=$(sha256sum Linux.flatc.binary.${{ matrix.cxx }}.zip | base64 -w0)" >> $GITHUB_OUTPUT

  build-linux-no-file-tests:
    name: Build Linux with -DFLATBUFFERS_NO_FILE_TESTS
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v6
    - name: cmake
      run: CXX=clang++-18 cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON -DFLATBUFFERS_CXX_FLAGS="-DFLATBUFFERS_NO_FILE_TESTS" .
    - name: build
      run: make -j
    - name: test
      run: ./flattests

  build-linux-out-of-source:
    name: Build Linux with out-of-source build location
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v6
    - name: make build directory
      run: mkdir build
    - name: cmake
      working-directory: build
      run: >
        CXX=clang++-18 cmake .. -G "Unix Makefiles" -DFLATBUFFERS_STRICT_MODE=ON
        -DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_CPP_STD=17
    - name: build
      working-directory: build
      run: make -j
    - name: test
      working-directory: build
      run: pwd && ./flattests
    - name: test C++17
      working-directory: build
      run: ./flattests_cpp17

  build-linux-cpp-std:
    name: Build Linux C++
    runs-on: ubuntu-24.04
    strategy:
      fail-fast: false
      matrix:
        std: [11, 14, 17, 20, 23]
        cxx: [g++-13, clang++-18]
        exclude:
          # Clang++15 10.3.0 stdlibc++ doesn't fully support std 23
          - cxx: clang++-18
            std: 23

    steps:
    - uses: actions/checkout@v6
    - name: cmake
      run: >
        CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles"
        -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON
        -DFLATBUFFERS_CPP_STD=${{ matrix.std }}
        -DFLATBUFFERS_BUILD_CPP17=${{ matrix.std >= 17 && 'On' || 'Off'}}
    - name: build
      run: make -j
    - name: test
      run: ./flattests
    - name: test C++17
      if: matrix.std >= 17
      run: ./flattests_cpp17

  build-cpp-std:
    name: Build Windows C++
    runs-on: windows-2022
    strategy:
      matrix:
        std: [11, 14, 17, 20, 23]
      fail-fast: false
    steps:
    - uses: actions/checkout@v6
    - name: Add msbuild to PATH
      uses: microsoft/setup-msbuild@v2
    - name: cmake
      run: >
        cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release
        -DFLATBUFFERS_STRICT_MODE=ON
        -DFLATBUFFERS_CPP_STD=${{ matrix.std }}
        -DFLATBUFFERS_BUILD_CPP17=${{ matrix.std >= 17 && 'On' || 'Off'}}
    - name: build
      run: msbuild.exe FlatBuffers.sln /p:Configuration=Release /p:Platform=x64
    - name: test
      run: Release\flattests.exe
    - name: test C++17
      if: matrix.std >= 17
      run: Release\flattests_cpp17.exe

  build-windows:
    permissions:
      contents: write
    outputs:
      digests: ${{ steps.hash.outputs.hashes }}
    name: Build Windows 2022
    runs-on: windows-2022
    steps:
    - uses: actions/checkout@v6
    - name: Add msbuild to PATH
      uses: microsoft/setup-msbuild@v2
    - name: cmake
      run: cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_STRICT_MODE=ON .
    - name: build
      run: msbuild.exe FlatBuffers.sln /p:Configuration=Release /p:Platform=x64
    - name: test
      run: Release\flattests.exe
    - name: upload build artifacts
      uses: actions/upload-artifact@v4
      with:
        name: Windows flatc binary
        path: Release\flatc.exe
    # Below if only for release.
    - name: Zip file
      if: startsWith(github.ref, 'refs/tags/')
      run: move Release/flatc.exe . && Compress-Archive flatc.exe Windows.flatc.binary.zip
    - name: Release binary
      uses: softprops/action-gh-release@v2
      if: startsWith(github.ref, 'refs/tags/')
      with:
        files: Windows.flatc.binary.zip
    - name: Generate SLSA subjects
      if: startsWith(github.ref, 'refs/tags/')
      id: hash
      shell: bash
      run: echo "hashes=$(sha256sum Windows.flatc.binary.zip | base64 -w0)" >> $GITHUB_OUTPUT

  build-dotnet-windows:
    name: Build .NET Windows
    runs-on: windows-2022-64core
    strategy:
      matrix:
        configuration: [
          '',
          '-p:UnsafeByteBuffer=true',
          # Fails two tests currently.
          #'-p:EnableSpanT=true,UnsafeByteBuffer=true'
          ]
    steps:
    - uses: actions/checkout@v6
    - name: Setup .NET Core SDK
      uses: actions/setup-dotnet@v5
      with:
        dotnet-version: '8.0.x'
    - name: Build
      run: |
        cd tests\FlatBuffers.Test
        dotnet new sln --force --name FlatBuffers.Test
        dotnet sln FlatBuffers.Test.sln add FlatBuffers.Test.csproj
        dotnet build -c Release ${{matrix.configuration}} FlatBuffers.Test.sln
    - name: Run net6.0
      run: |
        cd tests\FlatBuffers.Test\bin\Release\net6.0
        dir
        .\FlatBuffers.Test.exe
    - name: Run net8.0
      run: |
        cd tests\FlatBuffers.Test\bin\Release\net8.0
        .\FlatBuffers.Test.exe

  build-mac-intel:
    permissions:
      contents: write
    outputs:
      digests: ${{ steps.hash.outputs.hashes }}
    name: Build Mac (for Intel)
    runs-on: macos-15-intel
    steps:
    - uses: actions/checkout@v6
    - name: cmake
      run: cmake -G "Xcode" -DCMAKE_OSX_ARCHITECTURES="x86_64" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON .
    - name: build
      run: xcodebuild -toolchain clang -configuration Release -target flattests
    - name: check that the binary is x86_64
      run: |
        info=$(file Release/flatc)
        echo $info
        echo $info | grep "Mach-O 64-bit executable x86_64"
    - name: test
      run: Release/flattests
    - name: make flatc executable
      run: |
        chmod +x Release/flatc
        Release/flatc --version
    - name: upload build artifacts
      uses: actions/upload-artifact@v4
      with:
        name: Mac flatc binary Intel
        path: Release/flatc
    # Below if only for release.
    - name: Zip file
      if: startsWith(github.ref, 'refs/tags/')
      run: mv Release/flatc . && zip MacIntel.flatc.binary.zip flatc
    - name: Release binary
      uses: softprops/action-gh-release@v2
      if: startsWith(github.ref, 'refs/tags/')
      with:
        files: MacIntel.flatc.binary.zip
    - name: Generate SLSA subjects
      if: startsWith(github.ref, 'refs/tags/')
      id: hash
      run: echo "hashes=$(shasum -a 256 MacIntel.flatc.binary.zip | base64)" >> $GITHUB_OUTPUT

  build-mac-universal:
    permissions:
      contents: write
    outputs:
      digests: ${{ steps.hash.outputs.hashes }}
    name: Build Mac (universal build)
    runs-on: macos-latest
    steps:
    - uses: actions/checkout@v6
    - name: cmake
      run: cmake -G "Xcode" -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON .
    - name: build
      run: xcodebuild -toolchain clang -configuration Release -target flattests
    - name: check that the binary is "universal"
      run: |
        info=$(file Release/flatc)
        echo $info
        echo $info | grep "Mach-O universal binary with 2 architectures"
    - name: test
      run: Release/flattests
    - name: make flatc executable
      run: |
        chmod +x Release/flatc
        Release/flatc --version
    - name: upload build artifacts
      uses: actions/upload-artifact@v4
      with:
        name: Mac flatc binary Universal
        path: Release/flatc
    # Below if only for release.
    - name: Zip file
      if: startsWith(github.ref, 'refs/tags/')
      run: mv Release/flatc . && zip Mac.flatc.binary.zip flatc
    - name: Release binary
      uses: softprops/action-gh-release@v2
      if: startsWith(github.ref, 'refs/tags/')
      with:
        files: Mac.flatc.binary.zip
    - name: Generate SLSA subjects
      if: startsWith(github.ref, 'refs/tags/')
      id: hash
      run: echo "hashes=$(shasum -a 256 Mac.flatc.binary.zip | base64)" >> $GITHUB_OUTPUT

  build-android:
   name: Build Android (on Linux)
   if: false #disabled due to continual failure
   runs-on: ubuntu-24.04
   steps:
   - uses: actions/checkout@v6
   - name: set up Java
     uses: actions/setup-java@v4
     with:
       distribution: temurin
       java-version: 17
   - name: set up Gradle
     uses: gradle/actions/setup-gradle@v5
   - name: set up flatc
     run: |
       cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON .
       make -j
       echo "${PWD}" >> $GITHUB_PATH
   - name: build
     working-directory: android
     run: gradle clean build

  build-generator:
    name: Check Generated Code
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        cxx: [g++-13, clang++-18]
    steps:
    - uses: actions/checkout@v6
    - name: cmake
      run: CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles" -DFLATBUFFERS_BUILD_TESTS=OFF -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON . && make -j
    - name: Generate
      run: scripts/check_generate_code.py
    - name: Generate gRPC
      run: scripts/check-grpc-generated-code.py

  build-generator-windows:
    name: Check Generated Code on Windows
    runs-on: windows-2022
    steps:
    - uses: actions/checkout@v6
    - name: Add msbuild to PATH
      uses: microsoft/setup-msbuild@v2
    - name: cmake
      run: cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_CPP17=ON -DFLATBUFFERS_STRICT_MODE=ON .
    - name: build
      run: msbuild.exe FlatBuffers.sln /p:Configuration=Release /p:Platform=x64
    - name: Generate
      run: python3 scripts/check_generate_code.py --flatc Release\flatc.exe
    - name: Generate gRPC
      run: python3 scripts/check-grpc-generated-code.py --flatc Release\flatc.exe

  build-benchmarks:
    name: Build Benchmarks (on Linux)
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        cxx: [g++-13]
    steps:
    - uses: actions/checkout@v6
    - name: cmake
      run: CXX=${{ matrix.cxx }} cmake -G "Unix Makefiles" -DFLATBUFFERS_CXX_FLAGS="-Wno-unused-parameter -fno-aligned-new" -DFLATBUFFERS_BUILD_BENCHMARKS=ON -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_STRICT_MODE=ON . && make -j
    - name: Run benchmarks
      run: ./flatbenchmark --benchmark_repetitions=5 --benchmark_display_aggregates_only=true --benchmark_out_format=console --benchmark_out=benchmarks/results_${{matrix.cxx}}
    - name: Upload benchmarks results
      uses: actions/upload-artifact@v4
      with:
        name: Linux flatbenchmark results ${{matrix.cxx}}
        path: benchmarks/results_${{matrix.cxx}}

  build-java:
    name: Build Java
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v6
    - name: test
      working-directory: java
      run: mvn test

  build-kotlin-macos:
    name: Build Kotlin MacOS
    runs-on: macos-13
    steps:
    - name: Checkout
      uses: actions/checkout@v6
      # Force Xcode 14.3 since Xcode 15 doesnt support older versions of
      # kotlin. For Xcode 15, kotlin should be bumpped to 1.9.10
      # https://stackoverflow.com/a/77150623
      # For now, run with macos-13 which has this 14.3 installed:
      # https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md#xcode
    - name: Set up Xcode version
      run: sudo xcode-select -s /Applications/Xcode_14.3.app/Contents/Developer
    - name: set up Java
      uses: actions/setup-java@v4
      with:
        distribution: temurin
        java-version: 17
    - name: set up Gradle
      uses: gradle/actions/setup-gradle@v5
    - name: Build flatc
      run: |
       cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF .
       make -j
       echo "${PWD}" >> $GITHUB_PATH
    - name: Build
      working-directory: kotlin
      run: ./gradlew clean iosSimulatorArm64Test macosX64Test macosArm64Test

  build-kotlin-linux:
    name: Build Kotlin Linux
    if: false #disabled due to continual failure
    runs-on: ubuntu-24.04
    steps:
    - name: Checkout
      uses: actions/checkout@v6
    - name: set up Java
      uses: actions/setup-java@v4
      with:
        distribution: temurin
        java-version: 17
    - name: set up Gradle
      uses: gradle/actions/setup-gradle@v5
    - name: Build flatc
      run: |
       cmake -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF .
       make -j
       echo "${PWD}" >> $GITHUB_PATH
    - name: Build
      working-directory: kotlin
      # we are using docker's version of gradle
      # so no need for wrapper validation or user
      # gradlew
      run: gradle jvmMainClasses jvmTest jsTest jsBrowserTest

  build-rust-linux:
    name: Build Rust Linux
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v6
    - name: test
      working-directory: tests
      run: bash RustTest.sh

  build-rust-windows:
    name: Build Rust Windows
    runs-on: windows-2022-64core
    steps:
    - uses: actions/checkout@v6
    - name: test
      working-directory: tests
      run: ./RustTest.bat

  build-python:
    name: Build Python
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v6
    - name: flatc
      # FIXME: make test script not rely on flatc
      run: cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON . && make -j
    - name: test
      working-directory: tests
      run: bash PythonTest.sh

  build-go:
    name: Build Go
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v6
    - name: flatc
      # FIXME: make test script not rely on flatc
      run: cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON . && make -j
    - name: test
      working-directory: tests
      run: bash GoTest.sh

  build-php:
   name: Build PHP
   runs-on: ubuntu-24.04
   steps:
   - uses: actions/checkout@v6
   - name: flatc
     # FIXME: make test script not rely on flatc
     run: cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON . && make -j
   - name: test
     working-directory: tests
     run: |
       php phpTest.php
       sh phpUnionVectorTest.sh

  build-swift:
    name: Test Swift Linux
    strategy:
      matrix:
        swift: ["5.10", "6.1", "6.2"]
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v6
    - uses: swift-actions/setup-swift@v2
      with:
        swift-version: ${{ matrix.swift }}
    - name: Get swift version
      run: swift --version
    - name: test
      run: swift test

  build-swift-windows:
    name: Test swift windows
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v6
      - uses: SwiftyLab/setup-swift@latest
        with:
          swift-version: '6.1'
      - run: swift build
      - run: swift test

  build-swift-wasm:
    name: Test Swift Wasm
    runs-on: ubuntu-24.04
    steps:
       - uses: actions/checkout@v6
       - uses: swift-actions/setup-swift@v2
         with:
           swift-version: 6.2.1
       - uses: bytecodealliance/actions/wasmtime/setup@v1
       - name: Install Swift SDK
         run: swift sdk install https://download.swift.org/swift-6.2.1-release/wasm-sdk/swift-6.2.1-RELEASE/swift-6.2.1-RELEASE_wasm.artifactbundle.tar.gz --checksum 482b9f95462b87bedfafca94a092cf9ec4496671ca13b43745097122d20f18af
       - name: Test
         working-directory: tests/swift/Wasm.tests
         run: |
           swift sdk list
           swift build --build-tests --swift-sdk swift-6.2.1-RELEASE_wasm
           wasmtime --dir . .build/wasm32-unknown-wasip1/debug/FlatBuffers.Test.Swift.WasmPackageTests.xctest

  build-ts:
    name: Build TS
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v6
    - name: flatc
      # FIXME: make test script not rely on flatc
      run: cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF . && make -j
    - name: pnpm
      run: npm install -g pnpm esbuild
    - name: deps
      run: pnpm i
    - name: compile
      run: pnpm compile
    - name: test
      working-directory: tests/ts
      run: |
        python3 TypeScriptTest.py

  build-dart:
    name: Build Dart
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v6
      - uses: dart-lang/setup-dart@v1
        with:
          sdk: stable
      - name: flatc
        # FIXME: make test script not rely on flatc
        run: cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF -DFLATBUFFERS_STRICT_MODE=ON . && make -j
      - name: test
        working-directory: tests
        run: bash DartTest.sh

  build-nim:
    name: Build Nim
    runs-on: ubuntu-24.04
    steps:
    - uses: actions/checkout@v6
    - name: flatc
      # FIXME: make test script not rely on flatc
      run: cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DFLATBUFFERS_BUILD_TESTS=OFF -DFLATBUFFERS_INSTALL=OFF -DFLATBUFFERS_BUILD_FLATLIB=OFF -DFLATBUFFERS_BUILD_FLATHASH=OFF . && make -j
    - uses: jiro4989/setup-nim-action@v2
    - name: install library
      working-directory: nim
      run: nimble -y develop && nimble install
    - name: test
      working-directory: tests/nim
      run: python3 testnim.py

  bazel:
    name: Bazel
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v6
      - name: bazel build
        run: >
          bazel build
          //:flatc
          //:flatbuffers
      - name: bazel test
        run: >
          bazel test
          //tests:flatbuffers_test

  release-digests:
    if: startsWith(github.ref, 'refs/tags/')
    needs: [build-linux, build-windows, build-mac-intel, build-mac-universal]
    outputs:
      digests: ${{ steps.hash.outputs.digests }}
    runs-on: ubuntu-24.04
    steps:
      - name: Merge results
        id: hash
        env:
          LINUXGCC_DIGESTS: "${{ needs.build-linux.outputs.digests-gcc }}"
          LINUXCLANG_DIGESTS: "${{ needs.build-linux.outputs.digests-clang }}"
          MAC_DIGESTS: "${{ needs.build-mac-universal.outputs.digests }}"
          MACINTEL_DIGESTS: "${{ needs.build-mac-intel.outputs.digests }}"
          WINDOWS_DIGESTS: "${{ needs.build-windows.outputs.digests }}"
        run: |
          set -euo pipefail
          echo "$LINUXGCC_DIGESTS" | base64 -d > checksums.txt
          echo "$LINUXCLANG_DIGESTS" | base64 -d >> checksums.txt
          echo "$MAC_DIGESTS" | base64 -d >> checksums.txt
          echo "$MACINTEL_DIGESTS" | base64 -d >> checksums.txt
          echo "$WINDOWS_DIGESTS" | base64 -d >> checksums.txt
          echo "digests=$(cat checksums.txt | base64 -w0)" >> $GITHUB_OUTPUT

  provenance:
    if: startsWith(github.ref, 'refs/tags/')
    needs: [release-digests]
    permissions:
      actions: read   # To read the workflow path.
      id-token: write # To sign the provenance.
      contents: write # To add assets to a release.
    uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.2.1
    with:
      base64-subjects: "${{ needs.release-digests.outputs.digests }}"
      upload-assets: true # Optional: Upload to a new release
      compile-generator: true # Workaround for https://github.com/slsa-framework/slsa-github-generator/issues/1163
