Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
c20ae0e
feat: add post-release check workflow [ED-25263]
Svitlana-Dykun Aug 18, 2026
bfa4433
fix: stabilize post-release CI gates [ED-25263]
Svitlana-Dykun Aug 18, 2026
17192de
feat: make post-release check callable from Core and Pro [ED-25263]
Svitlana-Dykun Sep 1, 2026
e382127
Merge branch 'main' into feat/post-release-check
Svitlana-Dykun Sep 1, 2026
de5c213
fix: harden post-release check for Core/Pro callers [ED-25263]
Svitlana-Dykun Sep 1, 2026
4d09fc7
fix: satisfy noUncheckedIndexedAccess in versionParts [ED-25263]
cursoragent Sep 1, 2026
42c9688
fix: format post-release verify README with Prettier [ED-25263]
Svitlana-Dykun Sep 1, 2026
5796ce2
fix: skip changelog checks for prerelease tags [ED-25263]
Svitlana-Dykun Sep 8, 2026
30d9388
Merge branch 'main' into feat/post-release-check
Svitlana-Dykun Sep 8, 2026
6266216
fix: ignore expired Debian Release files in wp-env [ED-25263]
Svitlana-Dykun Sep 8, 2026
86a33df
fix: run wp-env on PHP 8.2 to leave broken bullseye mirrors [ED-25263]
Svitlana-Dykun Sep 8, 2026
9ac3aa5
chore: drop unrelated action dist rebuilds [ED-25263]
Svitlana-Dykun Sep 9, 2026
ddf5c0b
fix: run post-release check only on dispatch and workflow_call [ED-25…
Svitlana-Dykun Sep 9, 2026
7c56bc1
fix: require actions_ref on post-release workflow_call [ED-25263]
Svitlana-Dykun Sep 9, 2026
aa92ca5
fix: skip smoke when a Pro zip was requested but missing [ED-25263]
Svitlana-Dykun Sep 9, 2026
1c9ba7a
chore: drop post-release-verify unit tests [ED-25263]
Svitlana-Dykun Sep 9, 2026
15bbdae
chore: commit tsup dist so Require Build stays clean [ED-25263]
Svitlana-Dykun Sep 9, 2026
3573856
chore: reuse setup-wp-env tsup config for post-release-verify [ED-25263]
Svitlana-Dykun Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
213 changes: 213 additions & 0 deletions .github/workflows/post-release-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
name: Post-Release Check

on:
workflow_dispatch:
inputs:
core_version:
description: 'Core version (e.g. 4.2.2)'
required: true
type: string
pro_version:
description: 'Pro version. Leave empty for Core-only.'
required: false
type: string
default: ''
skip_wordpress_org:
description: 'Skip wordpress.org SVN/download (use when the tag is not on .org yet)'
required: false
type: boolean
default: false
skip_smoke:
description: 'Run API/zip checks only'
required: false
type: boolean
default: false
dry_run:
description: 'Record failures in the summary without failing verify'
required: false
type: boolean
default: false
workflow_call:
inputs:
core_version:
description: 'Core version. Empty uses current wordpress.org Core. Core release callers must pass the published tag.'
required: false
type: string
default: ''
pro_version:
description: 'Pro version. Leave empty for Core-only.'
required: false
type: string
default: ''
skip_wordpress_org:
description: 'Skip wordpress.org SVN/download (use when the tag is not on .org yet)'
required: false
type: boolean
default: false
skip_smoke:
description: 'Run API/zip checks only'
required: false
type: boolean
default: false
dry_run:
description: 'Record failures in the summary without failing verify'
required: false
type: boolean
default: false
actions_ref:
description: 'Git ref of this repo to check out. Must match the uses: pin (e.g. main).'
required: true
type: string
secrets:
MAINTAIN_TOKEN:
description: 'PAT that can read private elementor-pro. Required when pro_version is set.'
required: false

concurrency:
group: post-release-check-${{ github.repository }}-${{ inputs.core_version || github.sha }}-${{ inputs.pro_version || 'core-only' }}
cancel-in-progress: false

permissions:
contents: read
actions: write

jobs:
verify-published:
name: Verify published artifacts
runs-on: ubuntu-latest
if: startsWith(github.repository, 'elementor/')
outputs:
core_version: ${{ steps.versions.outputs.core }}
pro_version: ${{ steps.versions.outputs.pro }}
core_zip_available: ${{ steps.verify.outputs.core-zip-path != '' }}
pro_zip_available: ${{ steps.verify.outputs.pro-zip-path != '' }}
steps:
- name: Checkout this repository
if: github.event_name != 'workflow_call'
uses: actions/checkout@v4
with:
persist-credentials: false

- name: Checkout post-release actions
if: github.event_name == 'workflow_call'
uses: actions/checkout@v4
with:
repository: elementor/elementor-editor-github-actions
ref: ${{ inputs.actions_ref }}
persist-credentials: false

- name: Resolve versions
id: versions
env:
INPUT_CORE: ${{ inputs.core_version }}
INPUT_PRO: ${{ inputs.pro_version }}
run: |
if [ -n "$INPUT_CORE" ]; then
echo "core=$INPUT_CORE" >> "$GITHUB_OUTPUT"
else
CORE=$(curl -fsSL -A 'elementor-post-release-check' \
'https://api.wordpress.org/plugins/info/1.2/?action=plugin_information&request%5Bslug%5D=elementor' \
| jq -r '.version')
if [ -z "$CORE" ] || [ "$CORE" = 'null' ]; then
echo 'Failed to resolve current Core version from wordpress.org'
exit 1
fi
echo "No core_version input; using wordpress.org current Core $CORE"
echo "core=$CORE" >> "$GITHUB_OUTPUT"
fi
echo "pro=$INPUT_PRO" >> "$GITHUB_OUTPUT"

- name: Install Dependencies
uses: ./.github/actions/install-deps

- name: Verify release
id: verify
uses: ./actions/post-release-verify
with:
core-version: ${{ steps.versions.outputs.core }}
pro-version: ${{ steps.versions.outputs.pro }}
github-token: ${{ secrets.MAINTAIN_TOKEN || github.token }}
skip-wordpress-org: ${{ inputs.skip_wordpress_org || false }}
dry-run: ${{ inputs.dry_run || false }}

- name: Upload plugin zips
if: steps.verify.outputs.core-zip-path != ''
uses: actions/upload-artifact@v4
with:
name: released-plugins
path: post-release-artifacts/*.zip
if-no-files-found: error
retention-days: 3

smoke-editor:
name: Upgrade site smoke
needs: verify-published
runs-on: ubuntu-latest
if: >-
startsWith(github.repository, 'elementor/')
&& inputs.skip_smoke != true
&& needs.verify-published.outputs.core_zip_available == 'true'
&& (needs.verify-published.outputs.pro_version == ''
|| needs.verify-published.outputs.pro_zip_available == 'true')
steps:
- name: Checkout this repository
if: github.event_name != 'workflow_call'
uses: actions/checkout@v4
with:
persist-credentials: false

- name: Checkout post-release actions
if: github.event_name == 'workflow_call'
uses: actions/checkout@v4
with:
repository: elementor/elementor-editor-github-actions
ref: ${{ inputs.actions_ref }}
persist-credentials: false

- name: Install Dependencies
uses: ./.github/actions/install-deps

- name: Download plugin zips
uses: actions/download-artifact@v4
with:
name: released-plugins
path: released-plugins

- name: Require released zip files
env:
PRO_VERSION: ${{ needs.verify-published.outputs.pro_version }}
run: |
test -f released-plugins/elementor.zip
if [ -n "$PRO_VERSION" ]; then
test -f released-plugins/elementor-pro.zip
fi

- name: Setup WP Env
uses: ./actions/setup-wp-env
with:
php: '8.2'
wp: '7.0.1'
active-theme: 'hello-elementor'
themes: |-
https://downloads.wordpress.org/theme/hello-elementor.zip
mappings: |-
elementor-templates:./stubs/upgrade-templates
released-plugins:./released-plugins
config: |-
ELEMENTOR_SHOW_HIDDEN_EXPERIMENTS:1

- name: Install current wordpress.org Elementor
run: npx wp-env run tests-cli wp plugin install elementor --activate

- name: Setup Elementor Env
uses: ./actions/setup-elementor-env
with:
env: 'testing'
templates: |-
elementor-templates

- name: Upgrade site and run editor smoke
uses: ./actions/post-release-smoke
with:
core-version: ${{ needs.verify-published.outputs.core_version }}
pro-version: ${{ needs.verify-published.outputs.pro_version }}
2 changes: 1 addition & 1 deletion .github/workflows/test-actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
- name: Setup WP Env
uses: ./actions/setup-wp-env
with:
php: '8.0'
php: '8.2'
wp: '7.0.1'
active-theme: 'hello-elementor'
themes: |-
Expand Down
13 changes: 13 additions & 0 deletions actions/post-release-smoke/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Post-release smoke

Mirrors Core [`plugin-upgrade-test.yml`](https://github.com/elementor/elementor/blob/main/.github/workflows/plugin-upgrade-test.yml):

1. Start wp-env **without** mounting Elementor, then `wp plugin install elementor` from wordpress.org (same as Core's empty plugins + CLI install).
2. Import a heading page (same idea as `setup.sh` + heading template).
3. Fail if the released Core version is **older** than the installed wordpress.org version (refuses a silent downgrade). Same-version reinstall is allowed.
4. Deactivate/uninstall, then `wp plugin install <released-zip> --activate` (avoid in-place `--force` while Elementor hooks still run).
5. Playwright: frontend heading still says `Test title`, that heading is visible in the editor iframe, create a new page, canvas iframe loads.

This is not Core elements-regression screenshots. It only checks that the **published** zip upgrades a current `.org` site and the editor boots.

The reusable `Post-Release Check` workflow wires the steps. Core/Pro dispatch that workflow; do not add this suite to Core/Pro PR CI.
122 changes: 122 additions & 0 deletions actions/post-release-smoke/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
name: Post-release smoke
description: Upgrade from wordpress.org current Elementor to the released zip, then smoke the editor like Core plugin-upgrade-test.yml.

inputs:
core-version:
description: 'Expected Core plugin version after upgrade.'
required: true
pro-version:
description: 'Expected Pro plugin version after install. Empty skips Pro.'
required: false
default: ''
base-url:
description: 'wp-env testing URL.'
required: false
default: 'http://localhost:8889'
wp-username:
required: false
default: 'admin'
wp-password:
required: false
default: 'password'

runs:
using: composite
steps:
- name: Quiet editor popups
shell: bash
run: |
npx wp-env run tests-cli wp option update e_editor_counter 10
npx wp-env run tests-cli wp option update elementor_checklist '{"last_opened_timestamp":null,"first_closed_checklist_in_editor":true,"is_popup_minimized":false,"steps":[],"should_open_in_editor":false,"editor_visit_count":10}'
npx wp-env run tests-cli wp user meta add admin announcements_user_counter 999 || true

- name: Resolve existing heading page
id: seed
shell: bash
run: |
RAW=$(npx wp-env run tests-cli wp post list \
--post_type=page \
--name=upgrade-heading \
--field=ID \
--posts_per_page=1)
PAGE_ID=$(echo "$RAW" | tail -n 1 | tr -d '\r')
if [ -z "$PAGE_ID" ] || ! [[ "$PAGE_ID" =~ ^[0-9]+$ ]]; then
echo "Imported upgrade-heading page was not found (got: ${PAGE_ID:-empty})."
exit 1
fi
echo "existing_page_id=$PAGE_ID" >> "$GITHUB_OUTPUT"

- name: Refuse Core downgrade
shell: bash
env:
TARGET_CORE: ${{ inputs.core-version }}
run: |
RAW=$(npx wp-env run tests-cli wp plugin get elementor --field=version)
INSTALLED=$(echo "$RAW" | tail -n 1 | tr -d '\r')
if [ -z "$INSTALLED" ]; then
echo "Could not read the installed wordpress.org Elementor version."
exit 1
fi
export INSTALLED
node -e '
const installed = process.env.INSTALLED;
const target = process.env.TARGET_CORE;
const parts = (value) =>
value
.split("-")[0]
.split(".")
.map((part) => Number.parseInt(part, 10) || 0);
const left = parts(target);
const right = parts(installed);
for (let index = 0; index < 3; index += 1) {
const a = left[index] ?? 0;
const b = right[index] ?? 0;
if (a > b) process.exit(0);
if (a < b) {
console.error(
"Refusing to install Core " +
target +
" over wordpress.org " +
installed +
" (downgrade). Dispatch the current GA, or skip smoke.",
);
process.exit(1);
}
}
console.log(
"wordpress.org Elementor " +
installed +
" -> released " +
target,
);
'

- name: Upgrade site
shell: bash
run: |
npx wp-env run tests-cli wp plugin uninstall elementor --deactivate
npx wp-env run tests-cli wp plugin install ./released-plugins/elementor.zip --activate
if [ -f ./released-plugins/elementor-pro.zip ]; then
npx wp-env run tests-cli wp plugin uninstall elementor-pro --deactivate || true
npx wp-env run tests-cli wp plugin install ./released-plugins/elementor-pro.zip --activate
fi
npx wp-env run tests-cli wp plugin list
npx wp-env run tests-cli wp cache flush
npx wp-env run tests-cli wp elementor flush-css

- name: Install Playwright Chromium
shell: bash
working-directory: ${{ github.action_path }}
run: npx playwright install chromium

- name: Run editor smoke
shell: bash
working-directory: ${{ github.action_path }}
env:
WP_BASE_URL: ${{ inputs.base-url }}
WP_USERNAME: ${{ inputs.wp-username }}
WP_PASSWORD: ${{ inputs.wp-password }}
CORE_VERSION: ${{ inputs.core-version }}
PRO_VERSION: ${{ inputs.pro-version }}
EXISTING_PAGE_ID: ${{ steps.seed.outputs.existing_page_id }}
run: npx playwright test
9 changes: 9 additions & 0 deletions actions/post-release-smoke/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "@elementor/post-release-smoke",
"author": "Elementor Team",
"license": "GPL-3.0-or-later",
"private": true,
"dependencies": {
"@playwright/test": "^1.51.0"
}
}
22 changes: 22 additions & 0 deletions actions/post-release-smoke/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { defineConfig } from '@playwright/test';

import { timeouts } from './timeouts';

const baseURL = process.env.WP_BASE_URL ?? 'http://localhost:8889';

export default defineConfig({
testDir: './tests',
timeout: timeouts.editorLoad,
expect: {
timeout: timeouts.longAction,
},
fullyParallel: false,
retries: 0,
workers: 1,
use: {
baseURL,
headless: true,
viewport: { width: 1440, height: 960 },
trace: 'retain-on-failure',
},
});
Loading
Loading