From 77bf668fdd4b4fa66f2e8bee464ba5400fb2b357 Mon Sep 17 00:00:00 2001 From: vicenteyu Date: Thu, 26 Oct 2023 10:16:37 +0800 Subject: [PATCH] Create build.yml --- .github/workflows/build.yml | 161 ++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..c1ad64a0 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,161 @@ +name: build + +on: + push: + branches: [ dev*, rel/* ] + tags: [ '*' ] + pull_request: + branches: [ dev*, rel/* ] + workflow_dispatch: + +env: + DOTNET_MULTILEVEL_LOOKUP: 0 + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 + DOTNET_SYSTEM_CONSOLE_ALLOW_ANSI_COLOR_REDIRECTION: 1 + NUGET_XMLDOC_MODE: skip + TERM: xterm + +permissions: + contents: read + +jobs: + build: + name: ${{ matrix.os }} + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + os: [ macos-latest, ubuntu-latest, windows-latest ] + include: + - os: macos-latest + os_name: macos + - os: ubuntu-latest + os_name: linux + - os: windows-latest + os_name: windows + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup NuGet + uses: nuget/setup-nuget@v1 + with: + nuget-version: '5.11.0' + + # Arcade only allows the revision to contain up to two characters, and GitHub Actions does not roll-over + # build numbers every day like Azure DevOps does. To balance these two requirements, set the official + # build ID to be the same format as the built-in default from Arcade, except with the revision number + # being the number of the quarter hour of the current time of day (24 * 4 = 96, which is less than 100). + # So a build between 00:00 and 00:14 would have a revision of 1, and a build between 23:45 and 23:59:59 + # would have a revision of 97. + - name: Set Build ID + if: ${{ startsWith(github.ref, 'refs/pull/') == false }} + shell: pwsh + run: | + $Now = (Get-Date).ToUniversalTime() + $Hours = $Now.Hour * 4 + $QuarterHours = [Math]::Floor($Now.Minute / 15.0) + $Revision = $Hours + $QuarterHours + 1 + $BuildId = $Now.ToString("yyyyMMdd") + "." + $Revision + Write-Output "_AspNetContribBuildNumber=${BuildId}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + + - name: Build, Test and Package + if: ${{ runner.os == 'Windows' }} + run: eng\common\CIBuild.cmd -configuration Release -prepareMachine + + - name: Build, Test and Package + shell: pwsh + if: ${{ runner.os != 'Windows' }} + run: ./eng/common/cibuild.sh -configuration Release -prepareMachine + + - name: Publish logs + uses: actions/upload-artifact@v3 + if: ${{ always() }} + with: + name: logs-${{ matrix.os_name }} + path: ./artifacts/log/Release + + - name: Publish NuGet packages + uses: actions/upload-artifact@v3 + with: + name: packages-${{ matrix.os_name }} + path: ./artifacts/packages/Release/Shipping + + - name: Publish test results + uses: actions/upload-artifact@v3 + if: ${{ always() }} + with: + name: testresults-${{ matrix.os_name }} + path: ./artifacts/TestResults/Release + + validate-packages: + needs: build + runs-on: ubuntu-latest + steps: + + - name: Download packages + uses: actions/download-artifact@v3 + with: + name: packages-windows + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v3 + + - name: Validate NuGet packages + shell: pwsh + run: | + dotnet tool install --global dotnet-validate --version 0.0.1-preview.304 + $packages = Get-ChildItem -Filter "*.nupkg" | ForEach-Object { $_.FullName } + $invalidPackages = 0 + foreach ($package in $packages) { + dotnet validate package local $package + if ($LASTEXITCODE -ne 0) { + $invalidPackages++ + } + } + if ($invalidPackages -gt 0) { + Write-Output "::error::$invalidPackages NuGet package(s) failed validation." + } + + publish-myget: + needs: validate-packages + runs-on: ubuntu-latest + if: | + github.event.repository.fork == false && + (github.ref == format('refs/heads/{0}', github.event.repository.default_branch) || + startsWith(github.ref, 'refs/heads/dev') || + startsWith(github.ref, 'refs/heads/rel/') || + startsWith(github.ref, 'refs/tags/')) + steps: + + - name: Download packages + uses: actions/download-artifact@v3 + with: + name: packages-windows + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v3 + + - name: Push NuGet packages to aspnet-contrib MyGet + run: nuget push "*.nupkg" -ApiKey ${{ secrets.MYGET_API_KEY }} -SkipDuplicate -Source https://www.myget.org/F/aspnet-contrib/api/v3/index.json + + publish-nuget: + needs: validate-packages + runs-on: ubuntu-latest + if: | + github.event.repository.fork == false && + startsWith(github.ref, 'refs/tags/') + steps: + + - name: Download packages + uses: actions/download-artifact@v3 + with: + name: packages-windows + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v3 + + - name: Push NuGet packages to NuGet.org + run: nuget push "*.nupkg" -ApiKey ${{ secrets.NUGET_API_KEY }} -SkipDuplicate -Source https://api.nuget.org/v3/index.json