From baf56793b6faf7302a4a8fb55e6177e41e277051 Mon Sep 17 00:00:00 2001 From: Mohamed Youssef Date: Sun, 2 Aug 2026 09:48:11 +0300 Subject: [PATCH] update --- .gitea/workflows/release.yml | 260 +++++++++++++++++++---------------- 1 file changed, 145 insertions(+), 115 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 0affe51..2701814 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -1,144 +1,174 @@ -name: Build WordPress Plugin for Gitea +name: WP Plugin Version & Release on: push: branches: - - main # Triggers on every push to main + - main jobs: - build-release: + release: runs-on: ubuntu-latest - steps: - - name: Checkout code + - name: Checkout uses: actions/checkout@v4 + with: + fetch-depth: 0 - # -------------------------------- - # OPTIONAL: Setup PHP & Composer - # -------------------------------- - # - name: Setup PHP - # uses: shivammathur/setup-php@v2 - # with: - # php-version: '7.4' - # tools: composer - # Remove if your plugin does not use Composer. + - name: Install rsync + run: sudo apt-get update && sudo apt-get install -y rsync - # -------------------------------- - # OPTIONAL: Setup Node & NPM - # -------------------------------- - # - name: Setup Node.js - # uses: actions/setup-node@v4 - # with: - # node-version: '20' - # cache: 'npm' - # Remove if your plugin does not use NPM. + # ------------------------------------------------------------ + # 1. Locate the main plugin file (recursively, excluding junk) + # ------------------------------------------------------------ + - name: Locate main plugin file + id: locate + run: | + FILE=$(grep -rlE "^[[:space:]]*(\*|/\*\*)?[[:space:]]*Plugin Name:" \ + --include="*.php" . \ + | grep -v -e '/vendor/' -e '/node_modules/' -e '/build/' \ + | head -n1) - # -------------------------------- - # OPTIONAL: Install dependencies & build assets - # -------------------------------- - # - name: Install Composer dependencies (production only) - # run: | - # if [ -f "composer.json" ]; then - # composer install --no-dev --prefer-dist --optimize-autoloader - # fi + if [ -z "$FILE" ]; then + echo "::error::Could not find a PHP file with a 'Plugin Name:' header." + exit 1 + fi - # - name: Install NPM dependencies & build - # run: | - # if [ -f "package.json" ]; then - # npm ci - # fi - # if [ -f "package.json" ] && grep -q '"build"' package.json; then - # npm run build - # fi + echo "Found main plugin file: $FILE" + echo "file=${FILE}" >> "$GITHUB_OUTPUT" - # -------------------------------- - # Extract plugin metadata - # -------------------------------- - - name: Get plugin version and slug + # ------------------------------------------------------------ + # 2. Parse Plugin Name, Slug, and Version from the header + # ------------------------------------------------------------ + - name: Extract plugin name & version from header id: meta run: | - MAIN_FILE=$(find . -maxdepth 3 -type f -name "*.php" -exec grep -l "Plugin Name:" {} \; | head -n 1) - if [ -z "$MAIN_FILE" ]; then - echo "❌ No plugin file with 'Plugin Name:' found!" >&2 - exit 1 - fi - MAIN_FILE=${MAIN_FILE#./} - VERSION=$(grep "^Version:" "$MAIN_FILE" | awk -F' ' '{print $NF}' | tr -d '\r') - if [ -z "$VERSION" ]; then - echo "❌ Version header not found in $MAIN_FILE" >&2 - exit 1 - fi - SLUG="${GITHUB_REPOSITORY##*/}" - echo "PLUGIN_SLUG=$SLUG" >> $GITHUB_ENV - echo "PLUGIN_VERSION=$VERSION" >> $GITHUB_ENV - echo "FILENAME=${SLUG}-${VERSION}.zip" >> $GITHUB_ENV - echo "MAIN_FILE=$MAIN_FILE" >> $GITHUB_ENV - echo "✅ Plugin: $SLUG, Version: $VERSION (main file: $MAIN_FILE)" + FILE="${{ steps.locate.outputs.file }}" + HEADER=$(sed -n '1,40p' "$FILE") - # -------------------------------- - # Prepare package (exclude dev files) - # -------------------------------- - - name: Prepare package directory + PLUGIN_NAME=$(echo "$HEADER" | grep -im1 'Plugin Name:' \ + | sed -E 's/^[[:space:]]*(\*|\/\*\*)?[[:space:]]*Plugin Name:[[:space:]]*//' \ + | sed -E 's/[[:space:]]*\*\/?[[:space:]]*$//') + + VERSION=$(echo "$HEADER" | grep -im1 'Version:' \ + | sed -E 's/^[[:space:]]*(\*|\/\*\*)?[[:space:]]*Version:[[:space:]]*//' \ + | sed -E 's/[[:space:]]*\*\/?[[:space:]]*$//') + + if [ -z "$PLUGIN_NAME" ] || [ -z "$VERSION" ]; then + echo "::error::Could not parse Plugin Name or Version from $FILE header." + exit 1 + fi + + SLUG=$(echo "$PLUGIN_NAME" | tr '[:upper:]' '[:lower:]' \ + | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//') + + echo "Plugin: $PLUGIN_NAME" + echo "Slug: $SLUG" + echo "Version: $VERSION" + + echo "name=${PLUGIN_NAME}" >> "$GITHUB_OUTPUT" + echo "slug=${SLUG}" >> "$GITHUB_OUTPUT" + echo "version=${VERSION}" >> "$GITHUB_OUTPUT" + + # ------------------------------------------------------------ + # 3. Check if this version already has a release (tag) + # ------------------------------------------------------------ + - name: Check if this version already has a release + id: check run: | - mkdir -p /tmp/build/${{ env.PLUGIN_SLUG }} - rsync -av \ + TAG="v${{ steps.meta.outputs.version }}" + git fetch --tags --quiet + if git rev-parse "$TAG" >/dev/null 2>&1; then + echo "Tag $TAG already exists — skipping release." + echo "should_release=false" >> "$GITHUB_OUTPUT" + else + echo "Tag $TAG is new — will release." + echo "should_release=true" >> "$GITHUB_OUTPUT" + fi + echo "tag=${TAG}" >> "$GITHUB_OUTPUT" + + # ------------------------------------------------------------ + # 4. Update Stable tag in readme.txt (if present) + # ------------------------------------------------------------ + - name: Update Stable tag in readme.txt + if: steps.check.outputs.should_release == 'true' && runner.os == 'Linux' && hashFiles('readme.txt') != '' + run: | + sed -i -E "s/^(Stable tag:[[:space:]]*).*/\1${{ steps.meta.outputs.version }}/" readme.txt + if ! git diff --quiet -- readme.txt; then + git config user.name "gitea-actions" + git config user.email "actions@noreply.gitea" + git add readme.txt + git commit -m "chore: sync readme.txt stable tag to ${{ steps.meta.outputs.version }} [skip ci]" + # Push using the token (set remote below) + fi + # Note: We'll handle the actual push later, after setting the remote. + + # ------------------------------------------------------------ + # 5. Configure git remote with token and push everything + # ------------------------------------------------------------ + - name: Push commits and tags to Gitea + if: steps.check.outputs.should_release == 'true' + run: | + # Reconstruct the remote URL with the token + GITEA_SERVER="${{ vars.GITEA_SERVER_URL }}" + GITEA_REPO="${{ vars.GITEA_REPO }}" + # Remove protocol part to build oauth2 URL + SERVER_HOST="${GITEA_SERVER#https://}" + SERVER_HOST="${SERVER_HOST#http://}" + git remote set-url origin "https://oauth2:${{ secrets.RELEASE_TOKEN }}@${SERVER_HOST}/${GITEA_REPO}.git" + git push origin HEAD:refs/heads/main + git push origin "${{ steps.check.outputs.tag }}" + + # ------------------------------------------------------------ + # 6. Build the plugin zip (only if we are releasing) + # ------------------------------------------------------------ + - name: Build plugin zip + if: steps.check.outputs.should_release == 'true' + run: | + SLUG="${{ steps.meta.outputs.slug }}" + mkdir -p build/"${SLUG}" + rsync -a \ --exclude='.git' \ + --exclude='.gitea' \ --exclude='.github' \ - --exclude='.distignore' \ - --exclude='.gitignore' \ --exclude='node_modules' \ - --exclude='vendor' \ - --exclude='tests' \ - --exclude='.env*' \ - --exclude='*.log' \ - --exclude='*.map' \ - --exclude='package-lock.json' \ - --exclude='composer.lock' \ - --exclude='package.json' \ - --exclude='composer.json' \ - --exclude='webpack.config.js' \ - --exclude='gulpfile.js' \ - --exclude='Gruntfile.js' \ - --exclude='phpunit.xml' \ - --exclude='.wordpress-org' \ - ./ /tmp/build/${{ env.PLUGIN_SLUG }}/ 2>/dev/null || true + --exclude='build' \ + --exclude='*.zip' \ + ./ build/"${SLUG}"/ + cd build + zip -r "../${SLUG}-${{ steps.meta.outputs.version }}.zip" "${SLUG}" - # -------------------------------- - # Create ZIP - # -------------------------------- - - name: Create plugin zip - run: | - cd /tmp/build - zip -r "$GITHUB_WORKSPACE/${{ env.FILENAME }}" ${{ env.PLUGIN_SLUG }}/ - cd $GITHUB_WORKSPACE - echo "✅ Created: $FILENAME" - - # -------------------------------- - # Install & configure tea CLI - # -------------------------------- + # ------------------------------------------------------------ + # 7. Install tea CLI (pinned version) + # ------------------------------------------------------------ - name: Install tea CLI + if: steps.check.outputs.should_release == 'true' run: | - curl -L https://dl.gitea.io/tea/0.11.0/tea-0.11.0-linux-amd64 -o tea - chmod +x tea - sudo mv tea /usr/local/bin/ + TEA_VERSION="0.14.2" + curl -fL -o /usr/local/bin/tea \ + "https://gitea.com/gitea/tea/releases/download/v${TEA_VERSION}/tea-${TEA_VERSION}-linux-amd64" + chmod +x /usr/local/bin/tea + tea --version - - name: Configure tea + # ------------------------------------------------------------ + # 8. Create Gitea Release (with the asset) + # ------------------------------------------------------------ + - name: Create Gitea Release (tea CLI) + if: steps.check.outputs.should_release == 'true' run: | + ZIP="${{ steps.meta.outputs.slug }}-${{ steps.meta.outputs.version }}.zip" + # Ensure the zip exists + if [ ! -f "$ZIP" ]; then + echo "::error::Zip file $ZIP not found!" >&2 + exit 1 + fi + tea login add \ - --name gitea \ + --name ci \ --url "${{ vars.GITEA_SERVER_URL }}" \ - --token "${{ secrets.GITEA_TOKEN }}" + --token "${{ secrets.RELEASE_TOKEN }}" - # -------------------------------- - # Create/force‑update Gitea release - # -------------------------------- - - name: Create/update Gitea release - run: | - TAG="v${{ env.PLUGIN_VERSION }}" - REPO="${{ vars.GITEA_REPO }}" - tea release create "$TAG" \ - --title "${{ env.PLUGIN_SLUG }} v${{ env.PLUGIN_VERSION }}" \ - --asset "${{ env.FILENAME }}" \ - --repo "$REPO" \ - --force - echo "✅ Release $TAG created/updated with asset ${{ env.FILENAME }}" \ No newline at end of file + tea release create \ + --repo "${{ vars.GITEA_REPO }}" \ + --tag "${{ steps.check.outputs.tag }}" \ + --title "${{ steps.meta.outputs.name }} ${{ steps.meta.outputs.version }}" \ + --asset "${ZIP}" \ No newline at end of file