# Скриншоты документации снимаются здесь и только здесь (#246). # # Съёмка на машине исполнителя даёт байтово разный PNG при одинаковом кадре: # сглаживание и хинтинг зависят от окружения. Измерено на истории — пересъёмка # в #231 изменила два файла из девяти на 7–8 байт, набор с беты все девять # целиком. Одно окружение убирает этот шум насовсем. # # Джоба ничего не коммитит: она публикует артефакт, который человек принимает # локально через `npm run docs:accept -- --reviewed --from=<распакованный>`. # Та же конструкция, что у golden-эталонов, и по той же причине: картинки # попадают в репозиторий через явное решение, а не через бота. name: Docs screenshots on: workflow_dispatch: inputs: ref: description: Ветка или SHA, с которого снимать required: false default: dev permissions: contents: read jobs: capture: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 with: ref: ${{ inputs.ref }} - uses: actions/setup-node@v7 with: node-version: 22 cache: npm - run: npm ci # Тот же кэш и тот же отказ от --with-deps, что в smoke/golden (#175, #206): # системные библиотеки Chromium уже в образе раннера. - name: Кэш браузеров Playwright id: pw uses: actions/cache@v6 with: path: ~/.cache/ms-playwright key: playwright-${{ runner.os }}-${{ hashFiles('package-lock.json') }} - name: Install pinned Chromium if: steps.pw.outputs.cache-hit != 'true' run: npx playwright install chromium - name: Build the bundle the screenshots must come from run: npm run build - name: Capture run: node demo/docs/capture.mjs # Вердикт до всякой приёмки. Само число изменившихся файлов ничего не # говорит: набор, снятый другим браузером, меняет их все, и это нормально # ровно один раз — при переходе на канонический прогон. Сравнивать надо # браузер: тот же Chromium и десять изменившихся картинок означают, что # изменился продукт (или что-то не так), другой Chromium — ожидаемую # разницу рендеринга. - name: Вердикт run: | git status --porcelain docs/images changed=$(git diff --name-only docs/images | grep -c png || true) before=$(git show HEAD:docs/images/screenshots.json | node -e \ "let s='';process.stdin.on('data',d=>s+=d).on('end',()=>{try{console.log(JSON.parse(s).chromium||'')}catch{console.log('')}})") after=$(node -e "console.log(require('./docs/images/screenshots.json').chromium)") echo "--- изменившихся PNG: $changed" echo "--- Chromium: было «${before:-не записан}», стало «$after»" if [ "$before" = "$after" ] && [ "$changed" -gt 0 ]; then echo "ВЕРДИКТ: тот же браузер, а картинки изменились — изменился продукт." echo "Смотрите на кадры: если изменение ожидаемое, принимайте." elif [ "$before" != "$after" ]; then echo "ВЕРДИКТ: браузер другой, поэтому переписаны все кадры сразу." echo "Это ожидаемо один раз — при переходе на канонический прогон." echo "Если Chromium сменился неожиданно, сверьте закреплённую версию в package-lock." else echo "ВЕРДИКТ: ничего не изменилось, принимать нечего." fi - name: Upload candidate uses: actions/upload-artifact@v7 with: name: docs-screenshots path: | docs/images/*.png docs/images/screenshots.json if-no-files-found: error