diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 5cc1287..77b1d2a 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -1,4 +1,4 @@ -name: WP Plugin Version & Release +name: Build WordPress Plugin (Simple) on: push: @@ -6,187 +6,91 @@ on: - main jobs: - release: + build-release: runs-on: ubuntu-latest + steps: - name: Checkout uses: actions/checkout@v4 - with: - fetch-depth: 0 - # -------------------------- - # Validate required vars - # -------------------------- - - name: Check required variables - run: | - if [ -z "${{ vars.GITEA_SERVER_URL }}" ]; then - echo "::error::Missing variable: GITEA_SERVER_URL. Please add it in Settings → Secrets and variables → Actions → Variables" - exit 1 - fi - if [ -z "${{ vars.GITEA_REPO }}" ]; then - echo "::error::Missing variable: GITEA_REPO. Please add it in Settings → Secrets and variables → Actions → Variables" - exit 1 - fi - if [ -z "${{ secrets.RELEASE_TOKEN }}" ]; then - echo "::error::Missing secret: RELEASE_TOKEN. Please add it in Settings → Secrets and variables → Actions → Secrets" - exit 1 - fi - echo "✅ All required variables and secrets are set." + - name: Install zip + run: sudo apt-get update && sudo apt-get install -y zip - - name: Install rsync - run: sudo apt-get update && sudo apt-get install -y rsync - - # ------------------------------------------------------------ - # 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) - - if [ -z "$FILE" ]; then - echo "::error::Could not find a PHP file with a 'Plugin Name:' header." - exit 1 - fi - - echo "Found main plugin file: $FILE" - echo "file=${FILE}" >> "$GITHUB_OUTPUT" - - # ------------------------------------------------------------ - # 2. Parse Plugin Name, Slug, and Version from the header - # ------------------------------------------------------------ - - name: Extract plugin name & version from header + # ----------------------------------------------------------------- + # 1. Find the main plugin file and extract slug & version + # ----------------------------------------------------------------- + - name: Extract plugin metadata 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 file that contains "Plugin Name:" + MAIN_FILE=$(grep -rl "Plugin Name:" *.php | head -n1) + if [ -z "$MAIN_FILE" ]; then + echo "❌ No 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" - - # ------------------------------------------------------------ - # 3. Check if this version already has a release (tag) - # ------------------------------------------------------------ - - 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" - - # ------------------------------------------------------------ - # 4. Update Stable tag in readme.txt (if present) - # ------------------------------------------------------------ - - 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]" + # Extract version (strip trailing newline) + VERSION=$(grep "^Version:" "$MAIN_FILE" | awk '{print $NF}' | tr -d '\r') + if [ -z "$VERSION" ]; then + echo "❌ Version not found in $MAIN_FILE" >&2 + exit 1 fi - # ------------------------------------------------------------ - # 5. Push commits and tags to Gitea (using token) - # ------------------------------------------------------------ - - name: Push commits and tags to Gitea - if: steps.check.outputs.should_release == 'true' + # Use repository name as the slug (or override with a custom variable) + SLUG="${GITHUB_REPOSITORY##*/}" + + echo "SLUG=$SLUG" >> $GITHUB_ENV + echo "VERSION=$VERSION" >> $GITHUB_ENV + echo "FILENAME=${SLUG}-${VERSION}.zip" >> $GITHUB_ENV + + echo "✅ Plugin: $SLUG, Version: $VERSION" + + # ----------------------------------------------------------------- + # 2. Prepare the package (copy everything except .git and .github) + # ----------------------------------------------------------------- + - name: Prepare package run: | - GITEA_SERVER="${{ vars.GITEA_SERVER_URL }}" - GITEA_REPO="${{ vars.GITEA_REPO }}" - TOKEN="${{ secrets.RELEASE_TOKEN }}" + mkdir -p build/"$SLUG" + # Copy all files, but exclude git and github folders (optional) + rsync -a --exclude='.git' --exclude='.github' ./ build/"$SLUG"/ + # If you want to exclude node_modules, vendor, etc., add more --exclude's - # Strip protocol for the oauth2 URL - SERVER_HOST="${GITEA_SERVER#https://}" - SERVER_HOST="${SERVER_HOST#http://}" - - git remote set-url origin "https://oauth2:${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 - # ------------------------------------------------------------ + # ----------------------------------------------------------------- + # 3. Build the zip + # ----------------------------------------------------------------- - 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='node_modules' \ - --exclude='build' \ - --exclude='*.zip' \ - ./ build/"${SLUG}"/ cd build - zip -r "../${SLUG}-${{ steps.meta.outputs.version }}.zip" "${SLUG}" + zip -r "../$FILENAME" "$SLUG" + cd .. - # ------------------------------------------------------------ - # 7. Install tea CLI - # ------------------------------------------------------------ + # ----------------------------------------------------------------- + # 4. Install tea CLI + # ----------------------------------------------------------------- - name: Install tea CLI - if: steps.check.outputs.should_release == 'true' 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/main/tea-main-linux-amd64 -o tea + chmod +x tea + sudo mv tea /usr/local/bin/ - # ------------------------------------------------------------ - # 8. Create Gitea Release - # ------------------------------------------------------------ - - name: Create Gitea Release (tea CLI) - if: steps.check.outputs.should_release == 'true' + # ----------------------------------------------------------------- + # 5. Configure tea (using your existing variables) + # ----------------------------------------------------------------- + - name: Configure tea run: | - ZIP="${{ steps.meta.outputs.slug }}-${{ steps.meta.outputs.version }}.zip" - if [ ! -f "$ZIP" ]; then - echo "::error::Zip file $ZIP not found!" >&2 - exit 1 - fi - tea login add \ - --name ci \ - --url "${{ vars.GITEA_SERVER_URL }}" \ - --token "${{ secrets.RELEASE_TOKEN }}" + --name gitea \ + --url "${{ vars.SERVER_URL }}" \ + --token "${{ secrets.OC3_EXTENSION_RELEASE_TOKEN }}" - tea release create \ + # ----------------------------------------------------------------- + # 6. Create/force-update release + # ----------------------------------------------------------------- + - name: Create release + run: | + TAG="v${VERSION}" + tea release create "$TAG" \ + --title "${SLUG}_${VERSION}" \ + --asset "${FILENAME}" \ --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 + --force # <-- overwrites if tag exists \ No newline at end of file