name: Create Release Package on: push: tags: - 'v*' jobs: build-release: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.3' extensions: mbstring, xml, zip, intl, gettext tools: composer:v2 - name: Get version from tag id: version run: | VERSION=${GITHUB_REF_NAME#v} echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Building version: $VERSION" - name: Validate composer.json run: composer validate --strict - name: Install Composer dependencies (production) run: | composer config platform.php 8.3.0 composer install --no-dev --optimize-autoloader --no-interaction - name: Compile translations run: | for po in languages/*.po; do if [ -f "$po" ]; then mo="${po%.po}.mo" echo "Compiling $po to $mo" msgfmt -o "$mo" "$po" fi done - name: Verify plugin version matches tag run: | PLUGIN_VERSION=$(grep -oP "Version:\s*\K[0-9]+\.[0-9]+\.[0-9]+" wp-fedistream.php | head -1) TAG_VERSION=${{ steps.version.outputs.version }} if [ "$PLUGIN_VERSION" != "$TAG_VERSION" ]; then echo "Error: Plugin version ($PLUGIN_VERSION) does not match tag version ($TAG_VERSION)" exit 1 fi echo "Version verified: $PLUGIN_VERSION" - name: Create release directory run: mkdir -p releases - name: Build release package run: | VERSION=${{ steps.version.outputs.version }} PLUGIN_NAME="wp-fedistream" RELEASE_FILE="releases/${PLUGIN_NAME}-${VERSION}.zip" # Move to parent directory for proper zip structure cd .. # Create zip with proper WordPress plugin structure zip -r "${PLUGIN_NAME}/${RELEASE_FILE}" "${PLUGIN_NAME}" \ -x "${PLUGIN_NAME}/.git/*" \ -x "${PLUGIN_NAME}/.gitea/*" \ -x "${PLUGIN_NAME}/.github/*" \ -x "${PLUGIN_NAME}/.vscode/*" \ -x "${PLUGIN_NAME}/.claude/*" \ -x "${PLUGIN_NAME}/CLAUDE.md" \ -x "${PLUGIN_NAME}/wp-core" \ -x "${PLUGIN_NAME}/wp-core/*" \ -x "${PLUGIN_NAME}/wp-plugins" \ -x "${PLUGIN_NAME}/wp-plugins/*" \ -x "${PLUGIN_NAME}/releases/*" \ -x "${PLUGIN_NAME}/composer.lock" \ -x "${PLUGIN_NAME}/*.log" \ -x "${PLUGIN_NAME}/.gitignore" \ -x "${PLUGIN_NAME}/.editorconfig" \ -x "${PLUGIN_NAME}/phpcs.xml*" \ -x "${PLUGIN_NAME}/phpunit.xml*" \ -x "${PLUGIN_NAME}/tests/*" \ -x "${PLUGIN_NAME}/*.po~" \ -x "${PLUGIN_NAME}/*.bak" \ -x "*.DS_Store" cd "${PLUGIN_NAME}" echo "Created: ${RELEASE_FILE}" - name: Generate checksums run: | VERSION=${{ steps.version.outputs.version }} RELEASE_FILE="releases/wp-fedistream-${VERSION}.zip" cd releases sha256sum "wp-fedistream-${VERSION}.zip" > "wp-fedistream-${VERSION}.zip.sha256" echo "SHA256:" cat "wp-fedistream-${VERSION}.zip.sha256" - name: Verify package structure run: | VERSION=${{ steps.version.outputs.version }} echo "Package contents:" unzip -l "releases/wp-fedistream-${VERSION}.zip" | head -50 # Verify main file is at correct location if unzip -l "releases/wp-fedistream-${VERSION}.zip" | grep -q "wp-fedistream/wp-fedistream.php"; then echo "✓ Main plugin file at correct location" else echo "✗ Error: Main plugin file not found at wp-fedistream/wp-fedistream.php" exit 1 fi # Verify vendor directory is included if unzip -l "releases/wp-fedistream-${VERSION}.zip" | grep -q "wp-fedistream/vendor/"; then echo "✓ Vendor directory included" else echo "✗ Error: Vendor directory not found" exit 1 fi - name: Extract changelog for release notes id: changelog run: | VERSION=${{ steps.version.outputs.version }} # Extract changelog section for this version NOTES=$(sed -n "/^## \[${VERSION}\]/,/^## \[/p" CHANGELOG.md | sed '$ d' | tail -n +2) if [ -z "$NOTES" ]; then NOTES="Release version ${VERSION}" fi # Save to file for multi-line output echo "$NOTES" > release_notes.txt echo "Release notes extracted" - name: Create Gitea Release env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: | VERSION=${{ steps.version.outputs.version }} TAG_NAME=${{ github.ref_name }} PRERELEASE="false" if [[ "$TAG_NAME" == *-* ]]; then PRERELEASE="true" fi # Read release notes BODY=$(cat release_notes.txt) # Create release via Gitea API RELEASE_RESPONSE=$(curl -s -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"tag_name\": \"${TAG_NAME}\", \"name\": \"Release ${VERSION}\", \"body\": $(echo "$BODY" | jq -Rs .), \"draft\": false, \"prerelease\": ${PRERELEASE}}" \ "${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}/releases") RELEASE_ID=$(echo "$RELEASE_RESPONSE" | jq -r '.id') if [ "$RELEASE_ID" == "null" ] || [ -z "$RELEASE_ID" ]; then echo "Failed to create release:" echo "$RELEASE_RESPONSE" exit 1 fi echo "Created release ID: $RELEASE_ID" # Upload attachments for file in "releases/wp-fedistream-${VERSION}.zip" "releases/wp-fedistream-${VERSION}.zip.sha256"; do if [ -f "$file" ]; then FILENAME=$(basename "$file") echo "Uploading $FILENAME..." curl -s -X POST \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/octet-stream" \ --data-binary "@$file" \ "${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets?name=${FILENAME}" echo "Uploaded $FILENAME" fi done echo "Release created successfully: ${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/releases/tag/${TAG_NAME}"