diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..c4162e0 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,170 @@ +name: Release Build + +on: + release: + types: [created] + push: + tags: + - 'v*.*.*' + +jobs: + create-release: + runs-on: ubuntu-latest + outputs: + upload_url: ${{ steps.create_release.outputs.upload_url }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Extract version from tag + id: get_version + shell: bash + run: | + VERSION=${GITHUB_REF#refs/tags/v} + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "Version: $VERSION" + + - name: Generate release notes + id: release_notes + shell: bash + run: | + CURRENT_TAG=${GITHUB_REF#refs/tags/} + + # Get all tags and sort them by version number + PREVIOUS_TAG=$(git tag -l "v*.*.*" | sed 's/v//' | sort -V | sed 's/^/v/' | grep -B1 "^$CURRENT_TAG$" | head -n1) + + # If PREVIOUS_TAG equals CURRENT_TAG, there is no previous tag + if [ "$PREVIOUS_TAG" == "$CURRENT_TAG" ]; then + PREVIOUS_TAG="" + fi + + echo "## Changes in $CURRENT_TAG" > release_notes.md + echo "" >> release_notes.md + + if [ -n "$PREVIOUS_TAG" ]; then + echo "Changes since $PREVIOUS_TAG:" >> release_notes.md + echo "" >> release_notes.md + git log $PREVIOUS_TAG..HEAD --pretty=format:"- %s (%h)" --no-merges >> release_notes.md + else + echo "Initial release" >> release_notes.md + echo "" >> release_notes.md + git log --pretty=format:"- %s (%h)" --no-merges >> release_notes.md + fi + + cat release_notes.md + + - name: Create or Update Draft Release + id: create_release + uses: softprops/action-gh-release@v2 + with: + draft: true + body_path: release_notes.md + fail_on_unmatched_files: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + build-and-upload: + needs: create-release + strategy: + matrix: + include: + - os: ubuntu-latest + runtime: linux-x64 + artifact-name: pixelworld-linux-x64 + archive-ext: tar.gz + - os: ubuntu-latest + runtime: linux-arm64 + artifact-name: pixelworld-linux-arm64 + archive-ext: tar.gz + - os: windows-latest + runtime: win-x64 + artifact-name: pixelworld-win-x64 + archive-ext: zip + - os: windows-latest + runtime: win-arm64 + artifact-name: pixelworld-win-arm64 + archive-ext: zip + - os: macos-latest + runtime: osx-x64 + artifact-name: pixelworld-osx-x64 + archive-ext: tar.gz + - os: macos-latest + runtime: osx-arm64 + artifact-name: pixelworld-osx-arm64 + archive-ext: tar.gz + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Extract version from tag + id: get_version + shell: bash + run: | + VERSION=${GITHUB_REF#refs/tags/v} + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "Version: $VERSION" + + - name: Update Directory.Build.props + shell: bash + run: | + VERSION="${{ steps.get_version.outputs.version }}" + if [ -f "Directory.Build.props" ]; then + # Update version in Directory.Build.props using a cross-platform approach + sed "s|.*|$VERSION|g" Directory.Build.props > Directory.Build.props.tmp + sed "s|.*|$VERSION|g" Directory.Build.props.tmp > Directory.Build.props.tmp2 + sed "s|.*|$VERSION|g" Directory.Build.props.tmp2 > Directory.Build.props + rm Directory.Build.props.tmp Directory.Build.props.tmp2 + echo "Updated Directory.Build.props:" + cat Directory.Build.props + else + echo "Warning: Directory.Build.props not found" + fi + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build + run: dotnet build --configuration Release --no-restore + + - name: Test + run: dotnet test --configuration Release --no-build --verbosity normal + continue-on-error: true + + - name: Publish + run: | + dotnet publish ./CommandLine/CommandLine.csproj --configuration Release --runtime ${{ matrix.runtime }} --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:DebugType=None -p:DebugSymbols=false --output ./publish/${{ matrix.artifact-name }} + + - name: Create release archive (Windows) + if: matrix.archive-ext == 'zip' + shell: bash + run: | + cd ./publish/${{ matrix.artifact-name }} + 7z a ../../${{ matrix.artifact-name }}.zip * + cd ../.. + + - name: Create release archive (Linux/macOS) + if: matrix.archive-ext == 'tar.gz' + shell: bash + run: | + cd ./publish/${{ matrix.artifact-name }} + tar -czf ../../${{ matrix.artifact-name }}.tar.gz * + cd ../.. + + - name: Upload release assets + uses: softprops/action-gh-release@v2 + with: + files: ${{ matrix.artifact-name }}.${{ matrix.archive-ext }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file