From 0dca92fefa4de9886fe3a67f0a317f8228aca675 Mon Sep 17 00:00:00 2001 From: Mohamed Youssef Date: Sun, 2 Aug 2026 09:35:04 +0300 Subject: [PATCH] update Workflows --- .gitea/workflows/release.yml | 218 ++++++++++++++++++----------------- 1 file changed, 114 insertions(+), 104 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 9ce94cb..7caa614 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -1,138 +1,148 @@ -name: WP Plugin Version & Release +name: Build WordPress Plugin on: push: - branches: - - main + tags: + - 'v*' # Trigger on version tags like v1.0.0, v2.1.3 + # workflow_dispatch: # (Optional) Uncomment to allow manual trigger jobs: - release: + build: runs-on: ubuntu-latest + steps: - - name: Checkout + - name: Checkout code uses: actions/checkout@v4 + + # ------------------------------------------------ + # 1. SETUP PHP (for Composer, if used) + # ------------------------------------------------ + - name: Setup PHP + uses: shivammathur/setup-php@v2 with: - fetch-depth: 0 + php-version: '7.4' + tools: composer - - name: Install rsync - run: apt-get update && apt-get install -y rsync + # ------------------------------------------------ + # 2. SETUP NODE (for NPM/Yarn, if used) + # ------------------------------------------------ + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' # or 'yarn' - - name: Locate main plugin file - id: locate + # ------------------------------------------------ + # 3. INSTALL & BUILD ASSETS (optional) + # ------------------------------------------------ + - name: Install Composer dependencies (production only) run: | - FILE=$(grep -rlE "^[[:space:]]*(\*|/\*\*)?[[:space:]]*Plugin Name:" \ - --include="*.php" . \ - | grep -v -e '/vendor/' -e '/node_modules/' -e '/build/' \ - | head -n1) - - if [ -z "$FILE" ]; then - echo "::error::Could not find a PHP file with a 'Plugin Name:' header." - exit 1 + if [ -f "composer.json" ]; then + composer install --no-dev --prefer-dist --optimize-autoloader fi - echo "Found main plugin file: $FILE" - echo "file=${FILE}" >> "$GITHUB_OUTPUT" + - name: Install NPM dependencies & build assets + run: | + if [ -f "package.json" ]; then + npm ci + fi + if [ -f "package.json" ] && grep -q '"build"' package.json; then + npm run build + fi - - name: Extract plugin name & version from header + # ------------------------------------------------ + # 4. EXTRACT PLUGIN VERSION FROM MAIN FILE + # ------------------------------------------------ + - name: Get plugin version and slug id: meta run: | - FILE="${{ steps.locate.outputs.file }}" - HEADER=$(sed -n '1,40p' "$FILE") - - 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." + # Find the main plugin file (the one with the WordPress header) + MAIN_FILE=$(grep -l "Plugin Name:" *.php | head -n 1) + if [ -z "$MAIN_FILE" ]; then + echo "❌ No main plugin file (with 'Plugin Name:') found!" >&2 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" - - - name: Check if this version already has a release - id: check - run: | - 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" - - - name: Update Stable tag in readme.txt - if: steps.check.outputs.should_release == 'true' && 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]" - git push origin HEAD:refs/heads/main + # Extract version + 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 - - name: Tag release - if: steps.check.outputs.should_release == 'true' - run: | - git config user.name "gitea-actions" - git config user.email "actions@noreply.gitea" - git tag "${{ steps.check.outputs.tag }}" - git push origin "${{ steps.check.outputs.tag }}" + # Use repository name as slug, or override with a custom variable + SLUG="${GITHUB_REPOSITORY##*/}" - - name: Build plugin zip - if: steps.check.outputs.should_release == 'true' + echo "PLUGIN_SLUG=$SLUG" >> $GITHUB_ENV + echo "PLUGIN_VERSION=$VERSION" >> $GITHUB_ENV + echo "MAIN_FILE=$MAIN_FILE" >> $GITHUB_ENV + echo "FILENAME=${SLUG}-${VERSION}.zip" >> $GITHUB_ENV + + echo "✅ Plugin: $SLUG, Version: $VERSION" + + # ------------------------------------------------ + # 5. PREPARE PACKAGE (Exclude dev files) + # ------------------------------------------------ + - name: Prepare package directory run: | - SLUG="${{ steps.meta.outputs.slug }}" - mkdir -p build/"${SLUG}" - rsync -a \ + mkdir -p /tmp/build/${{ env.PLUGIN_SLUG }} + + # Rsync all files, excluding common dev/dependency folders + rsync -av \ --exclude='.git' \ - --exclude='.gitea' \ --exclude='.github' \ + --exclude='.distignore' \ + --exclude='.gitignore' \ --exclude='node_modules' \ - --exclude='build' \ - --exclude='*.zip' \ - ./ build/"${SLUG}"/ - cd build - zip -r "../${SLUG}-${{ steps.meta.outputs.version }}.zip" "${SLUG}" + --exclude='vendor' \ # Composer dev dependencies (we already installed --no-dev, but safe to exclude if standalone) + --exclude='tests' \ + --exclude='.env*' \ + --exclude='*.log' \ + --exclude='*.map' \ + --exclude='*.lock' \ # package-lock.json / composer.lock (optional, sometimes kept) + --exclude='package.json' \ # Remove if you want to keep it in production + --exclude='composer.json' \ # Remove if you want to keep it + --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 + # NOTE: If your plugin needs composer.json/package.json in production, + # remove those specific --exclude lines above. + + # ------------------------------------------------ + # 6. CREATE ZIP ARCHIVE + # ------------------------------------------------ + - name: Create plugin zip + run: | + cd /tmp/build + zip -r "$GITHUB_WORKSPACE/${{ env.FILENAME }}" ${{ env.PLUGIN_SLUG }}/ + cd $GITHUB_WORKSPACE + echo "✅ Created: $FILENAME" + + # ------------------------------------------------ + # 7. UPLOAD TO GITHUB RELEASE + # ------------------------------------------------ - name: Install tea CLI run: | - 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 + 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/ - - name: Create Gitea Release (tea CLI) - if: steps.check.outputs.should_release == 'true' + - name: Configure tea run: | - ZIP="${{ steps.meta.outputs.slug }}-${{ steps.meta.outputs.version }}.zip" - tea login add \ - --name ci \ - --url "${{ gitea.server_url }}" \ - --token "${{ secrets.RELEASE_TOKEN }}" + --name gitea \ + --url "${{ vars.SERVER_URL }}" \ + --token "${{ secrets.OC3_EXTENSION_RELEASE_TOKEN }}" - tea releases create \ - --repo "${{ gitea.repository }}" \ - --tag "${{ steps.check.outputs.tag }}" \ - --title "${{ steps.meta.outputs.name }} ${{ steps.meta.outputs.version }}" \ - --asset "${ZIP}" \ No newline at end of file + - name: Create 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" \ No newline at end of file