diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index c605ee82..217c09f5 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -847,6 +847,13 @@ jobs: - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7 with: node-version: 22 + # download-artifact распаковывает поверх checkout и не удаляет старые + # content-hashed чанки закоммиченного release-бандла (#657). Свежий + # артефакт должен быть единственным содержимым dist, иначе bundle-tree + # справедливо видит оставшиеся файлы как orphan assets. + - name: Очистить закоммиченный dist перед артефактом + run: | + node -e "require('node:fs').rmSync('dist', { recursive: true, force: true })" - name: Забрать собранный бандл uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: @@ -893,6 +900,9 @@ jobs: # Бандл приходит артефактом из job `frontend` (#336): та же сборка, но # один раз на прогон. Свежесть проверяет сам продукт — `assertFreshDemoBundle` # сверяет вшитый отпечаток с исходниками этого дерева. + - name: Очистить закоммиченный dist перед артефактом + run: | + node -e "require('node:fs').rmSync('dist', { recursive: true, force: true })" - name: Забрать собранный бандл uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: @@ -1013,6 +1023,9 @@ jobs: # Бандл приходит артефактом из job `frontend` (#336): та же сборка, но # один раз на прогон. Свежесть проверяет сам продукт — `assertFreshDemoBundle` # сверяет вшитый отпечаток с исходниками этого дерева. + - name: Очистить закоммиченный dist перед артефактом + run: | + node -e "require('node:fs').rmSync('dist', { recursive: true, force: true })" - name: Забрать собранный бандл uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: @@ -1117,6 +1130,9 @@ jobs: # Бандл приходит артефактом из job `frontend` (#336): та же сборка, но # один раз на прогон. Свежесть проверяет сам продукт — `assertFreshDemoBundle` # сверяет вшитый отпечаток с исходниками этого дерева. + - name: Очистить закоммиченный dist перед артефактом + run: | + node -e "require('node:fs').rmSync('dist', { recursive: true, force: true })" - name: Забрать собранный бандл uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7 with: diff --git a/test/validate-workflow.test.mjs b/test/validate-workflow.test.mjs index 919407df..32110270 100644 --- a/test/validate-workflow.test.mjs +++ b/test/validate-workflow.test.mjs @@ -57,6 +57,11 @@ test('бандл собирается один раз и приезжает бр assert.equal(builds.length, 1, 'бандл должен собираться ровно в одной job'); assert.equal(workflow.match(/name: card-bundle/g)?.length, 5, 'один upload и четыре download артефакта бандла (три браузерные job и стенд dev, #657)'); + const cleanDownloads = workflow.match( + /- name: Очистить закоммиченный dist перед артефактом\n\s+run: \|\n\s+node -e "require\('node:fs'\)\.rmSync\('dist', \{ recursive: true, force: true \}\)"\n\s+- name: Забрать собранный бандл\n\s+uses: actions\/download-artifact@[0-9a-f]+ # v7\n\s+with:\n\s+name: card-bundle\n\s+path: dist/g, + ) || []; + assert.equal(cleanDownloads.length, 4, + 'каждый download свежего бандла обязан сначала удалить старые content-hashed чанки checkout'); assert.equal(workflow.match(/name: card-test-build/g)?.length, 2, 'один upload и один download тестового дерева для smoke job'); assert.match(workflow, /name: card-test-build\n\s+path: test-build\//,