name: Create Release on: push: branches: - main paths: - 'frontend/package.json' - 'backend/package.json' jobs: check-version-change: runs-on: ubuntu-latest outputs: version_changed: ${{ steps.check.outputs.changed }} new_version: ${{ steps.check.outputs.version }} steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 2 - name: Check if version changed id: check run: | # Get current versions FRONTEND_VERSION=$(node -p "require('./frontend/package.json').version") BACKEND_VERSION=$(node -p "require('./backend/package.json').version") # Get previous versions git checkout HEAD~1 PREV_FRONTEND_VERSION=$(node -p "require('./frontend/package.json').version" 2>/dev/null || echo "0.0.0") PREV_BACKEND_VERSION=$(node -p "require('./backend/package.json').version" 2>/dev/null || echo "0.0.0") # Check if versions changed if [[ "$FRONTEND_VERSION" != "$PREV_FRONTEND_VERSION" ]] || [[ "$BACKEND_VERSION" != "$PREV_BACKEND_VERSION" ]]; then echo "changed=true" >> $GITHUB_OUTPUT echo "version=$FRONTEND_VERSION" >> $GITHUB_OUTPUT else echo "changed=false" >> $GITHUB_OUTPUT fi create-release: needs: check-version-change if: needs.check-version-change.outputs.version_changed == 'true' runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Generate Changelog id: changelog run: | # Get commits since last tag LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") if [[ -z "$LAST_TAG" ]]; then COMMITS=$(git log --oneline) else COMMITS=$(git log ${LAST_TAG}..HEAD --oneline) fi # Format changelog echo "## What's Changed" > changelog.md echo "" >> changelog.md # Group commits by type echo "### Features" >> changelog.md echo "$COMMITS" | grep -E "^[a-f0-9]+ feat:" | sed 's/^[a-f0-9]+ /- /' >> changelog.md || echo "*No new features*" >> changelog.md echo "" >> changelog.md echo "### Bug Fixes" >> changelog.md echo "$COMMITS" | grep -E "^[a-f0-9]+ fix:" | sed 's/^[a-f0-9]+ /- /' >> changelog.md || echo "*No bug fixes*" >> changelog.md echo "" >> changelog.md echo "### Other Changes" >> changelog.md echo "$COMMITS" | grep -vE "^[a-f0-9]+ (feat|fix):" | sed 's/^[a-f0-9]+ /- /' >> changelog.md || echo "*No other changes*" >> changelog.md # Save changelog echo "changelog<> $GITHUB_OUTPUT cat changelog.md >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Create Release uses: softprops/action-gh-release@v1 with: tag_name: v${{ needs.check-version-change.outputs.new_version }} name: Release v${{ needs.check-version-change.outputs.new_version }} body: | ## PicPeak v${{ needs.check-version-change.outputs.new_version }} ${{ steps.changelog.outputs.changelog }} ### Docker Images To use this release with Docker: ```bash docker pull ghcr.io/${{ github.repository }}/frontend:v${{ needs.check-version-change.outputs.new_version }} docker pull ghcr.io/${{ github.repository }}/backend:v${{ needs.check-version-change.outputs.new_version }} ``` Or use the `latest` tag for the most recent version. draft: false prerelease: false generate_release_notes: true