mirror of https://github.com/rspamd/rspamd.git
Rapid spam filtering system
https://rspamd.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
5.6 KiB
154 lines
5.6 KiB
name: WebUI E2E (Playwright)
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
image:
|
|
required: true
|
|
type: string
|
|
name:
|
|
required: true
|
|
type: string
|
|
|
|
concurrency:
|
|
group: webui-e2e-playwright-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
e2e:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
permissions:
|
|
contents: read
|
|
container:
|
|
image: ${{ inputs.image }}
|
|
options: --user root
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- version: 1.45.3
|
|
label: legacy
|
|
- version: latest
|
|
label: latest
|
|
steps:
|
|
- name: Check out source code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
path: src
|
|
|
|
- name: Define install prefix
|
|
run: echo "PREFIX=${GITHUB_WORKSPACE}/install" >> "$GITHUB_ENV"
|
|
|
|
- name: Download rspamd binary from build job
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
name: rspamd-binary-${{ inputs.name }}
|
|
path: ${{ env.PREFIX }}
|
|
|
|
- name: Prepare rspamd configuration
|
|
run: |
|
|
mkdir -p ${PREFIX}/etc/rspamd/local.d
|
|
cp -r src/conf/* ${PREFIX}/etc/rspamd/
|
|
echo 'static_dir = "${PREFIX}/share/rspamd/www";' > ${PREFIX}/etc/rspamd/local.d/worker-controller.inc
|
|
echo 'password = "$2$8y16z4benwtsemhhcsdtxc6zem1muuhj$pufmrdhm41s53eccisds6rxych3khq493jhqra8r1i3jto93dt7b";' >> ${PREFIX}/etc/rspamd/local.d/worker-controller.inc
|
|
echo 'enable_password = "$2$hkmgaqejragy47tfe18k7r8zf4wwfegt$jdrfna838b9f4mqu73q858t3zjpse1kw8mw7e6yeftabq1of1sry";' >> ${PREFIX}/etc/rspamd/local.d/worker-controller.inc
|
|
echo 'secure_ip = "0";' >> ${PREFIX}/etc/rspamd/local.d/worker-controller.inc
|
|
cat > ${PREFIX}/etc/rspamd/local.d/logging.inc << 'EOF'
|
|
type = "console";
|
|
level = "error";
|
|
EOF
|
|
# Disable redis dependent modules for WebUI tests
|
|
echo 'redis { enabled = false; }' > ${PREFIX}/etc/rspamd/local.d/modules.conf
|
|
chmod +x ${PREFIX}/bin/rspamd
|
|
mkdir -p /var/run/rspamd /var/lib/rspamd
|
|
chown $USER:$USER /var/run/rspamd /var/lib/rspamd
|
|
|
|
- name: Start rspamd and wait for WebUI
|
|
run: |
|
|
${PREFIX}/bin/rspamd -c ${PREFIX}/etc/rspamd/rspamd.conf --insecure &
|
|
# Initial delay before polling (in seconds)
|
|
initial_delay=5
|
|
sleep "$initial_delay"
|
|
# Wait up to 60 seconds for WebUI to respond
|
|
max_retries=30
|
|
for i in $(seq 1 "$max_retries"); do
|
|
http_code=$(wget -qO- --server-response http://localhost:11334/ping 2>&1 | awk '/^[[:space:]]*HTTP/ {print $2}' | tail -n1 || true)
|
|
if [ "$http_code" = "200" ]; then
|
|
elapsed=$(( initial_delay + (i - 1) * 2 ))
|
|
echo "Rspamd WebUI is up (HTTP 200) after $elapsed seconds"
|
|
break
|
|
elif [ -n "$http_code" ] && [ "$http_code" != "000" ]; then
|
|
echo "Unexpected HTTP code $http_code from /ping; failing"
|
|
exit 1
|
|
fi
|
|
echo "Waiting for rspamd... ($i/$max_retries)"
|
|
sleep 2
|
|
done
|
|
|
|
if [ "$i" -eq "$max_retries" ] && [ "$http_code" != "200" ]; then
|
|
total_wait=$(( initial_delay + max_retries * 2 ))
|
|
echo "ERROR: rspamd WebUI did not become available after $total_wait seconds"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Install Node.js
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 20
|
|
|
|
- name: Cache Playwright browsers
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: .cache/ms-playwright-${{ matrix.label }}
|
|
key: browsers-${{ matrix.label }}-${{ runner.os }}
|
|
|
|
- id: run-playwright
|
|
name: Run Playwright tests (${{ matrix.label }})
|
|
env:
|
|
HOME: /root
|
|
PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.cache/ms-playwright-${{ matrix.label }}
|
|
run: |
|
|
set -e
|
|
mkdir -p test-${{ matrix.label }}
|
|
cp -r src/test/playwright test-${{ matrix.label }}/
|
|
cd test-${{ matrix.label }}/playwright
|
|
|
|
npm init -y --silent
|
|
echo "::group::Installing Playwright ${{ matrix.label }}"
|
|
npm install --no-save --silent @playwright/test@${{ matrix.version }}
|
|
npx playwright --version
|
|
npx playwright install --with-deps
|
|
echo "::endgroup::"
|
|
|
|
echo "::group::Running tests (${{ matrix.label }})"
|
|
# Run tests; store Playwright artifacts (traces/videos) separately from HTML report
|
|
ARTIFACTS_DIR="$GITHUB_WORKSPACE/playwright-artifacts-${{ matrix.label }}"
|
|
HTML_OUT="$GITHUB_WORKSPACE/playwright-report-${{ matrix.label }}"
|
|
set +e
|
|
npx playwright test --output="$ARTIFACTS_DIR"
|
|
PW_STATUS=$?
|
|
set -e
|
|
REPORT_DIR="$PWD/playwright-report"
|
|
if [ -d "$REPORT_DIR" ]; then
|
|
mv "$REPORT_DIR" "$HTML_OUT"
|
|
fi
|
|
echo "report_path=$HTML_OUT" >> "$GITHUB_OUTPUT"
|
|
echo "::endgroup::"
|
|
exit $PW_STATUS
|
|
|
|
- name: Upload Playwright reports (${{ matrix.label }})
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: playwright-report-${{ matrix.label }}
|
|
path: ${{ github.workspace }}/playwright-report-${{ matrix.label }}
|
|
if-no-files-found: ignore
|
|
|
|
- name: Upload Playwright artifacts on failure (${{ matrix.label }})
|
|
if: failure()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: playwright-artifacts-${{ matrix.label }}
|
|
path: ${{ github.workspace }}/playwright-artifacts-${{ matrix.label }}
|
|
if-no-files-found: ignore
|