Fix duplicate rendering issue caused by failure to restore ibCount during batch merging #14618
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: <Web> Interface check | |
on: [pull_request] | |
# github.head_ref is only defined on pull_request events | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.actor }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
env: | |
PR_NUMBER: ${{ github.event.pull_request.number }} | |
jobs: | |
dts-and-size: | |
if: | |
(! contains(github.event.pull_request.body, '[X] does not change any runtime related code or build configuration')) | |
runs-on: ubuntu-latest | |
outputs: | |
SPINE_WASM_UP_TO_DATE_BASE: ${{ steps.check-wasm-up-to-date-base.outputs.SPINE_WASM_UP_TO_DATE_BASE }} | |
SPINE_WASM_UP_TO_DATE_HEAD: ${{ steps.check-wasm-up-to-date-head.outputs.SPINE_WASM_UP_TO_DATE_HEAD }} | |
strategy: | |
fail-fast: false | |
matrix: | |
config: | |
- { target: base } | |
- { target: head } | |
steps: | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: '18.x' | |
- name: Setup emsdk | |
uses: mymindstorm/setup-emsdk@v14 | |
with: | |
version: 3.1.41 | |
- name: Verify | |
run: | | |
which emcc | |
emcc -v | |
- name: Install ninja | |
run: | | |
if ! command -v ninja &> /dev/null; then | |
echo "Ninja not found, installing..." | |
# sudo apt update | |
sudo apt install ninja-build | |
else | |
echo "Ninja is already installed." | |
10000 | fi |
which ninja | |
- uses: actions/checkout@v4 | |
name: Checkout Base Ref | |
if: ${{ matrix.config.target == 'base' }} | |
with: | |
repository: ${{ github.event.pull_request.base.repo.full_name }} | |
ref: ${{ github.base_ref }} | |
- uses: actions/checkout@v4 | |
name: Checkout Head Ref for using the latest .github/workflows for base | |
if: ${{ matrix.config.target == 'base' }} | |
with: | |
path: './engine-HEAD' | |
- uses: actions/checkout@v4 | |
name: Checkout Head Ref | |
if: ${{ matrix.config.target == 'head' }} | |
- name: Show Refs | |
run: | | |
echo "Commit log:" | |
git --no-pager log -3 | |
echo "git status" | |
git status | |
- name: Apply emscripten patches (base) | |
if: ${{ matrix.config.target == 'base' }} | |
run: | | |
ls -l $EMSDK/upstream/emscripten/ | |
echo "--------------------------------- Save bind.cpp ---------------------------------" | |
cp $EMSDK/upstream/emscripten/system/lib/embind/bind.cpp $EMSDK/upstream/emscripten/system/lib/embind/bind.cpp.bak | |
echo "--------------------------------- Apply embind bind.cpp patches ---------------------------------" | |
cp -f ./engine-HEAD/.github/workflows/emscripten-patches/embind/bind.cpp $EMSDK/upstream/emscripten/system/lib/embind/ | |
echo "--------------------------------- Apply patches DONE! ---------------------------------" | |
cat $EMSDK/upstream/emscripten/system/lib/embind/bind.cpp | |
- name: Apply emscripten patches (head) | |
if: ${{ matrix.config.target == 'head' }} | |
run: | | |
ls -l $EMSDK/upstream/emscripten/ | |
echo "--------------------------------- Save bind.cpp ---------------------------------" | |
cp $EMSDK/upstream/emscripten/system/lib/embind/bind.cpp $EMSDK/upstream/emscripten/system/lib/embind/bind.cpp.bak | |
echo "--------------------------------- Apply embind bind.cpp patches ---------------------------------" | |
cp -f .github/workflows/emscripten-patches/embind/bind.cpp $EMSDK/upstream/emscripten/system/lib/embind/ | |
echo "--------------------------------- Apply patches DONE! ---------------------------------" | |
cat $EMSDK/upstream/emscripten/system/lib/embind/bind.cpp | |
- run: | | |
echo "EXT_VERSION=$(node .github/workflows/get-native-external-version.js)" >> $GITHUB_ENV | |
- uses: actions/checkout@v4 | |
name: Download external | |
with: | |
repository: cocos/cocos-engine-external | |
path: './native/external' | |
ref: "${{ env.EXT_VERSION }}" | |
fetch-depth: 1 | |
- name: Build Spine 3.8 WASM | |
run: | | |
cd ./native/cocos/editor-support/spine-wasm | |
sed -i 's/set(BUILD_WASM 0)/set(BUILD_WASM 1)/g' CMakeLists.txt | |
sed -i 's/set(SPINE_VERSION "4.2")/set(SPINE_VERSION "3.8")/g' CMakeLists.txt | |
cat CMakeLists.txt | |
rm -rf build-wasm | |
mkdir build-wasm | |
cd build-wasm | |
emcmake cmake .. -GNinja | |
ninja | |
ls -l | |
- name: Build Spine 3.8 ASMJS | |
run: | | |
cd ./native/cocos/editor-support/spine-wasm | |
sed -i 's/set(BUILD_WASM 1)/set(BUILD_WASM 0)/g' CMakeLists.txt | |
sed -i 's/set(SPINE_VERSION "4.2")/set(SPINE_VERSION "3.8")/g' CMakeLists.txt | |
cat CMakeLists.txt | |
rm -rf build-asmjs | |
mkdir build-asmjs | |
cd build-asmjs | |
emcmake cmake .. -GNinja | |
ninja | |
ls -l | |
- name: Copy Spine 3.8 files to external directory | |
run: | | |
SPINE_VERSION="3.8" | |
DIST_PATH="dist-${{ matrix.config.target }}/3.8" | |
mkdir -p $DIST_PATH | |
cp ./native/cocos/editor-support/spine-wasm/build-wasm/spine.wasm ./$DIST_PATH/ | |
cp ./native/cocos/editor-support/spine-wasm/build-wasm/spine.js ./$DIST_PATH/spine.wasm.js | |
cp ./native/cocos/editor-support/spine-wasm/build-asmjs/spine.js.mem ./$DIST_PATH/ | |
cp ./native/cocos/editor-support/spine-wasm/build-asmjs/spine.js ./$DIST_PATH/spine.asm.js | |
mkdir -p ./native/external/emscripten/spine/$SPINE_VERSION | |
echo "-------- Before replace spine wasm -----------" | |
ls -l ./native/external/emscripten/spine/$SPINE_VERSION | |
cp -f ./$DIST_PATH/* ./native/external/emscripten/spine/$SPINE_VERSION | |
echo "-------- After replace spine wasm ------------" | |
ls -l ./native/external/emscripten/spine/$SPINE_VERSION | |
echo "-----------------------------------------------" | |
cd ./native/external | |
git status | |
- name: Build Spine 4.2 WASM | |
run: | | |
cd ./native/cocos/editor-support/spine-wasm | |
sed -i 's/set(BUILD_WASM 0)/set(BUILD_WASM 1)/g' CMakeLists.txt | |
sed -i 's/set(SPINE_VERSION "3.8")/set(SPINE_VERSION "4.2")/g' CMakeLists.txt | |
cat CMakeLists.txt | |
git status | |
rm -rf build-wasm | |
mkdir build-wasm | |
cd build-wasm | |
emcmake cmake .. -GNinja | |
ninja | |
ls -l | |
- name: Build Spine 4.2 ASMJS | |
run: | | |
cd ./native/cocos/editor-support/spine-wasm | |
sed -i 's/set(SPINE_VERSION "3.8")/set(SPINE_VERSION "4.2")/g' CMakeLists.txt | |
sed -i 's/set(BUILD_WASM 1)/set(BUILD_WASM 0)/g' CMakeLists.txt | |
cat CMakeLists.txt | |
git status | |
rm -rf build-asmjs | |
mkdir build-asmjs | |
cd build-asmjs | |
emcmake cmake .. -GNinja | |
ninja | |
ls -l | |
- name: Copy Spine 4.2 files to external directory | |
run: | | |
DIST_PATH="dist-${{ matrix.config.target }}/4.2" | |
mkdir -p $DIST_PATH | |
cp ./native/cocos/editor-support/spine-wasm/build-wasm/spine.wasm ./$DIST_PATH/ | |
cp ./native/cocos/editor-support/spine-wasm/build-wasm/spine.js ./$DIST_PATH/spine.wasm.js | |
cp ./native/cocos/editor-support/spine-wasm/build-asmjs/spine.js.mem ./$DIST_PATH/ | |
cp ./native/cocos/editor-support/spine-wasm/build-asmjs/spine.js ./$DIST_PATH/spine.asm.js | |
mkdir -p ./native/external/emscripten/spine/4.2/ | |
echo "-------- Before replace spine wasm -----------" | |
ls -l ./native/external/emscripten/spine/4.2/ | |
cp -f ./$DIST_PATH/* ./native/external/emscripten/spine/4.2/ | |
echo "-------- After replace spine wasm ------------" | |
ls -l ./native/external/emscripten/spine/4.2/ | |
echo "-----------------------------------------------" | |
cd ./native/external | |
git status | |
- name: Check if spine wasm files are up-to-date (base) | |
id: check-wasm-up-to-date-base | |
if: ${{ matrix.config.target == 'base' }} | |
run: | | |
cd ./native/external | |
diff_output=$(git diff) | |
if [ -n "$diff_output" ]; then | |
echo "SPINE_WASM_UP_TO_DATE_BASE=false" >> $GITHUB_OUTPUT | |
else | |
echo "SPINE_WASM_UP_TO_DATE_BASE=true" >> $GITHUB_OUTPUT | |
fi | |
- name: Check if spine wasm files are up-to-date (head) | |
id: check-wasm-up-to-date-head | |
if: ${{ matrix.config.target == 'head' }} | |
run: | | |
cd ./native/external | |
diff_output=$(git diff) | |
if [ -n "$diff_output" ]; then | |
echo "SPINE_WASM_UP_TO_DATE_HEAD=false" >> $GITHUB_OUTPUT | |
else | |
echo "SPINE_WASM_UP_TO_DATE_HEAD=true" >> $GITHUB_OUTPUT | |
fi | |
- name: Upload Spine Artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: spine-emscripten-${{ matrix.config.target }} | |
path: dist-${{ matrix.config.target }} | |
- name: Build Declarations (base) | |
if: ${{ matrix.config.target == 'base' }} | |
run: | | |
ROOT_DIR=$(pwd) | |
npm install | |
cd ./engine-HEAD | |
npm install --ignore-scripts | |
# Use package-size-check.js in HEAD | |
node .github/workflows/package-size-check.js "$ROOT_DIR" | |
- name: Build Declarations (head) | |
if: ${{ matrix.config.target == 'head' }} | |
run: | | |
ROOT_DIR=$(pwd) | |
npm install | |
node .github/workflows/package-size-check.js "$ROOT_DIR" | |
- name: Pack for compare | |
run: | | |
mkdir package-for-compare | |
cp ./bin/.declarations/cc.d.ts ./package-for-compare | |
cp -r build-cc-out-2d-empty-legacy-pipline ./package-for-compare | |
cp -r build-cc-out-2d-legacy-pipline ./package-for-compare | |
cp -r build-cc-out-2d-new-pipline ./package-for-compare | |
cp -r build-cc-out-all ./package-for-compare | |
cp -r build-cc-out-all-web ./package-for-compare | |
- name: Upload Declarations Artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: package-for-compare-${{ matrix.config.target }} | |
path: package-for-compare | |
- name: Restore patches | |
run: | | |
echo "-------------------------- Restore patches ---------------------------------" | |
rm $EMSDK/upstream/emscripten/system/lib/embind/bind.cpp | |
mv $EMSDK/upstream/emscripten/system/lib/embind/bind.cpp.bak $EMSDK/upstream/emscripten/system/lib/embind/bind.cpp | |
echo "-------------------------- Restore patches DONE! ---------------------------------" | |
cat $EMSDK/upstream/emscripten/system/lib/embind/bind.cpp | |
interface_check: | |
if: | |
(! contains(github.event.pull_request.body, '[X] does not change any runtime related code or build configuration')) | |
runs-on: ubuntu-latest | |
needs: dts-and-size | |
steps: | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: '18.x' | |
- uses: actions/checkout@v4 | |
- name: Download Artifacts (base) | |
uses: actions/download-artifact@v4 | |
with: | |
name: package-for-compare-base | |
path: artifacts/package-for-compare-base | |
- name: Download Artifacts (head) | |
uses: actions/download-artifact@v4 | |
with: | |
name: package-for-compare-head | |
path: artifacts/package-for-compare-head | |
- uses: LouisBrunner/diff-action@v2.0.0 | |
with: | |
old: ./artifacts/package-for-compare-base/cc.d.ts | |
new: ./artifacts/package-for-compare-head/cc.d.ts | |
mode: addition | |
tolerance: worse | |
output: ./interface-diff.txt | |
- name: optimize interface check report | |
run: | | |
cat ./interface-diff.txt | |
node ./.github/workflows/interface-check-report.js | |
- name: After optimize interface check report | |
run: | | |
cat ./interface-diff.txt | |
- name: Check Package Size | |
run: | | |
PACKAGE_SIZE_INFO="## Code Size Check Report | |
| Wechat (WASM) | Before | After | Diff | | |
|:-:|:-:|:-:|:-:|" | |
BASE_SIZE=0 | |
HEAD_SIZE=0 | |
DIFF_SIZE=0 | |
ICON="✅ " | |
reset_diff_vars() { | |
BASE_SIZE=0 | |
HEAD_SIZE=0 | |
DIFF_SIZE=0 | |
ICON="✅ " | |
} | |
check_diff() { | |
ccbuild_out_folder_name="$1" | |
if [ -d ./artifacts/package-for-compare-base/$ccbuild_out_folder_name ]; then | |
BASE_SIZE=$(du -sb ./artifacts/package-for-compare-base/$ccbuild_out_folder_name | awk '{print $1}') | |
fi | |
HEAD_SIZE=$(du -sb ./artifacts/package-for-compare-head/$ccbuild_out_folder_name | awk '{print $1}') | |
DIFF_SIZE=$((HEAD_SIZE - BASE_SIZE)) | |
if [ "$DIFF_SIZE" -gt 0 ]; then | |
ICON="⚠️ +" | |
elif [ "$DIFF_SIZE" -lt 0 ]; then | |
ICON="👍 " | |
else | |
ICON="✅ " | |
fi | |
} | |
# Check Wechat platform | |
check_diff "build-cc-out-2d-empty-legacy-pipline" | |
PACKAGE_SIZE_INFO=$(printf "%s\n%s\n" "${PACKAGE_SIZE_INFO}" "| 2D Empty (legacy pipeline) | $BASE_SIZE bytes | $HEAD_SIZE bytes | $ICON$DIFF_SIZE bytes |") | |
reset_diff_vars | |
check_diff "build-cc-out-2d-legacy-pipline" | |
PACKAGE_SIZE_INFO=$(printf "%s\n%s\n" "${PACKAGE_SIZE_INFO}" "| 2D All (legacy pipeline) | $BASE_SIZE bytes | $HEAD_SIZE bytes | $ICON$DIFF_SIZE bytes |") | |
reset_diff_vars | |
check_diff "build-cc-out-2d-new-pipline" | |
PACKAGE_SIZE_INFO=$(printf "%s\n%s\n" "${PACKAGE_SIZE_INFO}" "| 2D All (new pipeline) | $BASE_SIZE bytes | $HEAD_SIZE bytes | $ICON$DIFF_SIZE bytes |") | |
reset_diff_vars | |
check_diff "build-cc-out-all" | |
PACKAGE_SIZE_INFO=$(printf "%s\n%s\n" "${PACKAGE_SIZE_INFO}" "| (2D + 3D) All | $BASE_SIZE bytes | $HEAD_SIZE bytes | $ICON$DIFF_SIZE bytes |") | |
reset_diff_vars | |
PACKAGE_SIZE_INFO=$(printf "%s\n" "${PACKAGE_SIZE_INFO}") | |
# Check Web platform | |
WEB_PLATFORM_TABLE_HEADER="| Web (WASM + ASMJS) | Before | After | Diff | | |
|:-:|:-:|:-:|:-:|" | |
PACKAGE_SIZE_INFO=$(printf "%s\n\n\n%s\n" "${PACKAGE_SIZE_INFO}" "$WEB_PLATFORM_TABLE_HEADER") | |
check_diff "build-cc-out-all-web" | |
PACKAGE_SIZE_INFO=$(printf "%s\n%s\n" "${PACKAGE_SIZE_INFO}" "| (2D + 3D) All | $BASE_SIZE bytes | $HEAD_SIZE bytes | $ICON$DIFF_SIZE bytes |") | |
reset_diff_vars | |
printf "%s\n" "$PACKAGE_SIZE_INFO" | |
DIFF_FILE_PATH=./interface-diff.txt | |
ORIGINAL_DIFF_CONTENT=$(cat ${DIFF_FILE_PATH}) | |
echo "Original Diff: " | |
printf "%s\n" "$ORIGINAL_DIFF_CONTENT" | |
# Use printf to avoid \n missing | |
printf "%s\n" "$PACKAGE_SIZE_INFO" > ${DIFF_FILE_PATH} | |
printf "%s\n" "$ORIGINAL_DIFF_CONTENT" >> ${DIFF_FILE_PATH} | |
echo "Diff after merge: " | |
cat ${DIFF_FILE_PATH} | |
- name: Write PR number to file | |
uses: actions/github-script@v7 | |
with: | |
script: | | |
const fs = require('fs'); | |
fs.writeFileSync('interface-check-pr.txt', process.env.PR_NUMBER); | |
- name: Upload PR number artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: interface-check-pr.txt | |
path: | | |
interface-check-pr.txt | |
- name: Upload interface diff artifact | |
uses: actions/upload-artifact@v4 | |
with: | |
name: interface-diff.txt | |
path: | | |
./interface-diff.txt | |
check-wasm-up-to-date: | |
if: | |
(! contains(github.event.pull_request.body, '[X] does not change any runtime related code or build configuration')) | |
runs-on: ubuntu-latest | |
needs: dts-and-size | |
steps: | |
- name: Check if wasm files are up-to-date (head) | |
run: | | |
if [ "${{ needs.dts-and-size.outputs.SPINE_WASM_UP_TO_DATE_HEAD }}" == "true" ]; then | |
echo "Spine WASM files in native/external is up-to-date." | |
exit 0 | |
else | |
echo "Spine WASM files in native/external is not up-to-date, please update native/external-config.json" | |
exit 1 | |
fi |