Skip to content

[feature] Add extensible CI/CD pipeline with multi-OS support #21

[feature] Add extensible CI/CD pipeline with multi-OS support

[feature] Add extensible CI/CD pipeline with multi-OS support #21

name: Pipeline PR push
on:
pull_request:
env:
TEST_PROJECTS: |
tests/ByteSync.Client.IntegrationTests/ByteSync.Client.IntegrationTests.csproj
tests/ByteSync.Client.Tests/ByteSync.Client.Tests.csproj
tests/ByteSync.Common.Tests/ByteSync.Common.Tests.csproj
tests/ByteSync.Functions.IntegrationTests/ByteSync.Functions.IntegrationTests.csproj
tests/ByteSync.Functions.UnitTests/ByteSync.Functions.UnitTests.csproj
tests/ByteSync.ServerCommon.Tests/ByteSync.ServerCommon.Tests.csproj
tests/ByteSync.TestsCommon/ByteSync.TestsCommon.csproj
jobs:
# === LINUX ===
build-linux:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Setup .NET 8 Environment
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Create Config Files
shell: bash
run: |
echo '${{ secrets.CLIENT_LOCAL_SETTINGS_JSON }}' > src/ByteSync.Client/local.settings.json
echo '${{ secrets.FUNCTIONS_INTEGRATION_TESTS_LOCAL_SETTINGS_JSON }}' > tests/ByteSync.Functions.IntegrationTests/functions-integration-tests.local.settings.json
echo '${{ secrets.SERVER_COMMON_TESTS_LOCAL_SETTINGS }}' > tests/ByteSync.ServerCommon.Tests/server-common-tests.local.settings.json
- run: dotnet restore --locked-mode
- run: dotnet clean --verbosity quiet
- run: dotnet build --verbosity quiet /property:WarningLevel=0
- name: Upload Build Artifacts
uses: actions/upload-artifact@v4
with:
name: build-artifacts-linux
path: |
**/bin/
**/obj/
test-linux:
needs: build-linux
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup .NET 8 Environment
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- run: dotnet restore --locked-mode
- name: Download Build Artifacts
uses: actions/download-artifact@v4
with:
name: build-artifacts-linux
- name: Run Tests
run: |
echo "$TEST_PROJECTS" | while IFS= read -r project; do
if [ -n "$project" ]; then
echo "Running test project: $project"
safe_name=$(basename "$project" .csproj)
dotnet test "$project" --no-restore --no-build --logger "trx;LogFileName=$safe_name.trx" --results-directory ./TestResults
fi
done
shell: bash
- name: Upload Test Results
uses: actions/upload-artifact@v4
with:
name: PR-test-results-linux
path: ./TestResults/
- name: Show Failed Tests
if: failure()
run: echo "Some tests failed. Check uploaded artifacts for detailed logs."
build-mac:
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Setup .NET 8 Environment
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Create config files
shell: bash
run: |
echo '${{ secrets.CLIENT_LOCAL_SETTINGS_JSON }}' > src/ByteSync.Client/local.settings.json
echo '${{ secrets.FUNCTIONS_INTEGRATION_TESTS_LOCAL_SETTINGS_JSON }}' > tests/ByteSync.Functions.IntegrationTests/functions-integration-tests.local.settings.json
echo '${{ secrets.SERVER_COMMON_TESTS_LOCAL_SETTINGS }}' > tests/ByteSync.ServerCommon.Tests/server-common-tests.local.settings.json
- run: dotnet restore --locked-mode
- run: dotnet clean --verbosity quiet
- run: dotnet build --verbosity quiet /property:WarningLevel=0
- name: Upload Build Artifacts
uses: actions/upload-artifact@v4
with:
name: build-artifacts-mac
path: |
**/bin/
**/obj/
test-mac:
needs: build-mac
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup .NET 8 Environment
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- run: dotnet restore --locked-mode
- name: Download Build Artifacts
uses: actions/download-artifact@v4
with:
name: build-artifacts-mac
- name: Run Tests
run: |
echo "$TEST_PROJECTS" | while IFS= read -r project; do
if [ -n "$project" ]; then
echo "Running test project: $project"
safe_name=$(basename "$project" .csproj)
dotnet test "$project" --no-restore --no-build --logger "trx;LogFileName=$safe_name.trx" --results-directory ./TestResults
fi
done
shell: bash
- name: Upload Test Results
uses: actions/upload-artifact@v4
with:
name: PR-test-results-mac
path: ./TestResults/*.trx
- name: Show Failed Tests
if: failure()
run: echo "Some tests failed. Check uploaded artifacts for detailed logs."
build-win:
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: C:\Users\runneradmin\.nuget\packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Setup .NET 8 Environment
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Create Config Files
shell: bash
run: |
echo '${{ secrets.CLIENT_LOCAL_SETTINGS_JSON }}' > src/ByteSync.Client/local.settings.json
echo '${{ secrets.FUNCTIONS_INTEGRATION_TESTS_LOCAL_SETTINGS_JSON }}' > tests/ByteSync.Functions.IntegrationTests/functions-integration-tests.local.settings.json
echo '${{ secrets.SERVER_COMMON_TESTS_LOCAL_SETTINGS }}' > tests/ByteSync.ServerCommon.Tests/server-common-tests.local.settings.json
- run: dotnet restore --locked-mode
- run: dotnet clean --verbosity quiet
- run: dotnet build --verbosity quiet /property:WarningLevel=0
- name: Upload Build Artifacts
uses: actions/upload-artifact@v4
with:
name: build-artifacts-windows
path: |
**/bin/
**/obj/
test-win:
needs: build-win
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup .NET 8 Environment
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- run: dotnet restore --locked-mode
- name: Download Build Artifacts
uses: actions/download-artifact@v4
with:
name: build-artifacts-windows
- name: Run Tests
run: |
echo "$TEST_PROJECTS" | while IFS= read -r project; do
if [ -n "$project" ]; then
echo "Running test project: $project"
safe_name=$(basename "$project" .csproj)
dotnet test "$project" --no-restore --no-build --logger "trx;LogFileName=$safe_name.trx" --results-directory ./TestResults
fi
done
shell: bash
- name: Upload Test Results
uses: actions/upload-artifact@v4
with:
name: PR-test-results-win
path: ./TestResults/*.trx
- name: Show Failed Tests
if: failure()
run: echo "Some tests failed. Check uploaded artifacts for detailed logs."