stages: [test] variables: PLAYWRIGHT_VERSION: "1.40.1" TESTIT_ADAPTER_VERSION: "4.1.1" TESTIT_CLI_VERSION: "2.9.3" TMS_SYNCSTORAGE_BIN: "build/.caches/syncstorage-v0.3.5-linux_amd64" BROWSER: "chromium" VIEWPORT: "1920x1080" WORKERS: "1" ADAPTER_MODE: "filter_tests" IMPORT_REALTIME: "false" run_tests: stage: test image: mcr.microsoft.com/playwright:v${PLAYWRIGHT_VERSION}-jammy timeout: 30m rules: - if: '$CI_PIPELINE_SOURCE == "trigger"' artifacts: when: always expire_in: 1 week paths: - playwright-report/ - test-results/ - tmp/filter.txt - service.log - playwright.config.js before_script: - | set -euo pipefail ADAPTER_MODE="${ADAPTER_MODE:-filter_tests}" case "$ADAPTER_MODE" in all_tests|filter_tests) ;; *) ADAPTER_MODE="filter_tests" ;; esac BROWSER="${BROWSER:-chromium}" case "$BROWSER" in chromium|firefox|webkit) ;; *) echo "BROWSER: chromium | firefox | webkit — получено: $BROWSER"; exit 1 ;; esac WORKERS="${WORKERS:-1}" case "$WORKERS" in *[!0-9]*|'') WORKERS="1" ;; esac IMPORT_REALTIME="${IMPORT_REALTIME:-false}" case "$IMPORT_REALTIME" in true|True|TRUE|1) IMPORT_REALTIME="true" ;; *) IMPORT_REALTIME="false" ;; esac VIEWPORT="${VIEWPORT:-1920x1080}" VIEWPORT_WIDTH="${VIEWPORT%x*}" VIEWPORT_HEIGHT="${VIEWPORT#*x}" test -n "$VIEWPORT_WIDTH" && test -n "$VIEWPORT_HEIGHT" \ || { echo "VIEWPORT: WxH, например 1920x1080"; exit 1; } export ADAPTER_MODE BROWSER WORKERS IMPORT_REALTIME VIEWPORT_WIDTH VIEWPORT_HEIGHT echo "▶ $BROWSER · ${VIEWPORT_WIDTH}x${VIEWPORT_HEIGHT} · workers=$WORKERS · $ADAPTER_MODE · realtime=$IMPORT_REALTIME" test -n "${URL:-}" && test -n "${PROJECT_ID:-}" && test -n "${CONFIGURATION_ID:-}" test -n "${TEST_RUN_ID:-}" || { echo "Нужен TEST_RUN_ID"; exit 1; } test -n "${TMS_PRIVATE_TOKEN:-}" || { echo "Добавьте TMS_PRIVATE_TOKEN в CI/CD Variables"; exit 1; } test -f "$TMS_SYNCSTORAGE_BIN" || { echo "Нет $TMS_SYNCSTORAGE_BIN — добавьте бинарник в git"; exit 1; } chmod +x "$TMS_SYNCSTORAGE_BIN" cat > playwright.config.js <<'EOF' const { defineConfig, devices } = require('@playwright/test'); const viewport = { width: parseInt(process.env.VIEWPORT_WIDTH || '1920', 10), height: parseInt(process.env.VIEWPORT_HEIGHT || '1080', 10), }; const workers = parseInt(process.env.WORKERS || '1', 10); module.exports = defineConfig({ workers, use: { screenshot: 'only-on-failure', viewport }, projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'], viewport } }, { name: 'firefox', use: { ...devices['Desktop Firefox'], viewport } }, { name: 'webkit', use: { ...devices['Desktop Safari'], viewport } }, ], reporter: [['line'], ['testit-adapter-playwright']], }); EOF npm init -y >/dev/null 2>&1 npm install "@playwright/test@${PLAYWRIGHT_VERSION}" "testit-adapter-playwright@${TESTIT_ADAPTER_VERSION}" touch service.log nohup "$TMS_SYNCSTORAGE_BIN" \ --testRunId "$TEST_RUN_ID" \ --port 49152 \ --baseURL "$URL" \ --privateToken "$TMS_PRIVATE_TOKEN" \ >> service.log 2>&1 & sleep 3 if [ "$ADAPTER_MODE" = "filter_tests" ]; then apt-get update -qq && apt-get install -y -qq python3-pip pip install --no-cache-dir "testit-cli==${TESTIT_CLI_VERSION}" mkdir -p tmp export TMS_TOKEN="$TMS_PRIVATE_TOKEN" testit autotests_filter \ --url "$URL" \ --configuration-id "$CONFIGURATION_ID" \ --testrun-id "$TEST_RUN_ID" \ --framework playwright \ --disable-cert-validation \ --output tmp/filter.txt [ -s tmp/filter.txt ] || echo empty > tmp/filter.txt fi script: - | set -euo pipefail export TMS_PRIVATE_TOKEN export TMS_URL="$URL" export TMS_PROJECT_ID="$PROJECT_ID" export TMS_CONFIGURATION_ID="$CONFIGURATION_ID" export TMS_CERT_VALIDATION=false export TMS_IMPORT_REALTIME="$IMPORT_REALTIME" export TMS_ADAPTER_MODE="1" export TMS_TEST_RUN_ID="$TEST_RUN_ID" PW_ARGS="--project=$BROWSER --workers=$WORKERS" if [ "$ADAPTER_MODE" = "filter_tests" ]; then FILTER=$(cat tmp/filter.txt) if [ -z "$FILTER" ] || [ "$FILTER" = "empty" ]; then echo "No tests to run" exit 0 fi npx playwright test $PW_ARGS --grep "$FILTER" else npx playwright test $PW_ARGS fi curl -fsS "http://127.0.0.1:49152/wait-completion?testRunId=${TEST_RUN_ID}" || true cat service.log 2>/dev/null || true