name: CodeCoverage on: schedule: # 2AM every Tuesday/Thursday - cron: "0 2 * * 2,4" jobs: Build: strategy: matrix: options: - os: ubuntu-latest framework: net8.0 runtime: -x64 codecov: true runs-on: ${{ matrix.options.os }} steps: - name: Install libgdi+, which is required for tests running on ubuntu if: ${{ contains(matrix.options.os, 'ubuntu') }} run: | sudo apt-get update sudo apt-get -y install libgdiplus libgif-dev libglib2.0-dev libcairo2-dev libtiff-dev libexif-dev - name: Git Config shell: bash run: | git config --global core.autocrlf false git config --global core.longpaths true - name: Git Checkout uses: actions/checkout@v4 with: fetch-depth: 0 submodules: recursive # Deterministic list of LFS object IDs, then compute a portable key: # - `git lfs ls-files -l` lists all tracked LFS objects with their SHA-256 # - `awk '{print $1}'` extracts just the SHA field # - `sort` sorts in byte order (hex hashes sort the same everywhere) # This ensures the file content is identical regardless of OS or locale - name: Git Create LFS id list shell: bash run: git lfs ls-files -l | awk '{print $1}' | sort > .lfs-assets-id - name: Git Setup LFS Cache uses: actions/cache@v4 id: lfs-cache with: path: .git/lfs key: lfs-${{ hashFiles('.lfs-assets-id') }}-v1 - name: Git Pull LFS run: git lfs pull - name: NuGet Install uses: NuGet/setup-nuget@v2 - name: NuGet Setup Cache uses: actions/cache@v4 id: nuget-cache with: path: ~/.nuget key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props', '**/*.targets') }} restore-keys: ${{ runner.os }}-nuget- - name: DotNet Setup uses: actions/setup-dotnet@v4 with: dotnet-version: | 8.0.x - name: DotNet Build shell: pwsh run: ./ci-build.ps1 "${{ matrix.options.framework }}" env: SIXLABORS_TESTING: True - name: DotNet Test shell: pwsh run: ./ci-test.ps1 "${{ matrix.options.os }}" "${{ matrix.options.framework }}" "${{ matrix.options.runtime }}" "${{ matrix.options.codecov }}" env: SIXLABORS_TESTING: True XUNIT_PATH: .\tests\ImageSharp.Tests # Required for xunit - name: Export Failed Output uses: actions/upload-artifact@v4 if: failure() with: name: actual_output_${{ runner.os }}_${{ matrix.options.framework }}${{ matrix.options.runtime }}.zip path: tests/Images/ActualOutput/ - name: Codecov Update uses: codecov/codecov-action@v5 if: matrix.options.codecov == true && startsWith(github.repository, 'SixLabors') with: flags: unittests token: ${{ secrets.CODECOV_TOKEN }}