From 4171ae651637764f4bd8ee92f06ec4f766ae2f84 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Fri, 26 Apr 2024 21:27:58 -0400 Subject: [PATCH] Update build scripts, action --- .github/workflows/build_test.yml | 53 +++++++++++++++++++++ publish-nix.sh | 77 ++++++++++++++++++++++++++++++ publish-win.ps1 | 81 +++++++++++++++++++++++++++++++- 3 files changed, 210 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/build_test.yml diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml new file mode 100644 index 00000000..b840160b --- /dev/null +++ b/.github/workflows/build_test.yml @@ -0,0 +1,53 @@ +name: Build Test + +on: + push: + branches: [ "main" ] + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + project: [Test] + runtime: [win-x86, win-x64, linux-x64, osx-x64] #[win-x86, win-x64, win-arm64, linux-x64, linux-arm64, osx-x64] + framework: [net8.0] #[net20, net35, net40, net452, net472, net48, netcoreapp3.1, net5.0, net6.0, net7.0, net8.0] + conf: [Release, Debug] + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: 8.0.x + + - name: Restore dependencies + run: dotnet restore + + - name: Build + run: dotnet publish ${{ matrix.project }}/${{ matrix.project }}.csproj -f ${{ matrix.framework }} -r ${{ matrix.runtime }} -c ${{ matrix.conf == 'Release' && 'Release -p:DebugType=None -p:DebugSymbols=false' || 'Debug'}} --self-contained true --version-suffix ${{ github.sha }} ${{ (startsWith(matrix.framework, 'net5') || startsWith(matrix.framework, 'net6') || startsWith(matrix.framework, 'net7') || startsWith(matrix.framework, 'net8')) && '-p:PublishSingleFile=true' || ''}} + + - name: Archive build + run: zip -r ${{ matrix.project }}_${{ matrix.framework }}_${{ matrix.runtime }}_${{ matrix.conf }}.zip ${{ matrix.project }}/bin/${{ matrix.conf }}/${{ matrix.framework }}/${{ matrix.runtime }}/publish/ + + - name: Upload build + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.project }}_${{ matrix.framework }}_${{ matrix.runtime }}_${{ matrix.conf }} + path: ${{ matrix.project }}_${{ matrix.framework }}_${{ matrix.runtime }}_${{ matrix.conf }}.zip + + - name: Upload to rolling + uses: ncipollo/release-action@v1.14.0 + with: + allowUpdates: True + artifacts: ${{ matrix.project }}_${{ matrix.framework }}_${{ matrix.runtime }}_${{ matrix.conf }}.zip + body: 'Last built commit: ${{ github.sha }}' + name: 'Rolling Release' + prerelease: True + replacesArtifacts: True + tag: "rolling" + updateOnlyUnreleased: True diff --git a/publish-nix.sh b/publish-nix.sh index 34a35f64..3a5a380b 100755 --- a/publish-nix.sh +++ b/publish-nix.sh @@ -2,18 +2,28 @@ # This batch file assumes the following: # - .NET 8.0 (or newer) SDK is installed and in PATH +# - zip is installed and in PATH +# - Git is installed and in PATH # # If any of these are not satisfied, the operation may fail # in an unpredictable way and result in an incomplete output. # Optional parameters +USE_ALL=false NO_BUILD=false +NO_ARCHIVE=false while getopts "uba" OPTION do case $OPTION in + u) + USE_ALL=true + ;; b) NO_BUILD=true ;; + a) + NO_ARCHIVE=true + ;; *) echo "Invalid option provided" exit 1 @@ -24,6 +34,25 @@ done # Set the current directory as a variable BUILD_FOLDER=$PWD +# Set the current commit hash +COMMIT=`git log --pretty=%H -1` + +# Create the build matrix arrays +FRAMEWORKS=("net8.0") +RUNTIMES=("win-x86" "win-x64" "linux-x64" "osx-x64") + +# Use expanded lists, if requested +if [ $USE_ALL = true ] +then + FRAMEWORKS=("net20" "net35" "net40" "net452" "net462" "net472" "net48" "netcoreapp3.1" "net5.0" "net6.0" "net7.0" "net8.0") + RUNTIMES=("win-x86" "win-x64" "win-arm64" "linux-x64" "linux-arm64" "osx-x64") +fi + +# Create the filter arrays +SINGLE_FILE_CAPABLE=("net5.0" "net6.0" "net7.0" "net8.0") +VALID_CROSS_PLATFORM_FRAMEWORKS=("netcoreapp3.1" "net5.0" "net6.0" "net7.0" "net8.0") +VALID_CROSS_PLATFORM_RUNTIMES=("win-arm64" "linux-x64" "linux-arm64" "osx-x64") + # Only build if requested if [ $NO_BUILD = false ] then @@ -33,4 +62,52 @@ then # Create Nuget Package dotnet pack SabreTools.Serialization/SabreTools.Serialization.csproj --output $BUILD_FOLDER + + # Build Test + for FRAMEWORK in "${FRAMEWORKS[@]}" + do + for RUNTIME in "${RUNTIMES[@]}" + do + # If we have an invalid combination of framework and runtime + if [ ! $(echo ${VALID_CROSS_PLATFORM_FRAMEWORKS[@]} | fgrep -w $FRAMEWORK) ] && [ $(echo ${VALID_CROSS_PLATFORM_RUNTIMES[@]} | fgrep -w $RUNTIME) ] + then + continue + fi + + # Only .NET 5 and above can publish to a single file + if [[ $(echo ${SINGLE_FILE_CAPABLE[@]} | fgrep -w $FRAMEWORK) ]] + then + dotnet publish Test/Test.csproj -f $FRAMEWORK -r $RUNTIME -c Debug --self-contained true --version-suffix $COMMIT -p:PublishSingleFile=true + dotnet publish Test/Test.csproj -f $FRAMEWORK -r $RUNTIME -c Release --self-contained true --version-suffix $COMMIT -p:PublishSingleFile=true -p:DebugType=None -p:DebugSymbols=false + else + dotnet publish Test/Test.csproj -f $FRAMEWORK -r $RUNTIME -c Debug --self-contained true --version-suffix $COMMIT + dotnet publish Test/Test.csproj -f $FRAMEWORK -r $RUNTIME -c Release --self-contained true --version-suffix $COMMIT -p:DebugType=None -p:DebugSymbols=false + fi + done + done +fi + +# Only create archives if requested +if [ $NO_ARCHIVE = false ] +then + # Create Test archives + for FRAMEWORK in "${FRAMEWORKS[@]}" + do + for RUNTIME in "${RUNTIMES[@]}" + do + # If we have an invalid combination of framework and runtime + if [ ! $(echo ${VALID_CROSS_PLATFORM_FRAMEWORKS[@]} | fgrep -w $FRAMEWORK) ] && [ $(echo ${VALID_CROSS_PLATFORM_RUNTIMES[@]} | fgrep -w $RUNTIME) ] + then + continue + fi + + cd $BUILD_FOLDER/Test/bin/Debug/${FRAMEWORK}/${RUNTIME}/publish/ + zip -r $BUILD_FOLDER/SabreTools.Serialization_${FRAMEWORK}_${RUNTIME}_debug.zip . + cd $BUILD_FOLDER/Test/bin/Release/${FRAMEWORK}/${RUNTIME}/publish/ + zip -r $BUILD_FOLDER/SabreTools.Serialization_${FRAMEWORK}_${RUNTIME}_release.zip . + done + done + + # Reset the directory + cd $BUILD_FOLDER fi \ No newline at end of file diff --git a/publish-win.ps1 b/publish-win.ps1 index cd8b9557..ee5051a2 100644 --- a/publish-win.ps1 +++ b/publish-win.ps1 @@ -1,19 +1,48 @@ # This batch file assumes the following: # - .NET 8.0 (or newer) SDK is installed and in PATH +# - 7-zip commandline (7z.exe) is installed and in PATH +# - Git for Windows is installed and in PATH # # If any of these are not satisfied, the operation may fail # in an unpredictable way and result in an incomplete output. # Optional parameters param( + [Parameter(Mandatory = $false)] + [Alias("UseAll")] + [switch]$USE_ALL, + [Parameter(Mandatory = $false)] [Alias("NoBuild")] - [switch]$NO_BUILD + [switch]$NO_BUILD, + + [Parameter(Mandatory = $false)] + [Alias("NoArchive")] + [switch]$NO_ARCHIVE ) # Set the current directory as a variable $BUILD_FOLDER = $PSScriptRoot +# Set the current commit hash +$COMMIT = git log --pretty=format:"%H" -1 + +# Create the build matrix arrays +$FRAMEWORKS = @('net8.0') +$RUNTIMES = @('win-x86', 'win-x64', 'linux-x64', 'osx-x64') + +# Use expanded lists, if requested +if ($USE_ALL.IsPresent) +{ + $FRAMEWORKS = @('net20', 'net35', 'net40', 'net452', 'net462', 'net472', 'net48', 'netcoreapp3.1', 'net5.0', 'net6.0', 'net7.0', 'net8.0') + $RUNTIMES = @('win-x86', 'win-x64', 'win-arm64', 'linux-x64', 'linux-arm64', 'osx-x64') +} + +# Create the filter arrays +$SINGLE_FILE_CAPABLE = @('net5.0', 'net6.0', 'net7.0', 'net8.0') +$VALID_CROSS_PLATFORM_FRAMEWORKS = @('netcoreapp3.1', 'net5.0', 'net6.0', 'net7.0', 'net8.0') +$VALID_CROSS_PLATFORM_RUNTIMES = @('win-arm64', 'linux-x64', 'linux-arm64', 'osx-x64') + # Only build if requested if (!$NO_BUILD.IsPresent) { @@ -23,4 +52,54 @@ if (!$NO_BUILD.IsPresent) # Create Nuget Package dotnet pack SabreTools.Serialization\SabreTools.Serialization.csproj --output $BUILD_FOLDER + + # Build Test + foreach ($FRAMEWORK in $FRAMEWORKS) + { + foreach ($RUNTIME in $RUNTIMES) + { + # If we have an invalid combination of framework and runtime + if ($VALID_CROSS_PLATFORM_FRAMEWORKS -notcontains $FRAMEWORK -and $VALID_CROSS_PLATFORM_RUNTIMES -contains $RUNTIME) + { + continue + } + + # Only .NET 5 and above can publish to a single file + if ($SINGLE_FILE_CAPABLE -contains $FRAMEWORK) + { + dotnet publish Test\Test.csproj -f $FRAMEWORK -r $RUNTIME -c Debug --self-contained true --version-suffix $COMMIT -p:PublishSingleFile=true + dotnet publish Test\Test.csproj -f $FRAMEWORK -r $RUNTIME -c Release --self-contained true --version-suffix $COMMIT -p:PublishSingleFile=true -p:DebugType=None -p:DebugSymbols=false + } + else + { + dotnet publish Test\Test.csproj -f $FRAMEWORK -r $RUNTIME -c Debug --self-contained true --version-suffix $COMMIT + dotnet publish Test\Test.csproj -f $FRAMEWORK -r $RUNTIME -c Release --self-contained true --version-suffix $COMMIT -p:DebugType=None -p:DebugSymbols=false + } + } + } +} + +# Only create archives if requested +if (!$NO_ARCHIVE.IsPresent) +{ + # Create Test archives + foreach ($FRAMEWORK in $FRAMEWORKS) + { + foreach ($RUNTIME in $RUNTIMES) + { + # If we have an invalid combination of framework and runtime + if ($VALID_CROSS_PLATFORM_FRAMEWORKS -notcontains $FRAMEWORK -and $VALID_CROSS_PLATFORM_RUNTIMES -contains $RUNTIME) + { + continue + } + + Set-Location -Path $BUILD_FOLDER\Test\bin\Debug\${FRAMEWORK}\${RUNTIME}\publish\ + 7z a -tzip $BUILD_FOLDER\SabreTools.Serialization_${FRAMEWORK}_${RUNTIME}_debug.zip * + Set-Location -Path $BUILD_FOLDER\Test\bin\Release\${FRAMEWORK}\${RUNTIME}\publish\ + 7z a -tzip $BUILD_FOLDER\SabreTools.Serialization_${FRAMEWORK}_${RUNTIME}_release.zip * + } + } + + # Reset the directory + Set-Location -Path $PSScriptRoot }