name: Release on: push: tags: - 'v*' workflow_dispatch: inputs: version: description: 'Release version (e.g., v1.0.0)' required: true type: string env: GRADLE_OPTS: -Dorg.gradle.daemon=false -Dorg.gradle.parallel=true jobs: validate-release: name: Validate Release runs-on: ubuntu-latest outputs: version: ${{ steps.version.outputs.version }} steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Determine version id: version run: | if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT else echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT fi - name: Validate version format run: | VERSION="${{ steps.version.outputs.version }}" if [[ ! $VERSION =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?$ ]]; then echo "Invalid version format: $VERSION" echo "Expected format: v1.0.0 or v1.0.0-beta" exit 1 fi build-release: name: Build Release Artifacts runs-on: ubuntu-latest needs: validate-release steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: Setup Gradle uses: gradle/gradle-build-action@v2 - name: Update version in build.gradle.kts run: | VERSION="${{ needs.validate-release.outputs.version }}" VERSION_NUMBER="${VERSION#v}" sed -i "s/version = \".*\"/version = \"$VERSION_NUMBER\"/" build.gradle.kts - name: Build all targets run: | ./gradlew clean build --stacktrace ./gradlew jvmJar --stacktrace ./gradlew wasmJsBrowserDistribution --stacktrace - name: Run tests run: ./gradlew test --stacktrace - name: Create distribution package run: | mkdir -p dist/osm-maker-${{ needs.validate-release.outputs.version }} # Copy JVM artifacts cp -r build/libs/* dist/osm-maker-${{ needs.validate-release.outputs.version }}/ # Copy WASM artifacts mkdir -p dist/osm-maker-${{ needs.validate-release.outputs.version }}/wasm cp -r build/dist/wasmJs/productionExecutable/* dist/osm-maker-${{ needs.validate-release.outputs.version }}/wasm/ cp wasm_demo.html dist/osm-maker-${{ needs.validate-release.outputs.version }}/wasm/ # Copy configuration files cp config.json* dist/osm-maker-${{ needs.validate-release.outputs.version }}/ cp README*.md dist/osm-maker-${{ needs.validate-release.outputs.version }}/ # Create archive cd dist tar -czf osm-maker-${{ needs.validate-release.outputs.version }}.tar.gz osm-maker-${{ needs.validate-release.outputs.version }}/ zip -r osm-maker-${{ needs.validate-release.outputs.version }}.zip osm-maker-${{ needs.validate-release.outputs.version }}/ - name: Upload release artifacts uses: actions/upload-artifact@v3 with: name: release-artifacts path: | dist/*.tar.gz dist/*.zip generate-changelog: name: Generate Changelog runs-on: ubuntu-latest needs: validate-release outputs: changelog: ${{ steps.changelog.outputs.changelog }} steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Generate changelog id: changelog run: | VERSION="${{ needs.validate-release.outputs.version }}" # Get the previous tag PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") echo "## What's Changed" > CHANGELOG.md echo "" >> CHANGELOG.md if [[ -n "$PREVIOUS_TAG" ]]; then echo "### Commits since $PREVIOUS_TAG:" >> CHANGELOG.md git log --pretty=format:"- %s (%h)" $PREVIOUS_TAG..HEAD >> CHANGELOG.md else echo "### All commits:" >> CHANGELOG.md git log --pretty=format:"- %s (%h)" >> CHANGELOG.md fi echo "" >> CHANGELOG.md echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/$PREVIOUS_TAG...$VERSION" >> CHANGELOG.md # Set output for use in release { echo 'changelog<> $GITHUB_OUTPUT - name: Upload changelog uses: actions/upload-artifact@v3 with: name: changelog path: CHANGELOG.md create-release: name: Create GitHub Release runs-on: ubuntu-latest needs: [validate-release, build-release, generate-changelog] permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Download release artifacts uses: actions/download-artifact@v3 with: name: release-artifacts path: dist/ - name: Create Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ needs.validate-release.outputs.version }} name: OSM Maker ${{ needs.validate-release.outputs.version }} body: ${{ needs.generate-changelog.outputs.changelog }} draft: false prerelease: ${{ contains(needs.validate-release.outputs.version, '-') }} files: | dist/*.tar.gz dist/*.zip token: ${{ secrets.GITHUB_TOKEN }} notify-release: name: Notify Release runs-on: ubuntu-latest needs: [validate-release, create-release] if: always() && needs.create-release.result == 'success' steps: - name: Notify success run: | echo "🎉 Successfully released OSM Maker ${{ needs.validate-release.outputs.version }}" echo "Release URL: https://github.com/${{ github.repository }}/releases/tag/${{ needs.validate-release.outputs.version }}"