Skip to content

Split & Release

Split & Release #11

Workflow file for this run

name: Split & Release
on:
workflow_dispatch:
inputs:
version:
description: "New version"
required: true
packages:
description: "Packages to deploy (JSON object with package info)"
required: true
user_token:
description: "User's GitHub token (for release authorship)"
required: false
default: ""
env:
GITHUB_TOKEN: ${{ secrets.BOT }}
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
package-list: ${{ steps.parse.outputs.package-list }}
core-version: ${{ steps.parse.outputs.core-version }}
is-prerelease: ${{ steps.parse.outputs.is-prerelease }}
steps:
- name: Parse packages
id: parse
run: |
# Create a temp file to avoid shell injection
cat > packages.json << 'EOF'
${{ github.event.inputs.packages }}
EOF
echo "Raw packages file:"
cat packages.json
# Validate JSON
if ! jq empty packages.json 2>/dev/null; then
echo "❌ Invalid JSON in 'packages' input"
exit 1
fi
VERSION="${{ github.event.inputs.version }}"
if [[ $VERSION =~ -(alpha|beta|rc) ]]; then
echo "🚧 Detected prerelease version: $VERSION"
IS_PRERELEASE=true
else
echo "✅ Detected stable version: $VERSION"
IS_PRERELEASE=false
fi
echo "Parsed packages:"
jq -r 'to_entries[] | "\(.key): Messages=[\(.value["release-message"] | join(", "))] Stability=\(.value["moox-stability"] // "dev")"' packages.json
package_list=$(jq -r 'keys | @json' packages.json)
echo "package-list=$package_list" >> $GITHUB_OUTPUT
echo "core-version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
echo "is-prerelease=$IS_PRERELEASE" >> $GITHUB_OUTPUT
echo "Package list for matrix: $package_list"
echo "Is prerelease: $IS_PRERELEASE"
split:
needs: prepare
runs-on: ubuntu-latest
if: ${{ needs.prepare.outputs.package-list != '[]' }}
strategy:
fail-fast: false
matrix:
package: ${{ fromJson(needs.prepare.outputs.package-list) }}
steps:
- uses: actions/checkout@v4
- name: Replace core version in composer.json
working-directory: packages/${{ matrix.package }}
run: |
if [ -f composer.json ]; then
echo "Updating moox/core version in ${{ matrix.package }} to ${{ needs.prepare.outputs.core-version }}"
sed -i 's/"moox\/core": "[^"]*"/"moox\/core": "${{ needs.prepare.outputs.core-version }}"/g' composer.json
echo "Updated composer.json:"
grep "moox/core" composer.json || echo "No moox/core dependency found"
else
echo "No composer.json found in ${{ matrix.package }}"
fi
- name: Commit changes
working-directory: packages/${{ matrix.package }}
run: |
if [ -f composer.json ]; then
git config user.name "github-actions"
git config user.email "[email protected]"
git add composer.json
git commit -m "Update moox/core dependency to ${{ needs.prepare.outputs.core-version }}" || echo "No changes to commit"
fi
- name: Split package to separate repository
uses: symplify/[email protected]
env:
GITHUB_TOKEN: ${{ github.event.inputs.user_token != '' && github.event.inputs.user_token || secrets.BOT }}
with:
tag: "${{ github.event.inputs.version }}"
package_directory: "packages/${{ matrix.package }}"
repository_organization: "mooxphp"
repository_name: "${{ matrix.package }}"
user_name: "Moox Bot"
user_email: "[email protected]"
- name: Create GitHub Release for split package
run: |
PACKAGE="${{ matrix.package }}"
VERSION="${{ github.event.inputs.version }}"
RELEASE_BODY=$(echo '${{ github.event.inputs.packages }}' | jq -r ".\"$PACKAGE\".\"release-message\" // [] | .[:10] | join(\"\\n\")")
STABILITY=$(echo '${{ github.event.inputs.packages }}' | jq -r ".\"$PACKAGE\".\"moox-stability\" // \"dev\"")
echo "Package: $PACKAGE"
echo "Version: $VERSION"
echo "Stability: $STABILITY"
echo "Release notes: $RELEASE_BODY"
# Only create release if stability is not 'dev'
if [ "$STABILITY" != "dev" ]; then
echo "✅ Creating release for $PACKAGE (stability: $STABILITY)"
# Wait for tag propagation
sleep 10
if [ "${{ needs.prepare.outputs.is-prerelease }}" = "true" ]; then
gh release create "$VERSION" \
--repo "mooxphp/$PACKAGE" \
--title "Release $VERSION" \
--notes "$RELEASE_BODY" \
--prerelease
else
gh release create "$VERSION" \
--repo "mooxphp/$PACKAGE" \
--title "Release $VERSION" \
--notes "$RELEASE_BODY"
fi
echo "✅ Release created successfully"
else
echo "⏭️ Skipping release for $PACKAGE (stability: dev)"
echo " Package was split to repository but no release was created"
fi
env:
GH_TOKEN: ${{ github.event.inputs.user_token != '' && github.event.inputs.user_token || secrets.BOT }}