caterium-app/.github/workflows/deploy-timeweb.yml
pavlov346346-source bc3f186992
One-page banquet menu for the client (#36)
Add a single-page A4 preview and PDF for all selected banquet dishes or a ready-menu selection, with company branding and optional costs. Preserve draft/order state and saved line prices, enforce access and tenant scope, and fail clearly rather than clipping oversized menus. Nineteen targeted browser scenarios passed twice and the generated iPhone PDF was visually checked. Full main QA must pass before the existing automatic production promotion; production verification includes the new renderer and real-asset client menu export.
2026-09-20 12:54:42 +03:00

135 lines
4.9 KiB
YAML

name: Verify Caterium on Timeweb
on:
workflow_run:
workflows: ["Caterium QA", "Caterium Direct Production"]
types: [completed]
workflow_dispatch:
permissions:
contents: read
concurrency:
group: caterium-timeweb-production
cancel-in-progress: false
jobs:
verify:
if: >-
github.event_name == 'workflow_dispatch' ||
(github.event.workflow_run.conclusion == 'success' &&
((github.event.workflow_run.name == 'Caterium QA' &&
github.event.workflow_run.head_branch == 'production') ||
(github.event.workflow_run.name == 'Caterium Direct Production' &&
github.event.workflow_run.head_branch == 'main')))
runs-on: ubuntu-latest
timeout-minutes: 25
env:
TIMEWEB_BASE_URL: https://app.caterium.ru
steps:
# A GITHUB_TOKEN push to production does not start another push workflow.
# Observe successful promotion directly and read its published branch.
- name: Checkout tested production revision
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.name == 'Caterium QA' && github.event.workflow_run.head_sha || 'production' }}
- name: Wait for the exact published assets
timeout-minutes: 18
shell: bash
run: |
set -euo pipefail
files=(
index.html
app-runtime.js
core/login-signature-v1776.js
core/login-signature-v1776.css
core/help-center.js
core/help-center.css
core/catalog-pricing.js
core/client-menu.css
core/ops-ux-v1762.js
core/mobile-order.js
core/banquet-menu.js
core/banquet-client-menu.js
core/data-layer-v1773.js
core/trial-demo.js
core/training-catalog.js
legacy/bootstrap.js
caterium-mark-light.svg
service-worker.js
)
temp_dir="$(mktemp -d)"
trap 'rm -rf "$temp_dir"' EXIT
revision="$(git rev-parse HEAD)"
echo "Verifying tested production revision: $revision"
for file in "${files[@]}"; do test -s "public/$file"; done
for attempt in $(seq 1 18); do
stamp="${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}-${attempt}"
echo "Attempt $attempt/18"
matched=true
: > "$temp_dir/hashes.txt"
for file in "${files[@]}"; do
expected="$(sha256sum "public/$file" | awk '{print $1}')"
if ! curl -fsSL --connect-timeout 10 --max-time 20 \
-H 'Cache-Control: no-cache' \
"${TIMEWEB_BASE_URL}/${file}?deploy_check=${stamp}" \
-o "$temp_dir/asset"; then
echo "Not reachable yet: $file"
matched=false
break
fi
actual="$(sha256sum "$temp_dir/asset" | awk '{print $1}')"
echo "$file expected=$expected actual=$actual"
if [ "$actual" != "$expected" ]; then
echo "Waiting for updated asset: $file"
matched=false
break
fi
printf '%s %s\n' "$actual" "$file" >> "$temp_dir/hashes.txt"
done
if [ "$matched" = true ]; then
echo "PASS: all ${#files[@]} production assets match the tested revision."
{
echo '## Timeweb publication verified'
echo "Revision: \`$revision\`"
echo
echo 'All checked production assets match byte-for-byte:'
echo '```text'
cat "$temp_dir/hashes.txt"
echo '```'
} >> "$GITHUB_STEP_SUMMARY"
exit 0
fi
sleep 30
done
echo '::error::Timeweb did not publish the tested assets within the allotted retries.'
exit 1
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: npx playwright install --with-deps chromium
- name: Check the published loading screen, Help, clients and promotions
timeout-minutes: 4
run: node tests/production-ui-smoke.mjs
- name: Check the published mobile menu form and return arrow
timeout-minutes: 4
run: node tests/production-mobile-menu.mjs
- name: Check the published optional training catalog
timeout-minutes: 4
run: node tests/production-training-catalog.mjs
- name: Check the published single-page banquet menu
timeout-minutes: 4
run: node tests/production-banquet-client-menu.mjs
- name: Save production UI verification
if: always()
uses: actions/upload-artifact@v4
with:
name: production-ui-verification
path: production-ui-results/
if-no-files-found: ignore
retention-days: 7