WIP #229
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build | |
on: | |
push: | |
pull_request: | |
release: | |
types: [ published ] | |
jobs: | |
test: | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-20.04, macos-11.0, windows-latest] | |
include: | |
- os: windows-latest | |
pack: true | |
docs: true | |
dotnet: all | |
coverage: true | |
- os: ubuntu-latest | |
id: ubuntu-latest | |
runs-on: ${{matrix.os}} | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: actions/cache@v3 | |
id: cache | |
with: | |
path: ~/.nuget/packages | |
key: ${{ runner.os }}-nuget-breaker3-${{ hashFiles('**/packages.lock.json') }} | |
restore-keys: | | |
${{ runner.os }}-nuget- | |
- name: Check .NET versions available to see if we can skip installs | |
shell: bash | |
run: | | |
echo "DOTNET_VERSION_LIST<<EOF" >> $GITHUB_ENV | |
dotnet --list-sdks >> $GITHUB_ENV | |
echo "EOF" >> $GITHUB_ENV | |
- name: Setup .NET 6, 7, 8 | |
uses: actions/setup-dotnet@v3 | |
if: contains(env.DOTNET_VERSION_LIST, '6.0.') == 'false' || contains(env.DOTNET_VERSION_LIST, '7.0.') == 'false' || contains(env.DOTNET_VERSION_LIST, '8.0.') == 'false' | |
with: | |
dotnet-version: '${{ runner.dotnet }}' | |
- name: Setup .NET 4.8.1 if on windows | |
uses: actions/setup-dotnet@v3 | |
if: matrix.os == 'windows-latest' && contains(env.DOTNET_VERSION_LIST, '4.8.1') == 'false' | |
with: | |
dotnet-version: '4.8.1' | |
- uses: nowsprinting/check-version-format-action@v3 | |
id: version | |
with: | |
prefix: 'v' | |
- name: Set the release version (if applicable) - The source code depends on these | |
run: | | |
echo "TAGGED_VERSION=${{ steps.version.outputs.full_without_prefix }}" >> $GITHUB_ENV | |
echo "ARTIFACT_VERSION=${{ steps.version.outputs.full_without_prefix }}" >> $GITHUB_ENV | |
echo Set version to ${{ steps.version.outputs.full_without_prefix }} | |
shell: bash | |
if: steps.version.outputs.is_valid == 'true' && github.event_name == 'release' | |
# If ARTIFACT_VERSION is empty, then we're not on a release, so we'll use the commit hash | |
- name: Set the artifact version if not a release | |
run: | | |
echo "ARTIFACT_VERSION=commit-${{ github.sha }}" >> $GITHUB_ENV | |
echo Set ARTIFACT_VERSION to commit-${{ github.sha }} | |
shell: bash | |
if: steps.version.outputs.is_valid == 'false' || github.event_name != 'release' | |
- name: Clear & clean on release or cache miss | |
run: | | |
dotnet clean --configuration Release | |
dotnet nuget locals all --clear | |
if: steps.cache.outputs.cache-hit != 'true' || github.event_name == 'release' | |
- name: Restore packages | |
run: dotnet restore --force-evaluate | |
- name: Build all if on windows | |
run: dotnet build --maxcpucount:1 -c Release | |
if: matrix.os == 'windows-latest' | |
- name: Build for .NET 8, 6 | |
run: dotnet build --maxcpucount:1 -c Release --framework net6.0 net8.0 | |
if: matrix.os != 'windows-latest' | |
- name: Test .NET 6, 8 without Coverage | |
if: matrix.os != 'windows-latest' | |
run: | | |
dotnet test -c Release --framework net6.0 | |
dotnet test -c Release --framework net8.0 | |
- uses: actions/upload-artifact@v3 | |
if: failure() | |
with: | |
name: TestResults-${{matrix.os}}-${{ env.ARTIFACT_VERSION }} | |
path: TestResults/ | |
- name: Test .NET 8, 6, and 4.8.1 with Coverage | |
if: matrix.os == 'windows-latest' | |
run: | | |
dotnet test -c Release /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput=./TestResults/coverage.net48.opencover.xml --framework net48 | |
dotnet test -c Release /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput=./TestResults/coverage.net6.opencover.xml --framework net6.0 | |
dotnet test -c Release /p:CollectCoverage=true /p:CoverletOutputFormat=opencover /p:CoverletOutput=./TestResults/coverage.net8.opencover.xml --framework net8.0 | |
- name: Upload coverage to Codecov | |
uses: codecov/codecov-action@v3 | |
if: matrix.os == 'windows-latest' | |
with: | |
files: ./TestResults/coverage.**.opencover.xml | |
token: ${{ secrets.CODECOV_TOKEN }} # replace with your Codecov token | |
fail_ci_if_error: false | |
- uses: actions/upload-artifact@v3 | |
if: failure() | |
with: | |
name: TestResults-${{matrix.os}}-${{ env.ARTIFACT_VERSION }} | |
path: TestResults/ | |
- name: Pack | |
run: dotnet pack -c Release --include-source | |
if: matrix.pack | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v4 | |
id: nuget-artifact-upload-step | |
if: matrix.pack | |
with: | |
name: NuGetPackages | |
path: NuGetPackages/Release/*.nupkg | |
############################ We build the host for every OS, but only upload it for release ############################ | |
- name: Set the Imageflow.Server.Host zip file name | |
run: | | |
echo "HOST_ZIP_FILE=Imageflow.Server.Host-${{matrix.os}}-${{ env.ARTIFACT_VERSION }}.zip" >> $GITHUB_ENV | |
echo Set HOST_ZIP_FILE to ${{ env.HOST_ZIP_FILE }} | |
shell: bash | |
- name: Create Host App Folder | |
run: dotnet publish -c Release -o host/publish/ src/Imageflow.Server.Host/Imageflow.Server.Host.csproj --framework net8.0 | |
# Zip the contents of folder host/publish/ into host/Imageflow.Server.Host-${{matrix.os}}-${{ env.ARTIFACT_VERSION }}.zip | |
- name: Zip Server.Host | |
uses: thedoctor0/[email protected] | |
with: | |
type: 'zip' | |
directory: 'host/publish/' | |
filename: '../${{env.HOST_ZIP_FILE}}' | |
path: '.' | |
- name: Upload Imageflow.Server.Host to job | |
uses: actions/upload-artifact@v4 | |
id: host-upload-step | |
if: success() | |
with: | |
name: ${{env.HOST_ZIP_FILE}} | |
path: host/${{env.HOST_ZIP_FILE}} | |
# If this is a release, upload it to the github release page using the git | |
- name: Upload Imageflow.Server.Host to release | |
uses: Shopify/[email protected] | |
if: steps.version.outputs.is_valid == 'true' && github.event_name == 'release' | |
with: | |
name: ${{env.HOST_ZIP_FILE}} | |
path: host/${{env.HOST_ZIP_FILE}} | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
content-type: application/zip | |
- name: Install DocFX | |
run: dotnet tool install --global docfx | |
if: matrix.docs | |
- name: Generate Documentation | |
run: docfx src/DocFx/docfx.json --output docs | |
if: matrix.docs | |
- name: Upload documentation to job | |
id: docs-upload-step | |
uses: actions/upload-artifact@v4 | |
if: success() && matrix.docs | |
with: | |
name: Documentation | |
path: docs/ | |
outputs: | |
host_artifact-id: ${{ steps.host-upload-step.outputs.artifact_id }} | |
nuget_artifact-id: ${{ steps.nuget-artifact-upload-step.outputs.artifact_id }} | |
docs_artifact-id: ${{ steps.docs-upload-step.outputs.artifact_id }} | |
publish: | |
needs: test | |
if: github.event_name == 'release' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: nowsprinting/check-version-format-action@v3 | |
id: version | |
with: | |
prefix: 'v' | |
# Download nuget artifacts from the test job into a folder called NuGetPackages | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
if: steps.version.outputs.is_valid == 'true' && github.event_name == 'release' | |
with: | |
name: NuGetPackages | |
path: NuGetPackages | |
- name: Publish NuGet packages to Nuget.org | |
if: steps.version.outputs.is_valid == 'true' && github.event_name == 'release' | |
run: | | |
dotnet nuget push NuGetPackages/*.nupkg --skip-duplicate --api-key ${{ secrets.NUGET_API_KEY }} --source nuget.org | |
- name: Download Documentation | |
uses: actions/download-artifact@v4 | |
if: steps.version.outputs.is_valid == 'true' && github.event_name == 'release' | |
with: | |
name: Documentation | |
path: docs | |
- name: Deploy Documentation to GitHub Pages | |
uses: peaceiris/actions-gh-pages@v3 | |
with: | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
publish_dir: ./docs | |
dockerize_host: | |
needs: test | |
if: github.event_name == 'release' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: nowsprinting/check-version-format-action@v3 | |
id: version | |
with: | |
prefix: 'v' | |
# download artifact using the host artifact id from the test job, the ubuntu-latest matrix version | |
- name: Download Imageflow.Server.Host | |
uses: actions/download-artifact@v4 | |
if: steps.version.outputs.is_valid == 'true' && github.event_name == 'release' | |
with: | |
name: ${{ steps.test.outputs.host_artifact-id }} | |
path: host | |
# Create a docker image for the host and push, using the host artifact id from the test job, the ubuntu-latest matrix version | |
## Create a docker image for the host and push, using the host artifact id from the test job, the ubuntu-latest matrix version | |