name: main on: workflow_dispatch: push: branches: - master tags: - "*" pull_request: branches: - master env: DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true DOTNET_NOLOGO: true DOTNET_CLI_TELEMETRY_OPTOUT: true jobs: format: runs-on: ubuntu-latest timeout-minutes: 10 permissions: contents: read steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install .NET uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1 with: dotnet-version: 9.0.x # Build the project separately to discern between build and format errors - name: Build run: > dotnet build -p:CSharpier_Bypass=true --configuration Release - name: Verify formatting id: verify run: > dotnet build -t:CSharpierFormat --configuration Release --no-restore - name: Report issues if: ${{ failure() && steps.verify.outcome == 'failure' }} run: echo "::error title=Bad formatting::Formatting issues detected. Please build the solution locally to fix them." test: # Tests need access to secrets, so we can't run them against PRs because of limited trust if: ${{ github.event_name != 'pull_request' }} runs-on: ubuntu-latest timeout-minutes: 10 permissions: contents: read steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install .NET uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1 with: dotnet-version: 9.0.x - name: Run tests env: DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }} run: > dotnet test -p:CSharpier_Bypass=true --configuration Release --logger "GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true" --collect:"XPlat Code Coverage" -- RunConfiguration.CollectSourceInformation=true DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover - name: Upload coverage uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2 with: token: ${{ secrets.CODECOV_TOKEN }} pack: strategy: matrix: app: - DiscordChatExporter.Cli - DiscordChatExporter.Gui rid: - win-arm64 - win-x86 - win-x64 - linux-arm - linux-arm64 - linux-musl-x64 - linux-x64 - osx-arm64 - osx-x64 include: - app: DiscordChatExporter.Cli asset: DiscordChatExporter.Cli - app: DiscordChatExporter.Gui # GUI assets aren't suffixed, unlike the CLI assets asset: DiscordChatExporter runs-on: ${{ startsWith(matrix.rid, 'win-') && 'windows-latest' || startsWith(matrix.rid, 'osx-') && 'macos-latest' || 'ubuntu-latest' }} timeout-minutes: 10 permissions: actions: write contents: read steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Install .NET uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1 with: dotnet-version: 9.0.x - name: Publish app run: > dotnet publish ${{ matrix.app }} -p:Version=${{ github.ref_type == 'tag' && github.ref_name || format('999.9.9-ci-{0}', github.sha) }} -p:CSharpier_Bypass=true --output ${{ matrix.app }}/bin/publish/ --configuration Release --runtime ${{ matrix.rid }} --self-contained - name: Generate macOS .app bundle resources if: ${{ startsWith(matrix.rid, 'osx-') && matrix.app == 'DiscordChatExporter.Gui' }} shell: pwsh run: > ./bundle-macos-app.ps1 -BundleName "${{ matrix.asset }}" -PublishDir "${{ matrix.app }}/bin/publish/" -Version "${{ github.ref_type == 'tag' && github.ref_name || '999.9.9'}}" -GitHubSha "${{ github.sha }}" - name: Upload artifacts uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ matrix.asset }}.${{ matrix.rid }} path: ${{ matrix.app }}/bin/publish/ if-no-files-found: error release: if: ${{ github.ref_type == 'tag' }} needs: - format - test - pack runs-on: ubuntu-latest timeout-minutes: 10 permissions: contents: write steps: - name: Create release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: > gh release create ${{ github.ref_name }} --repo ${{ github.event.repository.full_name }} --title ${{ github.ref_name }} --generate-notes --verify-tag deploy: needs: release strategy: matrix: app: - DiscordChatExporter.Cli - DiscordChatExporter.Gui rid: - win-arm64 - win-x86 - win-x64 - linux-arm - linux-arm64 - linux-musl-x64 - linux-x64 - osx-arm64 - osx-x64 include: - app: DiscordChatExporter.Cli asset: DiscordChatExporter.Cli - app: DiscordChatExporter.Gui # GUI assets aren't suffixed, unlike the CLI assets asset: DiscordChatExporter runs-on: ubuntu-latest timeout-minutes: 10 permissions: actions: read contents: write steps: - name: Download artifacts uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: ${{ matrix.asset }}.${{ matrix.rid }} path: ${{ matrix.app }}/ - name: Set permissions if: ${{ !startsWith(matrix.rid, 'win-') && !(startsWith(matrix.rid, 'osx-') && matrix.app == 'DiscordChatExporter.Gui') }} run: chmod +x ${{ matrix.app }}/${{ matrix.asset }} - name: Set permissions for macOS .app bundle if: ${{ startsWith(matrix.rid, 'osx-') && matrix.app == 'DiscordChatExporter.Gui' }} run: chmod +x ${{ matrix.app }}/${{ matrix.asset }}.app/Contents/MacOS/${{ matrix.asset }} - name: Create package # Change into the artifacts directory to avoid including the directory itself in the zip archive working-directory: ${{ matrix.app }}/ run: zip -r ../${{ matrix.asset }}.${{ matrix.rid }}.zip . - name: Upload release asset env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: > gh release upload ${{ github.ref_name }} ${{ matrix.asset }}.${{ matrix.rid }}.zip --repo ${{ github.event.repository.full_name }} notify: needs: deploy runs-on: ubuntu-latest timeout-minutes: 10 permissions: contents: read steps: - name: Notify Discord uses: tyrrrz/action-http-request@1dd7ad841a34b9299f3741f7c7399f9feefdfb08 # 1.1.3 with: url: ${{ secrets.DISCORD_WEBHOOK }} method: POST headers: | Content-Type: application/json; charset=UTF-8 body: | { "avatar_url": "https://raw.githubusercontent.com/${{ github.event.repository.full_name }}/${{ github.ref_name }}/favicon.png", "content": "[**${{ github.event.repository.name }}**](<${{ github.event.repository.html_url }}>) v${{ github.ref_name }} has been released!" } retry-count: 5