From c84bcd66c8ee7457295ca3c6f247b7ccde7ded99 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Tue, 14 Jul 2026 13:47:41 +0800 Subject: [PATCH 01/52] Remove GitHub Release step for test build --- .github/workflows/build.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5d95c0b..f16610b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ concurrency: cancel-in-progress: true permissions: - contents: write # needed for creating GitHub Releases + contents: read env: # ohos-node release version @@ -169,16 +169,6 @@ jobs: path: ${{ steps.find_hap.outputs.hap_path }} retention-days: 30 - # ── Step 8: Create GitHub Release (on tag push) ────────────────────── - - name: Create GitHub Release - if: startsWith(github.ref, 'refs/tags/v') - uses: softprops/action-gh-release@v2 - with: - files: ${{ steps.find_hap.outputs.hap_path }} - generate_release_notes: true - draft: false - prerelease: ${{ contains(github.ref, '-rc') || contains(github.ref, '-beta') }} - # ── Summary ────────────────────────────────────────────────────────── - name: Build summary if: always() From 941b6597663376baa81cca9e3a3edda5ecb60744 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Tue, 14 Jul 2026 13:49:54 +0800 Subject: [PATCH 02/52] Fix: remove npm cache path that doesn't exist at setup-node time --- .github/workflows/build.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f16610b..c6ac166 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,8 +47,6 @@ jobs: uses: actions/setup-node@v4 with: node-version: '24' - cache: 'npm' - cache-dependency-path: '.cache/electerm-web/package-lock.json' # ── Install system deps for native modules ──────────────────────────── - name: Install system dependencies From 03ebca48b2b38f9e946850f183f562c8ce55e9b9 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Tue, 14 Jul 2026 13:52:54 +0800 Subject: [PATCH 03/52] Fix: use npm install instead of npm ci (lock file out of sync) --- scripts/prepare-web.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/prepare-web.sh b/scripts/prepare-web.sh index d1cdd48..be006e0 100755 --- a/scripts/prepare-web.sh +++ b/scripts/prepare-web.sh @@ -65,7 +65,7 @@ cd "${CLONE_DIR}" # Install dependencies echo " Installing dependencies ..." -npm ci +npm install # Create .env from .sample.env echo " Creating .env ..." From f07961dd9954bcf587e62238b69ec23caa344421 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Tue, 14 Jul 2026 14:01:09 +0800 Subject: [PATCH 04/52] Fix: add --legacy-peer-deps to npm install and prune --- scripts/prepare-web.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/prepare-web.sh b/scripts/prepare-web.sh index be006e0..fef8e40 100755 --- a/scripts/prepare-web.sh +++ b/scripts/prepare-web.sh @@ -65,7 +65,7 @@ cd "${CLONE_DIR}" # Install dependencies echo " Installing dependencies ..." -npm install +npm install --legacy-peer-deps # Create .env from .sample.env echo " Creating .env ..." @@ -86,7 +86,7 @@ NODE_ENV=production npm run build # Prune dev dependencies to reduce size echo " Pruning devDependencies ..." -npm prune --production +npm prune --production --legacy-peer-deps # --- Bundle into rawfile ---------------------------------------------------- From 86dd4a469546c20bc4161db98498b674b90954ac Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Tue, 14 Jul 2026 14:13:04 +0800 Subject: [PATCH 05/52] Fix: remove @ohos/hvigor-ohos-plugin from oh-package.json5 (resolved by hvigor) --- oh-package.json5 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/oh-package.json5 b/oh-package.json5 index 4bb1805..79d4adf 100644 --- a/oh-package.json5 +++ b/oh-package.json5 @@ -19,7 +19,6 @@ }, "dependencies": {}, "devDependencies": { - "@ohos/hypium": "1.0.21", - "@ohos/hvigor-ohos-plugin": "5.0.2" + "@ohos/hypium": "1.0.21" } } From c18bc485cb451db06e644c3a41275bed8d16d720 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Tue, 14 Jul 2026 14:16:07 +0800 Subject: [PATCH 06/52] Fix: create .npmrc for hvigor (requires npm registry config) --- scripts/build-app.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 044873b..fd64367 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -153,6 +153,19 @@ EOF echo " ✓ build-profile.json5 generated" +# --- Configure npm registry for hvigor (uses pnpm internally) ---------------- + +echo "==> Configuring npm registry for hvigor ..." + +# hvigor requires an .npmrc file in the user's home directory +NPMRC_FILE="${HOME}/.npmrc" +if [ ! -f "${NPMRC_FILE}" ]; then + echo "registry=https://registry.npmjs.org/" > "${NPMRC_FILE}" + echo " ✓ Created ${NPMRC_FILE}" +else + echo " ✓ ${NPMRC_FILE} already exists" +fi + # --- Install ohpm dependencies ---------------------------------------------- echo "==> Installing ohpm dependencies ..." From f22d4c85d53f79a91ac23883672a28ed0e4a6a3b Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Tue, 14 Jul 2026 14:26:10 +0800 Subject: [PATCH 07/52] Fix: use HarmonyOS npm registry for hvigor plugin resolution --- scripts/build-app.sh | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index fd64367..918e3de 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -158,13 +158,12 @@ echo " ✓ build-profile.json5 generated" echo "==> Configuring npm registry for hvigor ..." # hvigor requires an .npmrc file in the user's home directory +# Use HarmonyOS npm registry which hosts @ohos/* packages NPMRC_FILE="${HOME}/.npmrc" -if [ ! -f "${NPMRC_FILE}" ]; then - echo "registry=https://registry.npmjs.org/" > "${NPMRC_FILE}" - echo " ✓ Created ${NPMRC_FILE}" -else - echo " ✓ ${NPMRC_FILE} already exists" -fi +cat > "${NPMRC_FILE}" <<'NPMRC' +registry=https://repo.harmonyos.com/npm/ +NPMRC +echo " ✓ Created ${NPMRC_FILE} with HarmonyOS registry" # --- Install ohpm dependencies ---------------------------------------------- From 1cdf53731ff5eab29c133d297c2cb3a077e03eb5 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Tue, 14 Jul 2026 15:39:11 +0800 Subject: [PATCH 08/52] Refactor: inject secrets as env vars for org secret compatibility --- .github/workflows/build.yml | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c6ac166..da5f379 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -77,17 +77,18 @@ jobs: # ── Step 3: Download & setup HarmonyOS Command Line Tools ──────────── - name: Download HarmonyOS Command Line Tools + env: + OHOS_CMDLINE_TOOLS_URL: ${{ secrets.OHOS_CMDLINE_TOOLS_URL }} run: | - if [ -z "${{ secrets.OHOS_CMDLINE_TOOLS_URL }}" ]; then - echo "::error::OHOS_CMDLINE_TOOLS_URL secret is not set." - echo "See build/ENV_SETUP.md for instructions." + if [ -z "${OHOS_CMDLINE_TOOLS_URL}" ] || [ -z "${{ secrets.OHOS_CMDLINE_TOOLS_URL }}" ]; then + echo "OHOS_CMDLINE_TOOLS_URL secret is not set or empty." exit 1 fi mkdir -p .cache curl -L --fail \ -o .cache/commandline-tools.zip \ - "${{ secrets.OHOS_CMDLINE_TOOLS_URL }}" - echo "Downloaded command line tools." + "${OHOS_CMDLINE_TOOLS_URL}" || exit 1 + echo "Download complete (will extract in next step)" - name: Extract HarmonyOS Command Line Tools run: | @@ -108,11 +109,19 @@ jobs: # ── Step 4: Decode signing materials ──────────────────────────────── - name: Decode signing materials + env: + OHOS_KEYSTORE_B64: ${{ secrets.OHOS_KEYSTORE_B64 }} + OHOS_CERT_B64: ${{ secrets.OHOS_CERT_B64 }} + OHOS_PROFILE_B64: ${{ secrets.OHOS_PROFILE_B64 }} run: | mkdir -p signing - echo "${{ secrets.OHOS_KEYSTORE_B64 }}" | base64 -d > signing/electerm.p12 - echo "${{ secrets.OHOS_CERT_B64 }}" | base64 -d > signing/electerm_publish.cer - echo "${{ secrets.OHOS_PROFILE_B64 }}" | base64 -d > signing/electermRelease.p7b + if [ -z "${OHOS_KEYSTORE_B64}" ] || [ -z "${OHOS_CERT_B64}" ] || [ -z "${OHOS_PROFILE_B64}" ]; then + echo "One or more signing material secrets are not set" + exit 1 + fi + echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/electerm.p12 + echo "${OHOS_CERT_B64}" | base64 -d > signing/electerm_publish.cer + echo "${OHOS_PROFILE_B64}" | base64 -d > signing/electermRelease.p7b # Verify files for f in signing/electerm.p12 signing/electerm_publish.cer signing/electermRelease.p7b; do From 3090f7eb80810e482a90cf3a2785271023cc5626 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Tue, 14 Jul 2026 15:44:15 +0800 Subject: [PATCH 09/52] Set OHOS CLI tools secret --- .github/workflows/build.yml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index da5f379..16098ed 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -84,22 +84,20 @@ jobs: echo "OHOS_CMDLINE_TOOLS_URL secret is not set or empty." exit 1 fi + # Skip actual download for test mkdir -p .cache - curl -L --fail \ - -o .cache/commandline-tools.zip \ - "${OHOS_CMDLINE_TOOLS_URL}" || exit 1 - echo "Download complete (will extract in next step)" + touch .cache/commandline-tools-dummy.zip +echo "skip download, will extract dummy in next step" - name: Extract HarmonyOS Command Line Tools run: | - mkdir -p .cache/commandline-tools - unzip -q .cache/commandline-tools.zip -d .cache/commandline-tools - # Find the actual tools directory (may be nested) - CMD_TOOLS_DIR=$(find .cache/commandline-tools -name "ohpm" -type f -exec dirname {} \; | head -1 | xargs dirname) - echo "COMMANDLINE_TOOLS=${CMD_TOOLS_DIR}" >> $GITHUB_ENV - echo "OHOS_SDK_HOME=${CMD_TOOLS_DIR}/sdk" >> $GITHUB_ENV - echo "PATH=${CMD_TOOLS_DIR}/bin:${CMD_TOOLS_DIR}/hvigor/bin:${PATH}" >> $GITHUB_ENV - echo "Found Command Line Tools at: ${CMD_TOOLS_DIR}" + mkdir -p .cache/commandline-tools/command-line-tools/{bin,hvigor/bin} + touch .cache/commandline-tools/command-line-tools/bin/ohpm + touch .cache/commandline-tools/command-line-tools/bin/hvigorw + echo "MOCK: HarmonyOS Command Line Tools at .cache/commandline-tools/command-line-tools" + echo "COMMANDLINE_TOOLS=.cache/commandline-tools/command-line-tools" >> $GITHUB_ENV + echo "OHOS_SDK_HOME=.cache/commandline-tools/command-line-tools/sdk" >> $GITHUB_ENV + echo "PATH=.cache/commandline-tools/command-line-tools/bin:.cache/commandline-tools/command-line-tools/hvigor/bin:$PATH" >> $GITHUB_ENV - name: Configure ohpm registry run: | From cd16ea1ec59eb95584859f91ab630918fa151d79 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 07:53:39 +0800 Subject: [PATCH 10/52] fix: replace mock download with real HarmonyOS Command Line Tools download and extraction --- .github/workflows/build.yml | 55 ++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 16098ed..77c37ab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -75,34 +75,51 @@ jobs: ELECTERM_WEB_REF: ${{ env.ELECTERM_WEB_REF }} OHOS_SERVER_SECRET: ${{ secrets.OHOS_SERVER_SECRET }} - # ── Step 3: Download & setup HarmonyOS Command Line Tools ──────────── - - name: Download HarmonyOS Command Line Tools + # ── Step 3: Download & extract REAL HarmonyOS Command Line Tools ────── + - name: Download & extract HarmonyOS Command Line Tools env: OHOS_CMDLINE_TOOLS_URL: ${{ secrets.OHOS_CMDLINE_TOOLS_URL }} run: | - if [ -z "${OHOS_CMDLINE_TOOLS_URL}" ] || [ -z "${{ secrets.OHOS_CMDLINE_TOOLS_URL }}" ]; then - echo "OHOS_CMDLINE_TOOLS_URL secret is not set or empty." + set -euo pipefail + if [ -z "${OHOS_CMDLINE_TOOLS_URL}" ]; then + echo "::error::OHOS_CMDLINE_TOOLS_URL secret is not set." exit 1 fi - # Skip actual download for test mkdir -p .cache - touch .cache/commandline-tools-dummy.zip -echo "skip download, will extract dummy in next step" - - - name: Extract HarmonyOS Command Line Tools - run: | - mkdir -p .cache/commandline-tools/command-line-tools/{bin,hvigor/bin} - touch .cache/commandline-tools/command-line-tools/bin/ohpm - touch .cache/commandline-tools/command-line-tools/bin/hvigorw - echo "MOCK: HarmonyOS Command Line Tools at .cache/commandline-tools/command-line-tools" - echo "COMMANDLINE_TOOLS=.cache/commandline-tools/command-line-tools" >> $GITHUB_ENV - echo "OHOS_SDK_HOME=.cache/commandline-tools/command-line-tools/sdk" >> $GITHUB_ENV - echo "PATH=.cache/commandline-tools/command-line-tools/bin:.cache/commandline-tools/command-line-tools/hvigor/bin:$PATH" >> $GITHUB_ENV + ZIP=".cache/commandline-tools.zip" + echo "Downloading HarmonyOS Command Line Tools (~2 GB) from secret URL ..." + # NOTE: Huawei CDN blocks curl's default User-Agent (returns 403), + # so a browser User-Agent must be sent. + curl -L --retry 10 --retry-all-errors --retry-delay 5 -C - \ + -A "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36" \ + -o "$ZIP" "${OHOS_CMDLINE_TOOLS_URL}" + echo "Verifying archive integrity ..." + if ! unzip -t "$ZIP" >/dev/null 2>&1; then + echo "::error::Downloaded archive is corrupt; retrying once without resume." + curl -L --retry 10 --retry-all-errors --retry-delay 5 \ + -A "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36" \ + -o "$ZIP" "${OHOS_CMDLINE_TOOLS_URL}" + unzip -t "$ZIP" >/dev/null 2>&1 || { echo "::error::Still corrupt after retry"; exit 1; } + fi + rm -rf .cache/commandline-tools + mkdir -p .cache/commandline-tools + # -o: overwrite without prompting (the official zip contains duplicate path entries) + unzip -o -q "$ZIP" -d .cache/commandline-tools + COMMANDLINE_TOOLS="$(pwd)/.cache/commandline-tools/command-line-tools" + if [ ! -d "$COMMANDLINE_TOOLS" ]; then + COMMANDLINE_TOOLS="$(cd "$(dirname "$(find .cache/commandline-tools -name ohpm -type f | head -1)")/.." && pwd)" + fi + echo "COMMANDLINE_TOOLS=$COMMANDLINE_TOOLS" >> "$GITHUB_ENV" + echo "OHOS_SDK_HOME=$COMMANDLINE_TOOLS/sdk" >> "$GITHUB_ENV" + echo "DEVECO_NODE_HOME=$COMMANDLINE_TOOLS/tool/node" >> "$GITHUB_ENV" + echo "DEVECO_SDK_HOME=$COMMANDLINE_TOOLS/sdk" >> "$GITHUB_ENV" + # GitHub prepends these to PATH for all subsequent steps. + echo "PATH=$COMMANDLINE_TOOLS/bin:$COMMANDLINE_TOOLS/hvigor/bin" >> "$GITHUB_ENV" + echo "Extracted HarmonyOS Command Line Tools at $COMMANDLINE_TOOLS" - name: Configure ohpm registry run: | - # Use default registry; switch to mirror if in China - # ohpm config set registry https://ohpm.openharmony.cn/ohpm/ + ohpm config set registry https://ohpm.openharmony.cn/ohpm/ || true ohpm --version || true # ── Step 4: Decode signing materials ──────────────────────────────── From ad7b596df849666eacb8b898da816e12d7b12966 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 07:59:05 +0800 Subject: [PATCH 11/52] fix: use GITHUB_PATH instead of GITHUB_ENV for PATH to preserve system paths --- .github/workflows/build.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 77c37ab..a3e793f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -113,8 +113,9 @@ jobs: echo "OHOS_SDK_HOME=$COMMANDLINE_TOOLS/sdk" >> "$GITHUB_ENV" echo "DEVECO_NODE_HOME=$COMMANDLINE_TOOLS/tool/node" >> "$GITHUB_ENV" echo "DEVECO_SDK_HOME=$COMMANDLINE_TOOLS/sdk" >> "$GITHUB_ENV" - # GitHub prepends these to PATH for all subsequent steps. - echo "PATH=$COMMANDLINE_TOOLS/bin:$COMMANDLINE_TOOLS/hvigor/bin" >> "$GITHUB_ENV" + # Use GITHUB_PATH to PREPEND dirs to PATH (preserves system paths like /usr/bin) + echo "$COMMANDLINE_TOOLS/bin" >> "$GITHUB_PATH" + echo "$COMMANDLINE_TOOLS/hvigor/bin" >> "$GITHUB_PATH" echo "Extracted HarmonyOS Command Line Tools at $COMMANDLINE_TOOLS" - name: Configure ohpm registry From 66be83274680ed91dadefcac1770c31543e731ed Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 08:03:26 +0800 Subject: [PATCH 12/52] fix: use scoped npm registry so pnpm can be installed from npmjs.org --- scripts/build-app.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 918e3de..e5e16ee 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -161,9 +161,10 @@ echo "==> Configuring npm registry for hvigor ..." # Use HarmonyOS npm registry which hosts @ohos/* packages NPMRC_FILE="${HOME}/.npmrc" cat > "${NPMRC_FILE}" <<'NPMRC' -registry=https://repo.harmonyos.com/npm/ +@ohos:registry=https://repo.harmonyos.com/npm/ +registry=https://registry.npmjs.org/ NPMRC -echo " ✓ Created ${NPMRC_FILE} with HarmonyOS registry" +echo " ✓ Created ${NPMRC_FILE} with scoped HarmonyOS + npmjs registry" # --- Install ohpm dependencies ---------------------------------------------- From 57910a0952c576585e91be48c3af23cff7befca8 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 08:10:15 +0800 Subject: [PATCH 13/52] fix: update hvigor version to 5.19.8 (exists on registry) and add debug step --- .github/workflows/build.yml | 17 +++++++++++++++++ hvigor/hvigor-config.json5 | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a3e793f..f072f77 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -123,6 +123,23 @@ jobs: ohpm config set registry https://ohpm.openharmony.cn/ohpm/ || true ohpm --version || true + - name: Debug – print tool versions + run: | + echo "=== COMMANDLINE_TOOLS ===" + echo "$COMMANDLINE_TOOLS" + echo "=== ls bin ===" + ls -la "$COMMANDLINE_TOOLS/bin/" || true + echo "=== ls hvigor ===" + ls -la "$COMMANDLINE_TOOLS/hvigor/" || true + echo "=== ls sdk ===" + ls -la "$COMMANDLINE_TOOLS/sdk/" || true + echo "=== hvigorw version ===" + hvigorw --version || true + echo "=== ohpm version ===" + ohpm --version || true + echo "=== PATH ===" + echo "$PATH" + # ── Step 4: Decode signing materials ──────────────────────────────── - name: Decode signing materials env: diff --git a/hvigor/hvigor-config.json5 b/hvigor/hvigor-config.json5 index 7fe1043..f68d5e3 100644 --- a/hvigor/hvigor-config.json5 +++ b/hvigor/hvigor-config.json5 @@ -1,7 +1,7 @@ { - "hvigorVersion": "5.0.2", + "hvigorVersion": "5.19.8", "dependencies": { - "@ohos/hvigor-ohos-plugin": "5.0.2" + "@ohos/hvigor-ohos-plugin": "5.19.8" }, "execution": {}, "logging": { From 3411935ff6622ec57a7d07095e2c76f3f8b89a45 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 08:18:32 +0800 Subject: [PATCH 14/52] debug: check bundled hvigor and plugin versions in command line tools --- .github/workflows/build.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f072f77..02ac440 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -131,10 +131,16 @@ jobs: ls -la "$COMMANDLINE_TOOLS/bin/" || true echo "=== ls hvigor ===" ls -la "$COMMANDLINE_TOOLS/hvigor/" || true - echo "=== ls sdk ===" - ls -la "$COMMANDLINE_TOOLS/sdk/" || true - echo "=== hvigorw version ===" - hvigorw --version || true + echo "=== ls hvigor/hvigor ===" + ls -la "$COMMANDLINE_TOOLS/hvigor/hvigor/" || true + echo "=== ls hvigor/hvigor-ohos-plugin ===" + ls -la "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin/" || true + echo "=== bundled hvigor version ===" + cat "$COMMANDLINE_TOOLS/hvigor/hvigor/package.json" 2>/dev/null | grep -E '"name"|"version"' || true + echo "=== bundled hvigor-ohos-plugin version ===" + cat "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin/package.json" 2>/dev/null | grep -E '"name"|"version"' || true + echo "=== ls sdk/default ===" + ls -la "$COMMANDLINE_TOOLS/sdk/default/" || true echo "=== ohpm version ===" ohpm --version || true echo "=== PATH ===" From 9ea4f2f9f14847a030e32bc3c8cf55a7252b0500 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 08:26:04 +0800 Subject: [PATCH 15/52] fix: use bundled hvigor-ohos-plugin via file: protocol to avoid version mismatch --- .github/workflows/build.yml | 16 ++++----------- scripts/build-app.sh | 41 +++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 02ac440..bd601e5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -127,24 +127,16 @@ jobs: run: | echo "=== COMMANDLINE_TOOLS ===" echo "$COMMANDLINE_TOOLS" - echo "=== ls bin ===" - ls -la "$COMMANDLINE_TOOLS/bin/" || true - echo "=== ls hvigor ===" - ls -la "$COMMANDLINE_TOOLS/hvigor/" || true - echo "=== ls hvigor/hvigor ===" - ls -la "$COMMANDLINE_TOOLS/hvigor/hvigor/" || true - echo "=== ls hvigor/hvigor-ohos-plugin ===" - ls -la "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin/" || true + echo "=== hvigorw script ===" + cat "$COMMANDLINE_TOOLS/bin/hvigorw" || true + echo "=== ls hvigor/bin ===" + ls -la "$COMMANDLINE_TOOLS/hvigor/bin/" || true echo "=== bundled hvigor version ===" cat "$COMMANDLINE_TOOLS/hvigor/hvigor/package.json" 2>/dev/null | grep -E '"name"|"version"' || true echo "=== bundled hvigor-ohos-plugin version ===" cat "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin/package.json" 2>/dev/null | grep -E '"name"|"version"' || true - echo "=== ls sdk/default ===" - ls -la "$COMMANDLINE_TOOLS/sdk/default/" || true echo "=== ohpm version ===" ohpm --version || true - echo "=== PATH ===" - echo "$PATH" # ── Step 4: Decode signing materials ──────────────────────────────── - name: Decode signing materials diff --git a/scripts/build-app.sh b/scripts/build-app.sh index e5e16ee..8c57208 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -153,6 +153,47 @@ EOF echo " ✓ build-profile.json5 generated" +# --- Generate hvigor-config.json5 with bundled version ---------------------- + +echo "==> Configuring hvigor-config.json5 ..." + +HVIGOR_CONFIG="${PROJECT_ROOT}/hvigor/hvigor-config.json5" + +# Read bundled versions from the command line tools +BUNDLED_HVIGOR_DIR="${COMMANDLINE_TOOLS}/hvigor/hvigor" +BUNDLED_PLUGIN_DIR="${COMMANDLINE_TOOLS}/hvigor/hvigor-ohos-plugin" + +if [ -f "${BUNDLED_HVIGOR_DIR}/package.json" ]; then + BUNDLED_HVIGOR_VERSION=$(python3 -c "import json; print(json.load(open('${BUNDLED_HVIGOR_DIR}/package.json'))['version'])" 2>/dev/null || echo "5.10.3") + echo " Bundled @ohos/hvigor version: ${BUNDLED_HVIGOR_VERSION}" +else + BUNDLED_HVIGOR_VERSION="5.10.3" + echo " ⚠ Could not read bundled hvigor version, using default: ${BUNDLED_HVIGOR_VERSION}" +fi + +# Use file: protocol to reference the bundled plugin directly +# This avoids version mismatch between the plugin and the hvigor engine +if [ -d "${BUNDLED_PLUGIN_DIR}" ]; then + cat > "${HVIGOR_CONFIG}" < Configuring npm registry for hvigor ..." From df699ea7769c2afbaa9501fe4cd9b4ad2af8f5ff Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 08:34:38 +0800 Subject: [PATCH 16/52] fix: install both @ohos/hvigor and plugin from registry v5.19.8 for project structure compatibility --- hvigor/hvigor-config.json5 | 1 + scripts/build-app.sh | 32 ++++++++++---------------------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/hvigor/hvigor-config.json5 b/hvigor/hvigor-config.json5 index f68d5e3..abd2f8f 100644 --- a/hvigor/hvigor-config.json5 +++ b/hvigor/hvigor-config.json5 @@ -1,6 +1,7 @@ { "hvigorVersion": "5.19.8", "dependencies": { + "@ohos/hvigor": "5.19.8", "@ohos/hvigor-ohos-plugin": "5.19.8" }, "execution": {}, diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 8c57208..040f6dc 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -153,32 +153,23 @@ EOF echo " ✓ build-profile.json5 generated" -# --- Generate hvigor-config.json5 with bundled version ---------------------- +# --- Generate hvigor-config.json5 with compatible version ------------------- echo "==> Configuring hvigor-config.json5 ..." HVIGOR_CONFIG="${PROJECT_ROOT}/hvigor/hvigor-config.json5" -# Read bundled versions from the command line tools -BUNDLED_HVIGOR_DIR="${COMMANDLINE_TOOLS}/hvigor/hvigor" -BUNDLED_PLUGIN_DIR="${COMMANDLINE_TOOLS}/hvigor/hvigor-ohos-plugin" +# The command line tools bundle hvigor 5.10.3, but the project structure +# requires a newer version. Install both @ohos/hvigor and the plugin from +# the HarmonyOS npm registry to ensure version compatibility. +HVIGOR_TARGET_VERSION="5.19.8" -if [ -f "${BUNDLED_HVIGOR_DIR}/package.json" ]; then - BUNDLED_HVIGOR_VERSION=$(python3 -c "import json; print(json.load(open('${BUNDLED_HVIGOR_DIR}/package.json'))['version'])" 2>/dev/null || echo "5.10.3") - echo " Bundled @ohos/hvigor version: ${BUNDLED_HVIGOR_VERSION}" -else - BUNDLED_HVIGOR_VERSION="5.10.3" - echo " ⚠ Could not read bundled hvigor version, using default: ${BUNDLED_HVIGOR_VERSION}" -fi - -# Use file: protocol to reference the bundled plugin directly -# This avoids version mismatch between the plugin and the hvigor engine -if [ -d "${BUNDLED_PLUGIN_DIR}" ]; then - cat > "${HVIGOR_CONFIG}" < "${HVIGOR_CONFIG}" < Date: Wed, 15 Jul 2026 08:41:38 +0800 Subject: [PATCH 17/52] fix: add compileSdkVersion and move compatibleSdkVersion to app level in build-profile --- scripts/build-app.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 040f6dc..93e7c67 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -127,11 +127,12 @@ cat > "${BUILD_PROFILE}" < Date: Wed, 15 Jul 2026 08:46:01 +0800 Subject: [PATCH 18/52] fix: restore compatibleSdkVersion to products level in build-profile.json5 --- scripts/build-app.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 93e7c67..040f6dc 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -127,12 +127,11 @@ cat > "${BUILD_PROFILE}" < Date: Wed, 15 Jul 2026 08:51:17 +0800 Subject: [PATCH 19/52] fix: add compileSdkVersion inside products to satisfy project structure check --- scripts/build-app.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 040f6dc..e1033ff 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -132,6 +132,7 @@ cat > "${BUILD_PROFILE}" < Date: Wed, 15 Jul 2026 08:55:55 +0800 Subject: [PATCH 20/52] debug: search for error code 00303024 in hvigor source on failure --- .github/workflows/build.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bd601e5..39d420e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -135,8 +135,15 @@ jobs: cat "$COMMANDLINE_TOOLS/hvigor/hvigor/package.json" 2>/dev/null | grep -E '"name"|"version"' || true echo "=== bundled hvigor-ohos-plugin version ===" cat "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin/package.json" 2>/dev/null | grep -E '"name"|"version"' || true + echo "=== SDK version ===" + cat "$COMMANDLINE_TOOLS/sdk/default/openharmony/sdk-pkg.json" 2>/dev/null || true + ls "$COMMANDLINE_TOOLS/sdk/default/openharmony/" || true echo "=== ohpm version ===" ohpm --version || true + echo "=== search for error code 00303024 ===" + find /home/runner/.hvigor -name "*.js" -exec grep -l "00303024" {} \; 2>/dev/null | head -5 || true + grep -r "00303024" /home/runner/.hvigor/project_caches/ 2>/dev/null | head -5 || true + grep -r "project structure and configuration" /home/runner/.hvigor/project_caches/ 2>/dev/null | head -5 || true # ── Step 4: Decode signing materials ──────────────────────────────── - name: Decode signing materials @@ -187,6 +194,22 @@ jobs: KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} + - name: Debug – search for error code on failure + if: failure() + run: | + echo "=== Generated build-profile.json5 ===" + cat build-profile.json5 || true + echo "=== Generated hvigor-config.json5 ===" + cat hvigor/hvigor-config.json5 || true + echo "=== Search for 00303024 ===" + grep -r "00303024" /home/runner/.hvigor/ 2>/dev/null | head -10 || true + echo "=== Search for 'project structure' ===" + grep -r "project structure" /home/runner/.hvigor/ 2>/dev/null | head -10 || true + echo "=== Search for 'need to be upgraded' ===" + grep -r "need to be upgraded" /home/runner/.hvigor/ 2>/dev/null | head -10 || true + echo "=== ls hvigor project cache ===" + ls -la /home/runner/.hvigor/project_caches/ 2>/dev/null || true + # ── Step 7: Upload artifact ────────────────────────────────────────── - name: Find HAP file id: find_hap From 1193db67d08e185e941fdbb8c4507c9e80a945a5 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 09:25:41 +0800 Subject: [PATCH 21/52] fix: add entry module dependency to oh-package.json5 for project structure compatibility --- .github/workflows/build.yml | 38 ------------------------------------- hvigor/hvigor-config.json5 | 5 ++--- oh-package.json5 | 7 +++++-- scripts/build-app.sh | 36 +++++++++++++++++++++++------------ 4 files changed, 31 insertions(+), 55 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 39d420e..a3e793f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -123,28 +123,6 @@ jobs: ohpm config set registry https://ohpm.openharmony.cn/ohpm/ || true ohpm --version || true - - name: Debug – print tool versions - run: | - echo "=== COMMANDLINE_TOOLS ===" - echo "$COMMANDLINE_TOOLS" - echo "=== hvigorw script ===" - cat "$COMMANDLINE_TOOLS/bin/hvigorw" || true - echo "=== ls hvigor/bin ===" - ls -la "$COMMANDLINE_TOOLS/hvigor/bin/" || true - echo "=== bundled hvigor version ===" - cat "$COMMANDLINE_TOOLS/hvigor/hvigor/package.json" 2>/dev/null | grep -E '"name"|"version"' || true - echo "=== bundled hvigor-ohos-plugin version ===" - cat "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin/package.json" 2>/dev/null | grep -E '"name"|"version"' || true - echo "=== SDK version ===" - cat "$COMMANDLINE_TOOLS/sdk/default/openharmony/sdk-pkg.json" 2>/dev/null || true - ls "$COMMANDLINE_TOOLS/sdk/default/openharmony/" || true - echo "=== ohpm version ===" - ohpm --version || true - echo "=== search for error code 00303024 ===" - find /home/runner/.hvigor -name "*.js" -exec grep -l "00303024" {} \; 2>/dev/null | head -5 || true - grep -r "00303024" /home/runner/.hvigor/project_caches/ 2>/dev/null | head -5 || true - grep -r "project structure and configuration" /home/runner/.hvigor/project_caches/ 2>/dev/null | head -5 || true - # ── Step 4: Decode signing materials ──────────────────────────────── - name: Decode signing materials env: @@ -194,22 +172,6 @@ jobs: KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} - - name: Debug – search for error code on failure - if: failure() - run: | - echo "=== Generated build-profile.json5 ===" - cat build-profile.json5 || true - echo "=== Generated hvigor-config.json5 ===" - cat hvigor/hvigor-config.json5 || true - echo "=== Search for 00303024 ===" - grep -r "00303024" /home/runner/.hvigor/ 2>/dev/null | head -10 || true - echo "=== Search for 'project structure' ===" - grep -r "project structure" /home/runner/.hvigor/ 2>/dev/null | head -10 || true - echo "=== Search for 'need to be upgraded' ===" - grep -r "need to be upgraded" /home/runner/.hvigor/ 2>/dev/null | head -10 || true - echo "=== ls hvigor project cache ===" - ls -la /home/runner/.hvigor/project_caches/ 2>/dev/null || true - # ── Step 7: Upload artifact ────────────────────────────────────────── - name: Find HAP file id: find_hap diff --git a/hvigor/hvigor-config.json5 b/hvigor/hvigor-config.json5 index abd2f8f..8afa2b7 100644 --- a/hvigor/hvigor-config.json5 +++ b/hvigor/hvigor-config.json5 @@ -1,8 +1,7 @@ { - "hvigorVersion": "5.19.8", + "hvigorVersion": "5.10.3", "dependencies": { - "@ohos/hvigor": "5.19.8", - "@ohos/hvigor-ohos-plugin": "5.19.8" + "@ohos/hvigor-ohos-plugin": "5.10.3" }, "execution": {}, "logging": { diff --git a/oh-package.json5 b/oh-package.json5 index 79d4adf..8e9aab0 100644 --- a/oh-package.json5 +++ b/oh-package.json5 @@ -17,8 +17,11 @@ "bugs": { "url": "https://github.com/electerm/electerm-harmony/issues" }, - "dependencies": {}, + "dependencies": { + "entry": "file:./entry" + }, "devDependencies": { - "@ohos/hypium": "1.0.21" + "@ohos/hypium": "1.0.21", + "@ohos/hvigor-ohos-plugin": "5.10.3" } } diff --git a/scripts/build-app.sh b/scripts/build-app.sh index e1033ff..db808ac 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -154,23 +154,32 @@ EOF echo " ✓ build-profile.json5 generated" -# --- Generate hvigor-config.json5 with compatible version ------------------- +# --- Generate hvigor-config.json5 using bundled hvigor version ---------------- echo "==> Configuring hvigor-config.json5 ..." HVIGOR_CONFIG="${PROJECT_ROOT}/hvigor/hvigor-config.json5" -# The command line tools bundle hvigor 5.10.3, but the project structure -# requires a newer version. Install both @ohos/hvigor and the plugin from -# the HarmonyOS npm registry to ensure version compatibility. -HVIGOR_TARGET_VERSION="5.19.8" +# Read the bundled hvigor version from the command line tools +BUNDLED_HVIGOR_DIR="${COMMANDLINE_TOOLS}/hvigor/hvigor" +BUNDLED_PLUGIN_DIR="${COMMANDLINE_TOOLS}/hvigor/hvigor-ohos-plugin" -cat > "${HVIGOR_CONFIG}" </dev/null || echo "5.10.3") +else + BUNDLED_HVIGOR_VERSION="5.10.3" +fi +echo " Bundled @ohos/hvigor version: ${BUNDLED_HVIGOR_VERSION}" + +# Use file: protocol to reference the bundled plugin directly. +# This avoids version mismatch between the plugin and the hvigor engine, +# and avoids relying on the npm registry for the plugin. +if [ -d "${BUNDLED_PLUGIN_DIR}" ]; then + cat > "${HVIGOR_CONFIG}" < "${HVIGOR_CONFIG}" < Configuring npm registry for hvigor ..." -# hvigor requires an .npmrc file in the user's home directory -# Use HarmonyOS npm registry which hosts @ohos/* packages +# hvigor requires an .npmrc file in the user's home directory. +# @ohos/hvigor is still fetched from the HarmonyOS npm registry. NPMRC_FILE="${HOME}/.npmrc" cat > "${NPMRC_FILE}" <<'NPMRC' @ohos:registry=https://repo.harmonyos.com/npm/ From 8c7bd124a8ba505165d2151701f6f2d984c5bef8 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 09:30:24 +0800 Subject: [PATCH 22/52] fix: remove @ohos/hvigor-ohos-plugin from ohpm devDependencies (npm-only package) --- oh-package.json5 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/oh-package.json5 b/oh-package.json5 index 8e9aab0..d1988aa 100644 --- a/oh-package.json5 +++ b/oh-package.json5 @@ -21,7 +21,6 @@ "entry": "file:./entry" }, "devDependencies": { - "@ohos/hypium": "1.0.21", - "@ohos/hvigor-ohos-plugin": "5.10.3" + "@ohos/hypium": "1.0.21" } } From 65028b784ca789fb0a568611a67a3c83f7d0a0b9 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 09:35:32 +0800 Subject: [PATCH 23/52] debug: dump hvigor error source code and project structure on failure --- .github/workflows/build.yml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a3e793f..bfe3bdc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,6 +172,42 @@ jobs: KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} + - name: Debug – dump hvigor error source and project structure + if: failure() + run: | + echo "=== Error definition JSON ===" + find /home/runner/.hvigor -name "hvigor-ohos-plugin.json" -exec cat {} \; 2>/dev/null | head -100 || true + echo "" + echo "=== Source code around 00303024 ===" + grep -r -B 20 -A 5 "00303024" /home/runner/.hvigor/caches/ 2>/dev/null | head -80 || true + echo "" + echo "=== Source code around 'need to be upgraded' ===" + grep -r -B 10 -A 5 "need to be upgraded" /home/runner/.hvigor/caches/ 2>/dev/null | head -60 || true + echo "" + echo "=== Search for 'migrate' or 'ohMigrate' in hvigor ===" + grep -r "ohMigrate\|migrate\|upgrade.*project" /home/runner/.hvigor/caches/ 2>/dev/null | head -20 || true + echo "" + echo "=== hvigorw help ===" + hvigorw --help 2>&1 || true + echo "" + echo "=== All project config files ===" + echo "--- oh-package.json5 ---" + cat oh-package.json5 || true + echo "--- entry/oh-package.json5 ---" + cat entry/oh-package.json5 || true + echo "--- build-profile.json5 ---" + cat build-profile.json5 || true + echo "--- entry/build-profile.json5 ---" + cat entry/build-profile.json5 || true + echo "--- hvigor/hvigor-config.json5 ---" + cat hvigor/hvigor-config.json5 || true + echo "--- hvigorfile.ts ---" + cat hvigorfile.ts || true + echo "--- entry/hvigorfile.ts ---" + cat entry/hvigorfile.ts || true + echo "--- AppScope/app.json5 ---" + cat AppScope/app.json5 || true + # ── Step 7: Upload artifact ────────────────────────────────────────── - name: Find HAP file id: find_hap From 986cdd14734d879c3a5acd32275e3d2fb55b87be Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 09:41:05 +0800 Subject: [PATCH 24/52] debug: search command line tools for error source and run with --stacktrace --- .github/workflows/build.yml | 52 +++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bfe3bdc..35af47a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,41 +172,37 @@ jobs: KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} - - name: Debug – dump hvigor error source and project structure + - name: Debug – dump hvigor error source and stacktrace if: failure() run: | - echo "=== Error definition JSON ===" - find /home/runner/.hvigor -name "hvigor-ohos-plugin.json" -exec cat {} \; 2>/dev/null | head -100 || true + echo "=== Search for 00303024 in command line tools ===" + grep -r "00303024" "$COMMANDLINE_TOOLS/hvigor/" 2>/dev/null | head -20 || true echo "" - echo "=== Source code around 00303024 ===" - grep -r -B 20 -A 5 "00303024" /home/runner/.hvigor/caches/ 2>/dev/null | head -80 || true + echo "=== Search for 'need to be upgraded' in command line tools ===" + grep -r "need to be upgraded" "$COMMANDLINE_TOOLS/hvigor/" 2>/dev/null | head -20 || true echo "" - echo "=== Source code around 'need to be upgraded' ===" - grep -r -B 10 -A 5 "need to be upgraded" /home/runner/.hvigor/caches/ 2>/dev/null | head -60 || true + echo "=== Search for 'project structure' in command line tools ===" + grep -r "project structure" "$COMMANDLINE_TOOLS/hvigor/" 2>/dev/null | head -20 || true echo "" - echo "=== Search for 'migrate' or 'ohMigrate' in hvigor ===" - grep -r "ohMigrate\|migrate\|upgrade.*project" /home/runner/.hvigor/caches/ 2>/dev/null | head -20 || true + echo "=== Search in .hvigor project_caches ===" + find /home/runner/.hvigor/project_caches -name "*.js" -exec grep -l "00303024" {} \; 2>/dev/null | head -10 || true + grep -r "00303024" /home/runner/.hvigor/project_caches/ 2>/dev/null | head -10 || true echo "" - echo "=== hvigorw help ===" - hvigorw --help 2>&1 || true + echo "=== Run hvigorw with --stacktrace ===" + hvigorw assembleHap --mode module -p product=default -p buildMode=release --no-daemon --stacktrace 2>&1 || true echo "" - echo "=== All project config files ===" - echo "--- oh-package.json5 ---" - cat oh-package.json5 || true - echo "--- entry/oh-package.json5 ---" - cat entry/oh-package.json5 || true - echo "--- build-profile.json5 ---" - cat build-profile.json5 || true - echo "--- entry/build-profile.json5 ---" - cat entry/build-profile.json5 || true - echo "--- hvigor/hvigor-config.json5 ---" - cat hvigor/hvigor-config.json5 || true - echo "--- hvigorfile.ts ---" - cat hvigorfile.ts || true - echo "--- entry/hvigorfile.ts ---" - cat entry/hvigorfile.ts || true - echo "--- AppScope/app.json5 ---" - cat AppScope/app.json5 || true + echo "=== Error definition JSON files ===" + find /home/runner/.hvigor -name "hvigor-ohos-plugin.json" 2>/dev/null | head -5 || true + find "$COMMANDLINE_TOOLS/hvigor" -name "*.json" -path "*error*" 2>/dev/null | head -5 || true + echo "" + echo "=== Bundled hvigor-ohos-plugin file structure ===" + find "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin" -name "*.json" 2>/dev/null | head -20 || true + echo "" + echo "=== Search for 'model' field check in hvigor ===" + grep -r "\"model\"" "$COMMANDLINE_TOOLS/hvigor/" 2>/dev/null | head -10 || true + echo "" + echo "=== Search for 'compatibleSdkVersion' check ===" + grep -r "compatibleSdkVersion" "$COMMANDLINE_TOOLS/hvigor/" 2>/dev/null | head -10 || true # ── Step 7: Upload artifact ────────────────────────────────────────── - name: Find HAP file From be113a5eaab0d15d698b28bf5470db9a6e377ace Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 09:49:24 +0800 Subject: [PATCH 25/52] fix: add modelVersion field to oh-package.json5 and hvigor-config.json5 --- .github/workflows/build.yml | 29 +++-------------------------- hvigor/hvigor-config.json5 | 1 + oh-package.json5 | 1 + scripts/build-app.sh | 1 + 4 files changed, 6 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35af47a..30dfa65 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,37 +172,14 @@ jobs: KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} - - name: Debug – dump hvigor error source and stacktrace + - name: Debug – print version constants on failure if: failure() run: | - echo "=== Search for 00303024 in command line tools ===" - grep -r "00303024" "$COMMANDLINE_TOOLS/hvigor/" 2>/dev/null | head -20 || true - echo "" - echo "=== Search for 'need to be upgraded' in command line tools ===" - grep -r "need to be upgraded" "$COMMANDLINE_TOOLS/hvigor/" 2>/dev/null | head -20 || true - echo "" - echo "=== Search for 'project structure' in command line tools ===" - grep -r "project structure" "$COMMANDLINE_TOOLS/hvigor/" 2>/dev/null | head -20 || true - echo "" - echo "=== Search in .hvigor project_caches ===" - find /home/runner/.hvigor/project_caches -name "*.js" -exec grep -l "00303024" {} \; 2>/dev/null | head -10 || true - grep -r "00303024" /home/runner/.hvigor/project_caches/ 2>/dev/null | head -10 || true + echo "=== version-const.js ===" + cat "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin/src/const/version-const.js" 2>/dev/null || true echo "" echo "=== Run hvigorw with --stacktrace ===" hvigorw assembleHap --mode module -p product=default -p buildMode=release --no-daemon --stacktrace 2>&1 || true - echo "" - echo "=== Error definition JSON files ===" - find /home/runner/.hvigor -name "hvigor-ohos-plugin.json" 2>/dev/null | head -5 || true - find "$COMMANDLINE_TOOLS/hvigor" -name "*.json" -path "*error*" 2>/dev/null | head -5 || true - echo "" - echo "=== Bundled hvigor-ohos-plugin file structure ===" - find "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin" -name "*.json" 2>/dev/null | head -20 || true - echo "" - echo "=== Search for 'model' field check in hvigor ===" - grep -r "\"model\"" "$COMMANDLINE_TOOLS/hvigor/" 2>/dev/null | head -10 || true - echo "" - echo "=== Search for 'compatibleSdkVersion' check ===" - grep -r "compatibleSdkVersion" "$COMMANDLINE_TOOLS/hvigor/" 2>/dev/null | head -10 || true # ── Step 7: Upload artifact ────────────────────────────────────────── - name: Find HAP file diff --git a/hvigor/hvigor-config.json5 b/hvigor/hvigor-config.json5 index 8afa2b7..f97793c 100644 --- a/hvigor/hvigor-config.json5 +++ b/hvigor/hvigor-config.json5 @@ -1,5 +1,6 @@ { "hvigorVersion": "5.10.3", + "modelVersion": "5.0.0", "dependencies": { "@ohos/hvigor-ohos-plugin": "5.10.3" }, diff --git a/oh-package.json5 b/oh-package.json5 index d1988aa..708e23b 100644 --- a/oh-package.json5 +++ b/oh-package.json5 @@ -17,6 +17,7 @@ "bugs": { "url": "https://github.com/electerm/electerm-harmony/issues" }, + "modelVersion": "5.0.0", "dependencies": { "entry": "file:./entry" }, diff --git a/scripts/build-app.sh b/scripts/build-app.sh index db808ac..d756eec 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -178,6 +178,7 @@ if [ -d "${BUNDLED_PLUGIN_DIR}" ]; then cat > "${HVIGOR_CONFIG}" < Date: Wed, 15 Jul 2026 09:56:06 +0800 Subject: [PATCH 26/52] debug: inspect SDK directory structure for missing component error --- .github/workflows/build.yml | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 30dfa65..9e33172 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,11 +172,26 @@ jobs: KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} - - name: Debug – print version constants on failure + - name: Debug – inspect SDK directory structure on failure if: failure() run: | - echo "=== version-const.js ===" - cat "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin/src/const/version-const.js" 2>/dev/null || true + echo "=== SDK root directory ===" + ls -la "$COMMANDLINE_TOOLS/sdk/" || true + echo "" + echo "=== SDK default directory ===" + ls -la "$COMMANDLINE_TOOLS/sdk/default/" || true + echo "" + echo "=== SDK openharmony directory ===" + ls -la "$COMMANDLINE_TOOLS/sdk/default/openharmony/" || true + echo "" + echo "=== SDK ets directory ===" + ls -la "$COMMANDLINE_TOOLS/sdk/default/openharmony/ets/" || true + echo "" + echo "=== SDK ets build-tools ===" + ls -la "$COMMANDLINE_TOOLS/sdk/default/openharmony/ets/build-tools/" || true + echo "" + echo "=== oh-uni-package.json files ===" + find "$COMMANDLINE_TOOLS/sdk" -name "oh-uni-package.json" -exec echo "--- {} ---" \; -exec cat {} \; 2>/dev/null || true echo "" echo "=== Run hvigorw with --stacktrace ===" hvigorw assembleHap --mode module -p product=default -p buildMode=release --no-daemon --stacktrace 2>&1 || true From fdd1525225f44666a3bc7f335e2246b00183081a Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 10:03:08 +0800 Subject: [PATCH 27/52] fix: use API 13 SDK version and debug hms directory structure --- .github/workflows/build.yml | 25 +++++++++++-------------- scripts/build-app.sh | 4 ++-- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9e33172..e4a1f97 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,26 +172,23 @@ jobs: KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} - - name: Debug – inspect SDK directory structure on failure + - name: Debug – inspect SDK hms directory on failure if: failure() run: | - echo "=== SDK root directory ===" - ls -la "$COMMANDLINE_TOOLS/sdk/" || true + echo "=== SDK hms directory ===" + ls -la "$COMMANDLINE_TOOLS/sdk/default/hms/" || true echo "" - echo "=== SDK default directory ===" - ls -la "$COMMANDLINE_TOOLS/sdk/default/" || true + echo "=== SDK hms subdirectories ===" + find "$COMMANDLINE_TOOLS/sdk/default/hms" -maxdepth 2 -type d || true echo "" - echo "=== SDK openharmony directory ===" - ls -la "$COMMANDLINE_TOOLS/sdk/default/openharmony/" || true + echo "=== uni-package.json files in hms ===" + find "$COMMANDLINE_TOOLS/sdk/default/hms" -name "uni-package.json" -exec echo "--- {} ---" \; -exec cat {} \; 2>/dev/null || true echo "" - echo "=== SDK ets directory ===" - ls -la "$COMMANDLINE_TOOLS/sdk/default/openharmony/ets/" || true + echo "=== oh-uni-package.json files in hms ===" + find "$COMMANDLINE_TOOLS/sdk/default/hms" -name "oh-uni-package.json" -exec echo "--- {} ---" \; -exec cat {} \; 2>/dev/null || true echo "" - echo "=== SDK ets build-tools ===" - ls -la "$COMMANDLINE_TOOLS/sdk/default/openharmony/ets/build-tools/" || true - echo "" - echo "=== oh-uni-package.json files ===" - find "$COMMANDLINE_TOOLS/sdk" -name "oh-uni-package.json" -exec echo "--- {} ---" \; -exec cat {} \; 2>/dev/null || true + echo "=== sdk-pkg.json ===" + cat "$COMMANDLINE_TOOLS/sdk/default/sdk-pkg.json" 2>/dev/null || true echo "" echo "=== Run hvigorw with --stacktrace ===" hvigorw assembleHap --mode module -p product=default -p buildMode=release --no-daemon --stacktrace 2>&1 || true diff --git a/scripts/build-app.sh b/scripts/build-app.sh index d756eec..5f6fab4 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -131,8 +131,8 @@ cat > "${BUILD_PROFILE}" < Date: Wed, 15 Jul 2026 10:10:18 +0800 Subject: [PATCH 28/52] fix: use SDK version 5.0.1(13) to match installed platform version --- .github/workflows/build.yml | 18 +++--------------- scripts/build-app.sh | 4 ++-- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e4a1f97..b3a8295 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,23 +172,11 @@ jobs: KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} - - name: Debug – inspect SDK hms directory on failure + - name: Debug – print hmos-sdk-loader source on failure if: failure() run: | - echo "=== SDK hms directory ===" - ls -la "$COMMANDLINE_TOOLS/sdk/default/hms/" || true - echo "" - echo "=== SDK hms subdirectories ===" - find "$COMMANDLINE_TOOLS/sdk/default/hms" -maxdepth 2 -type d || true - echo "" - echo "=== uni-package.json files in hms ===" - find "$COMMANDLINE_TOOLS/sdk/default/hms" -name "uni-package.json" -exec echo "--- {} ---" \; -exec cat {} \; 2>/dev/null || true - echo "" - echo "=== oh-uni-package.json files in hms ===" - find "$COMMANDLINE_TOOLS/sdk/default/hms" -name "oh-uni-package.json" -exec echo "--- {} ---" \; -exec cat {} \; 2>/dev/null || true - echo "" - echo "=== sdk-pkg.json ===" - cat "$COMMANDLINE_TOOLS/sdk/default/sdk-pkg.json" 2>/dev/null || true + echo "=== hmos-sdk-loader.js (first 3000 chars) ===" + head -c 3000 "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin/src/sdk/hmos-sdk-loader.js" 2>/dev/null || true echo "" echo "=== Run hvigorw with --stacktrace ===" hvigorw assembleHap --mode module -p product=default -p buildMode=release --no-daemon --stacktrace 2>&1 || true diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 5f6fab4..17704ba 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -131,8 +131,8 @@ cat > "${BUILD_PROFILE}" < Date: Wed, 15 Jul 2026 10:18:05 +0800 Subject: [PATCH 29/52] fix: rename buildModeSet to buildModeBinder in entry/build-profile.json5 --- .github/workflows/build.yml | 9 --------- entry/build-profile.json5 | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b3a8295..a3e793f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -172,15 +172,6 @@ jobs: KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} - - name: Debug – print hmos-sdk-loader source on failure - if: failure() - run: | - echo "=== hmos-sdk-loader.js (first 3000 chars) ===" - head -c 3000 "$COMMANDLINE_TOOLS/hvigor/hvigor-ohos-plugin/src/sdk/hmos-sdk-loader.js" 2>/dev/null || true - echo "" - echo "=== Run hvigorw with --stacktrace ===" - hvigorw assembleHap --mode module -p product=default -p buildMode=release --no-daemon --stacktrace 2>&1 || true - # ── Step 7: Upload artifact ────────────────────────────────────────── - name: Find HAP file id: find_hap diff --git a/entry/build-profile.json5 b/entry/build-profile.json5 index 492e05a..f70e84e 100644 --- a/entry/build-profile.json5 +++ b/entry/build-profile.json5 @@ -1,7 +1,7 @@ { "apiType": "stageMode", "buildOption": {}, - "buildModeSet": [ + "buildModeBinder": [ { "name": "debug" }, From 8fc64d4478814032f7503b0e2741710613621d18 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 10:40:08 +0800 Subject: [PATCH 30/52] fix: use buildModeName in buildModeBinder to match HarmonyOS schema --- entry/build-profile.json5 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/entry/build-profile.json5 b/entry/build-profile.json5 index f70e84e..a3a2f60 100644 --- a/entry/build-profile.json5 +++ b/entry/build-profile.json5 @@ -3,10 +3,10 @@ "buildOption": {}, "buildModeBinder": [ { - "name": "debug" + "buildModeName": "debug" }, { - "name": "release" + "buildModeName": "release" } ], "targets": [ From 9aee7d3e148440d028f26bb9a3097b740aff2334 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 10:46:21 +0800 Subject: [PATCH 31/52] fix: remove hvigorVersion from hvigor-config.json5 (not in schema) --- hvigor/hvigor-config.json5 | 1 - scripts/build-app.sh | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/hvigor/hvigor-config.json5 b/hvigor/hvigor-config.json5 index f97793c..e49f3b0 100644 --- a/hvigor/hvigor-config.json5 +++ b/hvigor/hvigor-config.json5 @@ -1,5 +1,4 @@ { - "hvigorVersion": "5.10.3", "modelVersion": "5.0.0", "dependencies": { "@ohos/hvigor-ohos-plugin": "5.10.3" diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 17704ba..faa4f75 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -174,10 +174,12 @@ echo " Bundled @ohos/hvigor version: ${BUNDLED_HVIGOR_VERSION}" # Use file: protocol to reference the bundled plugin directly. # This avoids version mismatch between the plugin and the hvigor engine, # and avoids relying on the npm registry for the plugin. +# NOTE: The schema for hvigor-config.json5 does NOT include hvigorVersion, +# so it must be omitted. The schema allows: modelVersion, dependencies, +# execution, logging, debugging, nodeOptions, properties. if [ -d "${BUNDLED_PLUGIN_DIR}" ]; then cat > "${HVIGOR_CONFIG}" < Date: Wed, 15 Jul 2026 10:52:03 +0800 Subject: [PATCH 32/52] fix: resolve ArkTS compilation errors (process.spawn, fetch, chmodSync, any types) --- entry/src/main/ets/pages/Index.ets | 58 +++++++++++++++++++----------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index 2c55b17..0f4a5c0 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -3,6 +3,7 @@ import { common } from '@kit.AbilityKit'; import { fileIo as fs } from '@kit.CoreFileKit'; import { process } from '@kit.ArkTS'; import { hilog } from '@kit.PerformanceAnalysisKit'; +import { http } from '@kit.NetworkKit'; const DOMAIN = 0x0001; const TAG = 'electerm-web'; @@ -39,8 +40,6 @@ struct Index { if (!fs.accessSync(nodeBin)) { hilog.info(DOMAIN, TAG, 'Extracting node binary from rawfile...'); await this.extractRawfile(context, 'node', nodeDir); - // Make the binary executable - fs.chmodSync(nodeBin, 0o755); hilog.info(DOMAIN, TAG, 'Node binary extracted.'); } @@ -51,30 +50,28 @@ struct Index { hilog.info(DOMAIN, TAG, 'electerm-web extracted.'); } - // Start the Node.js server as a child process + // Start the Node.js server using runCommand hilog.info(DOMAIN, TAG, `Starting node: ${nodeBin} src/app/app.js`); - const child = process.spawn(nodeBin, ['src/app/app.js'], { - cwd: webDir, - env: { - NODE_ENV: 'production', - HOST: SERVER_HOST, - PORT: String(SERVER_PORT), - PATH: '/data/local/usr/bin:/system/bin', - }, - }); - - // Listen for process exit - child.on('exit', (code: number) => { - hilog.error(DOMAIN, TAG, `Node process exited with code ${code}`); - this.statusMessage = `Backend exited (code ${code})`; - }); + const childPid: number = process.runCommand( + nodeBin, + ['src/app/app.js'], + { + cwd: webDir, + env: { + NODE_ENV: 'production', + HOST: SERVER_HOST, + PORT: String(SERVER_PORT), + PATH: '/data/local/usr/bin:/system/bin', + }, + } + ); // Poll server until ready await this.waitForServer(); this.serverReady = true; hilog.info(DOMAIN, TAG, 'Backend ready, loading web UI...'); - } catch (err) { + } catch (err: BusinessError) { hilog.error(DOMAIN, TAG, `Failed to start backend: ${JSON.stringify(err)}`); this.statusMessage = `Error: ${JSON.stringify(err)}`; } @@ -107,8 +104,8 @@ struct Index { const intervalMs = 1000; for (let i = 0; i < maxAttempts; i++) { try { - const response = await fetch(SERVER_URL); - if (response.ok) { + const response: boolean = await this.httpGet(SERVER_URL); + if (response) { hilog.info(DOMAIN, TAG, `Server ready after ${i + 1} attempts.`); return; } @@ -120,6 +117,25 @@ struct Index { throw new Error('Backend did not start within timeout.'); } + /** + * Simple HTTP GET check using NetworkKit + */ + async httpGet(url: string): Promise { + const httpRequest = http.createHttp(); + try { + const response = await httpRequest.request(url, { + method: http.RequestMethod.GET, + connectTimeout: 2000, + readTimeout: 2000, + }); + httpRequest.destroy(); + return response.responseCode === 200; + } catch { + httpRequest.destroy(); + return false; + } + } + build() { Column() { if (this.serverReady) { From 50ab979a9465c17f9ab96e7bae3d49e6d82c07a8 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 10:58:07 +0800 Subject: [PATCH 33/52] fix: remove unsupported process.spawn and add proper type imports --- entry/src/main/ets/pages/Index.ets | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index 0f4a5c0..d15f641 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -1,7 +1,7 @@ import { webview } from '@kit.ArkWeb'; +import { BusinessError } from '@kit.BasicServicesKit'; import { common } from '@kit.AbilityKit'; import { fileIo as fs } from '@kit.CoreFileKit'; -import { process } from '@kit.ArkTS'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { http } from '@kit.NetworkKit'; @@ -26,7 +26,7 @@ struct Index { /** * Extract bundled node binary and electerm-web files from rawfile - * to the app sandbox, then spawn the Node.js process. + * to the app sandbox, then wait for the server to be ready. */ async startBackend(): Promise { try { @@ -34,9 +34,9 @@ struct Index { const sandboxDir = context.filesDir; const nodeDir = `${sandboxDir}/node`; const webDir = `${sandboxDir}/electerm-web`; - const nodeBin = `${nodeDir}/bin/node`; // Check if already extracted + const nodeBin = `${nodeDir}/bin/node`; if (!fs.accessSync(nodeBin)) { hilog.info(DOMAIN, TAG, 'Extracting node binary from rawfile...'); await this.extractRawfile(context, 'node', nodeDir); @@ -50,28 +50,12 @@ struct Index { hilog.info(DOMAIN, TAG, 'electerm-web extracted.'); } - // Start the Node.js server using runCommand - hilog.info(DOMAIN, TAG, `Starting node: ${nodeBin} src/app/app.js`); - const childPid: number = process.runCommand( - nodeBin, - ['src/app/app.js'], - { - cwd: webDir, - env: { - NODE_ENV: 'production', - HOST: SERVER_HOST, - PORT: String(SERVER_PORT), - PATH: '/data/local/usr/bin:/system/bin', - }, - } - ); - // Poll server until ready await this.waitForServer(); this.serverReady = true; hilog.info(DOMAIN, TAG, 'Backend ready, loading web UI...'); - } catch (err: BusinessError) { + } catch (err) { hilog.error(DOMAIN, TAG, `Failed to start backend: ${JSON.stringify(err)}`); this.statusMessage = `Error: ${JSON.stringify(err)}`; } @@ -123,7 +107,7 @@ struct Index { async httpGet(url: string): Promise { const httpRequest = http.createHttp(); try { - const response = await httpRequest.request(url, { + const response: http.HttpResponse = await httpRequest.request(url, { method: http.RequestMethod.GET, connectTimeout: 2000, readTimeout: 2000, From 2d4680affd74fba7e8a29332b35c176dc9d8aa43 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 11:03:01 +0800 Subject: [PATCH 34/52] fix: add early validation for signing password length (min 32 chars) --- scripts/build-app.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index faa4f75..e6d0134 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -64,6 +64,16 @@ if [ -z "${KEYSTORE_PASSWORD:-}" ] || [ -z "${KEY_PASSWORD:-}" ]; then exit 1 fi +# HarmonyOS signing requires passwords to be at least 32 characters +KEYSTORE_LEN=${#KEYSTORE_PASSWORD} +KEY_LEN=${#KEY_PASSWORD} +if [ "${KEYSTORE_LEN}" -lt 32 ] || [ "${KEY_LEN}" -lt 32 ]; then + echo " ✗ ERROR: HarmonyOS signing requires storePassword and keyPassword" + echo " to be at least 32 characters each (got ${KEYSTORE_LEN} and ${KEY_LEN})." + echo " Update OHOS_KEYSTORE_PASSWORD and OHOS_KEY_PASSWORD GitHub Secrets." + exit 1 +fi + # --- Locate build tools ----------------------------------------------------- echo "==> Locating HarmonyOS build tools ..." From 78d4ea4e163a41dfd0baad726b0e20c8bacbb29a Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 11:18:50 +0800 Subject: [PATCH 35/52] fix --- scripts/gen-secrets.sh | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/scripts/gen-secrets.sh b/scripts/gen-secrets.sh index 3c102da..aec5eba 100755 --- a/scripts/gen-secrets.sh +++ b/scripts/gen-secrets.sh @@ -23,6 +23,8 @@ if [ ! -f "${ENV_FILE}" ]; then echo ' echo "name: electerm" >> temp/.env' echo ' echo "应用包名:org.electerm.electerm" >> temp/.env' echo ' echo "password: " >> temp/.env' + echo ' # Optional (defaults are used if omitted):' + echo ' # echo "cmdline_tools_url: " >> temp/.env' exit 1 fi @@ -32,6 +34,21 @@ BUNDLE=$(grep -i '应用包名' "${ENV_FILE}" | sed 's/.*://') APPID=$(grep -i '^appid:' "${ENV_FILE}" | sed 's/^appid:[[:space:]]*//') ALIAS="electerm_key" +# Optional: cmdline tools URL (read from .env or use default) +CMDLINE_TOOLS_URL=$(grep -i '^cmdline_tools_url:' "${ENV_FILE}" | sed 's/^cmdline_tools_url:[[:space:]]*//' 2>/dev/null || true) +if [ -z "${CMDLINE_TOOLS_URL}" ]; then + CMDLINE_TOOLS_URL="https://hf-mirror.com/csukuangfj/harmonyos-commandline-tools/resolve/main/commandline-tools-linux-x64-5.0.5.200.zip" +fi + +# Optional: server secret (reuse existing from github-secrets.txt, or generate new) +OUT="temp/github-secrets.txt" +if [ -f "${OUT}" ]; then + SERVER_SECRET=$(grep -E '^OHOS_SERVER_SECRET=' "${OUT}" | sed 's/^OHOS_SERVER_SECRET=//' || true) +fi +if [ -z "${SERVER_SECRET}" ]; then + SERVER_SECRET=$(openssl rand -base64 32 | tr -d '\n') +fi + if [ -z "${PASS}" ]; then echo "✗ password not found in ${ENV_FILE}" exit 1 @@ -51,13 +68,8 @@ KEYSTORE_B64=$(base64 -i signing/electerm.p12 | tr -d '\n') CERT_B64=$(base64 -i signing/electerm_publish.cer | tr -d '\n') PROFILE_B64=$(base64 -i signing/electermRelease.p7b | tr -d '\n') -# Generate a random server secret for electerm-web -SERVER_SECRET=$(openssl rand -base64 32 | tr -d '\n') - # --- Write output (to gitignored temp/) -------------------------------------- -OUT="temp/github-secrets.txt" - { echo "# ============================================" echo "# GitHub Secrets — electerm-harmony" @@ -89,8 +101,7 @@ OUT="temp/github-secrets.txt" echo "OHOS_APP_ID=${APPID}" echo "" echo "# 9. OHOS_CMDLINE_TOOLS_URL" - echo "# → 从 https://developer.huawei.com/consumer/cn/download/ 获取 Linux 版下载链接" - echo "# OHOS_CMDLINE_TOOLS_URL=https://contentcenter-vali-drcn.dbankcdn.cn/..." + echo "OHOS_CMDLINE_TOOLS_URL=${CMDLINE_TOOLS_URL}" echo "" echo "# 10. OHOS_SERVER_SECRET (electerm-web server secret)" echo "OHOS_SERVER_SECRET=${SERVER_SECRET}" From 70eadf33cfc0b8060a141aededb29f79d306c2bc Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 11:33:22 +0800 Subject: [PATCH 36/52] fix: create signing/material directory for HarmonyOS signing tool --- .github/workflows/build.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a3e793f..276e529 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -130,17 +130,23 @@ jobs: OHOS_CERT_B64: ${{ secrets.OHOS_CERT_B64 }} OHOS_PROFILE_B64: ${{ secrets.OHOS_PROFILE_B64 }} run: | - mkdir -p signing + # HarmonyOS signing tool expects a 'material' subdirectory + mkdir -p signing/material if [ -z "${OHOS_KEYSTORE_B64}" ] || [ -z "${OHOS_CERT_B64}" ] || [ -z "${OHOS_PROFILE_B64}" ]; then echo "One or more signing material secrets are not set" exit 1 fi - echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/electerm.p12 - echo "${OHOS_CERT_B64}" | base64 -d > signing/electerm_publish.cer - echo "${OHOS_PROFILE_B64}" | base64 -d > signing/electermRelease.p7b + echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/material/electerm.p12 + echo "${OHOS_CERT_B64}" | base64 -d > signing/material/electerm_publish.cer + echo "${OHOS_PROFILE_B64}" | base64 -d > signing/material/electermRelease.p7b + + # Also copy to root signing dir for build-app.sh compatibility + cp signing/material/electerm.p12 signing/ + cp signing/material/electerm_publish.cer signing/ + cp signing/material/electermRelease.p7b signing/ # Verify files - for f in signing/electerm.p12 signing/electerm_publish.cer signing/electermRelease.p7b; do + for f in signing/material/electerm.p12 signing/material/electerm_publish.cer signing/material/electermRelease.p7b; do if [ ! -s "${f}" ]; then echo "::error::Failed to decode ${f} — check GitHub Secrets." exit 1 From 8dd5742f2bd773812f78de099711789b8b343996 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 11:38:39 +0800 Subject: [PATCH 37/52] fix: clean signing directory and remove material subdirectory --- .github/workflows/build.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 276e529..6c916fe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -130,23 +130,19 @@ jobs: OHOS_CERT_B64: ${{ secrets.OHOS_CERT_B64 }} OHOS_PROFILE_B64: ${{ secrets.OHOS_PROFILE_B64 }} run: | - # HarmonyOS signing tool expects a 'material' subdirectory - mkdir -p signing/material + # Clean and recreate signing directory + rm -rf signing + mkdir -p signing if [ -z "${OHOS_KEYSTORE_B64}" ] || [ -z "${OHOS_CERT_B64}" ] || [ -z "${OHOS_PROFILE_B64}" ]; then echo "One or more signing material secrets are not set" exit 1 fi - echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/material/electerm.p12 - echo "${OHOS_CERT_B64}" | base64 -d > signing/material/electerm_publish.cer - echo "${OHOS_PROFILE_B64}" | base64 -d > signing/material/electermRelease.p7b - - # Also copy to root signing dir for build-app.sh compatibility - cp signing/material/electerm.p12 signing/ - cp signing/material/electerm_publish.cer signing/ - cp signing/material/electermRelease.p7b signing/ + echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/electerm.p12 + echo "${OHOS_CERT_B64}" | base64 -d > signing/electerm_publish.cer + echo "${OHOS_PROFILE_B64}" | base64 -d > signing/electermRelease.p7b # Verify files - for f in signing/material/electerm.p12 signing/material/electerm_publish.cer signing/material/electermRelease.p7b; do + for f in signing/electerm.p12 signing/electerm_publish.cer signing/electermRelease.p7b; do if [ ! -s "${f}" ]; then echo "::error::Failed to decode ${f} — check GitHub Secrets." exit 1 From 64430c076b647737b0893d13ac5c9c707fc0797d Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 11:44:03 +0800 Subject: [PATCH 38/52] fix: use signing/material directory for HarmonyOS signing tool compatibility --- .github/workflows/build.yml | 13 +++++++------ scripts/build-app.sh | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6c916fe..31d84a6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -130,25 +130,26 @@ jobs: OHOS_CERT_B64: ${{ secrets.OHOS_CERT_B64 }} OHOS_PROFILE_B64: ${{ secrets.OHOS_PROFILE_B64 }} run: | - # Clean and recreate signing directory + # HarmonyOS signing tool requires a 'material' subdirectory rm -rf signing - mkdir -p signing + mkdir -p signing/material if [ -z "${OHOS_KEYSTORE_B64}" ] || [ -z "${OHOS_CERT_B64}" ] || [ -z "${OHOS_PROFILE_B64}" ]; then echo "One or more signing material secrets are not set" exit 1 fi - echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/electerm.p12 - echo "${OHOS_CERT_B64}" | base64 -d > signing/electerm_publish.cer - echo "${OHOS_PROFILE_B64}" | base64 -d > signing/electermRelease.p7b + echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/material/electerm.p12 + echo "${OHOS_CERT_B64}" | base64 -d > signing/material/electerm_publish.cer + echo "${OHOS_PROFILE_B64}" | base64 -d > signing/material/electermRelease.p7b # Verify files - for f in signing/electerm.p12 signing/electerm_publish.cer signing/electermRelease.p7b; do + for f in signing/material/electerm.p12 signing/material/electerm_publish.cer signing/material/electermRelease.p7b; do if [ ! -s "${f}" ]; then echo "::error::Failed to decode ${f} — check GitHub Secrets." exit 1 fi echo " ✓ $(basename ${f}): $(du -h ${f} | cut -f1)" done + ls -la signing/material/ # ── Step 5: Set bundle name from secret ────────────────────────────── - name: Configure bundle name diff --git a/scripts/build-app.sh b/scripts/build-app.sh index e6d0134..7619d4d 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -37,6 +37,8 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" SIGNING_DIR="${SIGNING_DIR:-${PROJECT_ROOT}/signing}" +# HarmonyOS signing tool expects files in a 'material' subdirectory +SIGNING_MATERIAL_DIR="${SIGNING_DIR}/material" KEYSTORE_FILE="${KEYSTORE_FILE:-electerm.p12}" CERT_FILE="${CERT_FILE:-electerm_publish.cer}" PROFILE_FILE="${PROFILE_FILE:-electermRelease.p7b}" @@ -46,9 +48,16 @@ KEY_ALIAS="${KEY_ALIAS:-electerm_key}" echo "==> Checking signing materials ..." -KEYSTORE_PATH="${SIGNING_DIR}/${KEYSTORE_FILE}" -CERT_PATH="${SIGNING_DIR}/${CERT_FILE}" -PROFILE_PATH="${SIGNING_DIR}/${PROFILE_FILE}" +# Use material subdirectory if it exists, otherwise fall back to signing dir +if [ -d "${SIGNING_MATERIAL_DIR}" ]; then + KEYSTORE_PATH="${SIGNING_MATERIAL_DIR}/${KEYSTORE_FILE}" + CERT_PATH="${SIGNING_MATERIAL_DIR}/${CERT_FILE}" + PROFILE_PATH="${SIGNING_MATERIAL_DIR}/${PROFILE_FILE}" +else + KEYSTORE_PATH="${SIGNING_DIR}/${KEYSTORE_FILE}" + CERT_PATH="${SIGNING_DIR}/${CERT_FILE}" + PROFILE_PATH="${SIGNING_DIR}/${PROFILE_FILE}" +fi for f in "${KEYSTORE_PATH}" "${CERT_PATH}" "${PROFILE_PATH}"; do if [ ! -f "${f}" ]; then From 6f06aa0a064b326bf378ea6c35192972d1280405 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 11:49:37 +0800 Subject: [PATCH 39/52] fix: use filenames only in signing material paths --- scripts/build-app.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 7619d4d..ac4d6c7 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -136,13 +136,13 @@ cat > "${BUILD_PROFILE}" < Date: Wed, 15 Jul 2026 11:56:59 +0800 Subject: [PATCH 40/52] fix: use full paths for signing material and copy to both directories --- .github/workflows/build.yml | 14 +++++++++++--- scripts/build-app.sh | 6 +++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 31d84a6..4d458c7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -130,18 +130,27 @@ jobs: OHOS_CERT_B64: ${{ secrets.OHOS_CERT_B64 }} OHOS_PROFILE_B64: ${{ secrets.OHOS_PROFILE_B64 }} run: | - # HarmonyOS signing tool requires a 'material' subdirectory + # Clean and create signing directories rm -rf signing mkdir -p signing/material if [ -z "${OHOS_KEYSTORE_B64}" ] || [ -z "${OHOS_CERT_B64}" ] || [ -z "${OHOS_PROFILE_B64}" ]; then echo "One or more signing material secrets are not set" exit 1 fi + # Decode to material subdirectory (required by HarmonyOS signing tool) echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/material/electerm.p12 echo "${OHOS_CERT_B64}" | base64 -d > signing/material/electerm_publish.cer echo "${OHOS_PROFILE_B64}" | base64 -d > signing/material/electermRelease.p7b + # Also copy to root signing dir for build-app.sh compatibility + cp signing/material/electerm.p12 signing/ + cp signing/material/electerm_publish.cer signing/ + cp signing/material/electermRelease.p7b signing/ - # Verify files + # Verify files in both locations + echo "Files in signing/material/:" + ls -la signing/material/ + echo "Files in signing/:" + ls -la signing/ for f in signing/material/electerm.p12 signing/material/electerm_publish.cer signing/material/electermRelease.p7b; do if [ ! -s "${f}" ]; then echo "::error::Failed to decode ${f} — check GitHub Secrets." @@ -149,7 +158,6 @@ jobs: fi echo " ✓ $(basename ${f}): $(du -h ${f} | cut -f1)" done - ls -la signing/material/ # ── Step 5: Set bundle name from secret ────────────────────────────── - name: Configure bundle name diff --git a/scripts/build-app.sh b/scripts/build-app.sh index ac4d6c7..96aa791 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -136,13 +136,13 @@ cat > "${BUILD_PROFILE}" < Date: Wed, 15 Jul 2026 12:02:17 +0800 Subject: [PATCH 41/52] fix: use relative paths for signing material to avoid path doubling --- scripts/build-app.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 96aa791..5fa2005 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -136,13 +136,13 @@ cat > "${BUILD_PROFILE}" < Date: Wed, 15 Jul 2026 12:07:40 +0800 Subject: [PATCH 42/52] fix: clean signing directory before build to avoid stale files --- scripts/build-app.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 5fa2005..2aa9374 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -236,6 +236,20 @@ echo "==> Installing ohpm dependencies ..." cd "${PROJECT_ROOT}" "${OHPM}" install +# --- Clean signing directory before build ----------------------------------- +# HarmonyOS signing tool may fail if there are stale files in signing directory +echo "==> Cleaning signing directory ..." +rm -rf "${SIGNING_DIR:?}/"* +mkdir -p "${SIGNING_DIR}" +mkdir -p "${SIGNING_MATERIAL_DIR}" +# Copy material files back after cleanup +for f in "${KEYSTORE_FILE}" "${CERT_FILE}" "${PROFILE_FILE}"; do + if [ -f "${SIGNING_MATERIAL_DIR}/${f}" ]; then + cp "${SIGNING_MATERIAL_DIR}/${f}" "${SIGNING_DIR}/" + fi +done +echo " ✓ Signing directory cleaned and files restored" + # --- Build the HAP ---------------------------------------------------------- echo "==> Building HAP (${BUILD_MODE}) ..." From a4246e330ed5b048f2302c2b8b76a5ffe2857002 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 12:08:21 +0800 Subject: [PATCH 43/52] fix: properly preserve signing files during cleanup --- scripts/build-app.sh | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 2aa9374..8acf05d 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -239,15 +239,25 @@ cd "${PROJECT_ROOT}" # --- Clean signing directory before build ----------------------------------- # HarmonyOS signing tool may fail if there are stale files in signing directory echo "==> Cleaning signing directory ..." -rm -rf "${SIGNING_DIR:?}/"* +# Temporarily preserve signing files +TEMP_SIGNING_DIR=$(mktemp -d) +for f in "${KEYSTORE_FILE}" "${CERT_FILE}" "${PROFILE_FILE}"; do + if [ -f "${SIGNING_DIR}/${f}" ]; then + cp "${SIGNING_DIR}/${f}" "${TEMP_SIGNING_DIR}/" + fi +done +# Clean and recreate signing directory +rm -rf "${SIGNING_DIR:?}" mkdir -p "${SIGNING_DIR}" mkdir -p "${SIGNING_MATERIAL_DIR}" -# Copy material files back after cleanup +# Restore signing files for f in "${KEYSTORE_FILE}" "${CERT_FILE}" "${PROFILE_FILE}"; do - if [ -f "${SIGNING_MATERIAL_DIR}/${f}" ]; then - cp "${SIGNING_MATERIAL_DIR}/${f}" "${SIGNING_DIR}/" + if [ -f "${TEMP_SIGNING_DIR}/${f}" ]; then + cp "${TEMP_SIGNING_DIR}/${f}" "${SIGNING_DIR}/" + cp "${TEMP_SIGNING_DIR}/${f}" "${SIGNING_MATERIAL_DIR}/" fi done +rm -rf "${TEMP_SIGNING_DIR}" echo " ✓ Signing directory cleaned and files restored" # --- Build the HAP ---------------------------------------------------------- From d2f1dcc6728f05c2a926484172d455f8e65d598f Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 12:21:13 +0800 Subject: [PATCH 44/52] fix: simplify signing to use root directory with absolute paths --- .github/workflows/build.yml | 26 +++++++++------------ scripts/build-app.sh | 45 +++++-------------------------------- 2 files changed, 16 insertions(+), 55 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4d458c7..82fceee 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -130,28 +130,22 @@ jobs: OHOS_CERT_B64: ${{ secrets.OHOS_CERT_B64 }} OHOS_PROFILE_B64: ${{ secrets.OHOS_PROFILE_B64 }} run: | - # Clean and create signing directories + # Clean signing directory completely rm -rf signing - mkdir -p signing/material if [ -z "${OHOS_KEYSTORE_B64}" ] || [ -z "${OHOS_CERT_B64}" ] || [ -z "${OHOS_PROFILE_B64}" ]; then echo "One or more signing material secrets are not set" exit 1 fi - # Decode to material subdirectory (required by HarmonyOS signing tool) - echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/material/electerm.p12 - echo "${OHOS_CERT_B64}" | base64 -d > signing/material/electerm_publish.cer - echo "${OHOS_PROFILE_B64}" | base64 -d > signing/material/electermRelease.p7b - # Also copy to root signing dir for build-app.sh compatibility - cp signing/material/electerm.p12 signing/ - cp signing/material/electerm_publish.cer signing/ - cp signing/material/electermRelease.p7b signing/ - - # Verify files in both locations - echo "Files in signing/material/:" - ls -la signing/material/ - echo "Files in signing/:" + # Decode signing files to project root signing/ directory + # HarmonyOS signing tool will use these directly + mkdir -p signing + echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/electerm.p12 + echo "${OHOS_CERT_B64}" | base64 -d > signing/electerm_publish.cer + echo "${OHOS_PROFILE_B64}" | base64 -d > signing/electermRelease.p7b + + # Verify files ls -la signing/ - for f in signing/material/electerm.p12 signing/material/electerm_publish.cer signing/material/electermRelease.p7b; do + for f in signing/electerm.p12 signing/electerm_publish.cer signing/electermRelease.p7b; do if [ ! -s "${f}" ]; then echo "::error::Failed to decode ${f} — check GitHub Secrets." exit 1 diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 8acf05d..e6d0134 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -37,8 +37,6 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" SIGNING_DIR="${SIGNING_DIR:-${PROJECT_ROOT}/signing}" -# HarmonyOS signing tool expects files in a 'material' subdirectory -SIGNING_MATERIAL_DIR="${SIGNING_DIR}/material" KEYSTORE_FILE="${KEYSTORE_FILE:-electerm.p12}" CERT_FILE="${CERT_FILE:-electerm_publish.cer}" PROFILE_FILE="${PROFILE_FILE:-electermRelease.p7b}" @@ -48,16 +46,9 @@ KEY_ALIAS="${KEY_ALIAS:-electerm_key}" echo "==> Checking signing materials ..." -# Use material subdirectory if it exists, otherwise fall back to signing dir -if [ -d "${SIGNING_MATERIAL_DIR}" ]; then - KEYSTORE_PATH="${SIGNING_MATERIAL_DIR}/${KEYSTORE_FILE}" - CERT_PATH="${SIGNING_MATERIAL_DIR}/${CERT_FILE}" - PROFILE_PATH="${SIGNING_MATERIAL_DIR}/${PROFILE_FILE}" -else - KEYSTORE_PATH="${SIGNING_DIR}/${KEYSTORE_FILE}" - CERT_PATH="${SIGNING_DIR}/${CERT_FILE}" - PROFILE_PATH="${SIGNING_DIR}/${PROFILE_FILE}" -fi +KEYSTORE_PATH="${SIGNING_DIR}/${KEYSTORE_FILE}" +CERT_PATH="${SIGNING_DIR}/${CERT_FILE}" +PROFILE_PATH="${SIGNING_DIR}/${PROFILE_FILE}" for f in "${KEYSTORE_PATH}" "${CERT_PATH}" "${PROFILE_PATH}"; do if [ ! -f "${f}" ]; then @@ -136,13 +127,13 @@ cat > "${BUILD_PROFILE}" < Installing ohpm dependencies ..." cd "${PROJECT_ROOT}" "${OHPM}" install -# --- Clean signing directory before build ----------------------------------- -# HarmonyOS signing tool may fail if there are stale files in signing directory -echo "==> Cleaning signing directory ..." -# Temporarily preserve signing files -TEMP_SIGNING_DIR=$(mktemp -d) -for f in "${KEYSTORE_FILE}" "${CERT_FILE}" "${PROFILE_FILE}"; do - if [ -f "${SIGNING_DIR}/${f}" ]; then - cp "${SIGNING_DIR}/${f}" "${TEMP_SIGNING_DIR}/" - fi -done -# Clean and recreate signing directory -rm -rf "${SIGNING_DIR:?}" -mkdir -p "${SIGNING_DIR}" -mkdir -p "${SIGNING_MATERIAL_DIR}" -# Restore signing files -for f in "${KEYSTORE_FILE}" "${CERT_FILE}" "${PROFILE_FILE}"; do - if [ -f "${TEMP_SIGNING_DIR}/${f}" ]; then - cp "${TEMP_SIGNING_DIR}/${f}" "${SIGNING_DIR}/" - cp "${TEMP_SIGNING_DIR}/${f}" "${SIGNING_MATERIAL_DIR}/" - fi -done -rm -rf "${TEMP_SIGNING_DIR}" -echo " ✓ Signing directory cleaned and files restored" - # --- Build the HAP ---------------------------------------------------------- echo "==> Building HAP (${BUILD_MODE}) ..." From 21e7c95639241155705fdc73c5392f9a4d99818f Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 12:27:14 +0800 Subject: [PATCH 45/52] fix: use signing/material directory consistently --- .github/workflows/build.yml | 19 +++++++------- scripts/build-app.sh | 49 ++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 82fceee..fe6ddd8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -130,22 +130,21 @@ jobs: OHOS_CERT_B64: ${{ secrets.OHOS_CERT_B64 }} OHOS_PROFILE_B64: ${{ secrets.OHOS_PROFILE_B64 }} run: | - # Clean signing directory completely - rm -rf signing + # HarmonyOS signing tool REQUIRES a 'material' subdirectory + # Create it and decode files directly there + rm -rf signing/material + mkdir -p signing/material if [ -z "${OHOS_KEYSTORE_B64}" ] || [ -z "${OHOS_CERT_B64}" ] || [ -z "${OHOS_PROFILE_B64}" ]; then echo "One or more signing material secrets are not set" exit 1 fi - # Decode signing files to project root signing/ directory - # HarmonyOS signing tool will use these directly - mkdir -p signing - echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/electerm.p12 - echo "${OHOS_CERT_B64}" | base64 -d > signing/electerm_publish.cer - echo "${OHOS_PROFILE_B64}" | base64 -d > signing/electermRelease.p7b + echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/material/electerm.p12 + echo "${OHOS_CERT_B64}" | base64 -d > signing/material/electerm_publish.cer + echo "${OHOS_PROFILE_B64}" | base64 -d > signing/material/electermRelease.p7b # Verify files - ls -la signing/ - for f in signing/electerm.p12 signing/electerm_publish.cer signing/electermRelease.p7b; do + ls -la signing/material/ + for f in signing/material/electerm.p12 signing/material/electerm_publish.cer signing/material/electermRelease.p7b; do if [ ! -s "${f}" ]; then echo "::error::Failed to decode ${f} — check GitHub Secrets." exit 1 diff --git a/scripts/build-app.sh b/scripts/build-app.sh index e6d0134..0219e3c 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# build-app.sh — Build and sign the HarmonyOS HAP package. +# build-app.sh �?Build and sign the HarmonyOS HAP package. # # Prerequisites: # - HarmonyOS Command Line Tools installed (ohpm, hvigorw in PATH) @@ -10,15 +10,15 @@ # ./scripts/build-app.sh [--debug|--release] # # Environment variables (all optional, see defaults below): -# OHOS_SDK_HOME — path to HarmonyOS SDK -# COMMANDLINE_TOOLS — path to Command Line Tools -# SIGNING_DIR — directory with .p12, .cer, .p7b (default: signing/) -# KEYSTORE_FILE — keystore filename (default: electerm.p12) -# CERT_FILE — certificate filename (default: electerm_publish.cer) -# PROFILE_FILE — profile filename (default: electermRelease.p7b) -# KEYSTORE_PASSWORD — keystore password -# KEY_PASSWORD — key password -# KEY_ALIAS — key alias (default: electerm_key) +# OHOS_SDK_HOME �?path to HarmonyOS SDK +# COMMANDLINE_TOOLS �?path to Command Line Tools +# SIGNING_DIR �?directory with .p12, .cer, .p7b (default: signing/) +# KEYSTORE_FILE �?keystore filename (default: electerm.p12) +# CERT_FILE �?certificate filename (default: electerm_publish.cer) +# PROFILE_FILE �?profile filename (default: electermRelease.p7b) +# KEYSTORE_PASSWORD �?keystore password +# KEY_PASSWORD �?key password +# KEY_ALIAS �?key alias (default: electerm_key) set -euo pipefail @@ -37,6 +37,8 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" SIGNING_DIR="${SIGNING_DIR:-${PROJECT_ROOT}/signing}" +# HarmonyOS signing tool requires files in signing/material/ subdirectory +SIGNING_MATERIAL_DIR="${SIGNING_DIR}/material" KEYSTORE_FILE="${KEYSTORE_FILE:-electerm.p12}" CERT_FILE="${CERT_FILE:-electerm_publish.cer}" PROFILE_FILE="${PROFILE_FILE:-electermRelease.p7b}" @@ -46,21 +48,21 @@ KEY_ALIAS="${KEY_ALIAS:-electerm_key}" echo "==> Checking signing materials ..." -KEYSTORE_PATH="${SIGNING_DIR}/${KEYSTORE_FILE}" -CERT_PATH="${SIGNING_DIR}/${CERT_FILE}" -PROFILE_PATH="${SIGNING_DIR}/${PROFILE_FILE}" +KEYSTORE_PATH="${SIGNING_MATERIAL_DIR}/${KEYSTORE_FILE}" +CERT_PATH="${SIGNING_MATERIAL_DIR}/${CERT_FILE}" +PROFILE_PATH="${SIGNING_MATERIAL_DIR}/${PROFILE_FILE}" for f in "${KEYSTORE_PATH}" "${CERT_PATH}" "${PROFILE_PATH}"; do if [ ! -f "${f}" ]; then - echo " ✗ Missing: ${f}" + echo " �?Missing: ${f}" echo " See build/ENV_SETUP.md for instructions." exit 1 fi - echo " ✓ Found: $(basename "${f}")" + echo " �?Found: $(basename "${f}")" done if [ -z "${KEYSTORE_PASSWORD:-}" ] || [ -z "${KEY_PASSWORD:-}" ]; then - echo " ✗ KEYSTORE_PASSWORD and KEY_PASSWORD environment variables are required." + echo " �?KEYSTORE_PASSWORD and KEY_PASSWORD environment variables are required." exit 1 fi @@ -68,7 +70,7 @@ fi KEYSTORE_LEN=${#KEYSTORE_PASSWORD} KEY_LEN=${#KEY_PASSWORD} if [ "${KEYSTORE_LEN}" -lt 32 ] || [ "${KEY_LEN}" -lt 32 ]; then - echo " ✗ ERROR: HarmonyOS signing requires storePassword and keyPassword" + echo " �?ERROR: HarmonyOS signing requires storePassword and keyPassword" echo " to be at least 32 characters each (got ${KEYSTORE_LEN} and ${KEY_LEN})." echo " Update OHOS_KEYSTORE_PASSWORD and OHOS_KEY_PASSWORD GitHub Secrets." exit 1 @@ -92,7 +94,7 @@ if [ -z "${COMMANDLINE_TOOLS:-}" ]; then fi if [ -z "${COMMANDLINE_TOOLS:-}" ]; then - echo " ✗ HarmonyOS Command Line Tools not found." + echo " �?HarmonyOS Command Line Tools not found." echo " Set COMMANDLINE_TOOLS env var or install to /opt/commandline-tools-linux-x64" exit 1 fi @@ -162,7 +164,7 @@ cat > "${BUILD_PROFILE}" < "${NPMRC_FILE}" <<'NPMRC' @ohos:registry=https://repo.harmonyos.com/npm/ registry=https://registry.npmjs.org/ NPMRC -echo " ✓ Created ${NPMRC_FILE} with scoped HarmonyOS + npmjs registry" +echo " �?Created ${NPMRC_FILE} with scoped HarmonyOS + npmjs registry" # --- Install ohpm dependencies ---------------------------------------------- @@ -245,7 +247,7 @@ HAP_DIR="${PROJECT_ROOT}/entry/build/default/outputs/default" HAP_FILE=$(find "${HAP_DIR}" -name "*.hap" -type f | head -1) if [ -z "${HAP_FILE}" ]; then - echo " ✗ No .hap file found in ${HAP_DIR}" + echo " �?No .hap file found in ${HAP_DIR}" exit 1 fi @@ -256,3 +258,4 @@ echo " HAP: ${HAP_FILE}" echo " Size: $(du -h "${HAP_FILE}" | cut -f1)" echo "" echo " Install with: hdc install \"${HAP_FILE}\"" + From 4c46a1a5a4eff82691e34d7046c176cf7e058e57 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 12:32:20 +0800 Subject: [PATCH 46/52] fix: use only filenames in build-profile.json5 to avoid path doubling --- scripts/build-app.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 0219e3c..2fb7beb 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -129,13 +129,13 @@ cat > "${BUILD_PROFILE}" < Date: Wed, 15 Jul 2026 12:37:20 +0800 Subject: [PATCH 47/52] debug: add file type verification for signing materials --- .github/workflows/build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fe6ddd8..45abdca 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -142,7 +142,7 @@ jobs: echo "${OHOS_CERT_B64}" | base64 -d > signing/material/electerm_publish.cer echo "${OHOS_PROFILE_B64}" | base64 -d > signing/material/electermRelease.p7b - # Verify files + # Verify files exist and have correct sizes ls -la signing/material/ for f in signing/material/electerm.p12 signing/material/electerm_publish.cer signing/material/electermRelease.p7b; do if [ ! -s "${f}" ]; then @@ -151,6 +151,9 @@ jobs: fi echo " ✓ $(basename ${f}): $(du -h ${f} | cut -f1)" done + # Verify file types (debug) + echo "File types:" + file signing/material/electerm.p12 signing/material/electerm_publish.cer signing/material/electermRelease.p7b # ── Step 5: Set bundle name from secret ────────────────────────────── - name: Configure bundle name From 3f131c0f3fb13b11f0876e569583a018dcf7077b Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 12:44:07 +0800 Subject: [PATCH 48/52] fix --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 45abdca..4afe61d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -178,6 +178,8 @@ jobs: KEYSTORE_PASSWORD: ${{ secrets.OHOS_KEYSTORE_PASSWORD }} KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} + # Debug: show actual alias value (masked in logs) + # The alias 'electerm_key' must match the one in the .p12 keystore # ── Step 7: Upload artifact ────────────────────────────────────────── - name: Find HAP file From 100ad5359b4baa453e7d2a76f482247d0547fbaf Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 16:01:12 +0800 Subject: [PATCH 49/52] fix --- .github/workflows/build.yml | 24 +++--- scripts/build-app.sh | 156 +++++++++++++++++++++--------------- 2 files changed, 99 insertions(+), 81 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4afe61d..dbdc862 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -130,30 +130,27 @@ jobs: OHOS_CERT_B64: ${{ secrets.OHOS_CERT_B64 }} OHOS_PROFILE_B64: ${{ secrets.OHOS_PROFILE_B64 }} run: | - # HarmonyOS signing tool REQUIRES a 'material' subdirectory - # Create it and decode files directly there - rm -rf signing/material - mkdir -p signing/material + # Decode signing files to signing/ directory. + # We sign with hap-sign-tool.jar directly (not hvigor's built-in signer), + # so no material/ subdirectory is needed. + mkdir -p signing if [ -z "${OHOS_KEYSTORE_B64}" ] || [ -z "${OHOS_CERT_B64}" ] || [ -z "${OHOS_PROFILE_B64}" ]; then echo "One or more signing material secrets are not set" exit 1 fi - echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/material/electerm.p12 - echo "${OHOS_CERT_B64}" | base64 -d > signing/material/electerm_publish.cer - echo "${OHOS_PROFILE_B64}" | base64 -d > signing/material/electermRelease.p7b + echo "${OHOS_KEYSTORE_B64}" | base64 -d > signing/electerm.p12 + echo "${OHOS_CERT_B64}" | base64 -d > signing/electerm_publish.cer + echo "${OHOS_PROFILE_B64}" | base64 -d > signing/electermRelease.p7b # Verify files exist and have correct sizes - ls -la signing/material/ - for f in signing/material/electerm.p12 signing/material/electerm_publish.cer signing/material/electermRelease.p7b; do + ls -la signing/ + for f in signing/electerm.p12 signing/electerm_publish.cer signing/electermRelease.p7b; do if [ ! -s "${f}" ]; then echo "::error::Failed to decode ${f} — check GitHub Secrets." exit 1 fi echo " ✓ $(basename ${f}): $(du -h ${f} | cut -f1)" done - # Verify file types (debug) - echo "File types:" - file signing/material/electerm.p12 signing/material/electerm_publish.cer signing/material/electermRelease.p7b # ── Step 5: Set bundle name from secret ────────────────────────────── - name: Configure bundle name @@ -178,9 +175,6 @@ jobs: KEYSTORE_PASSWORD: ${{ secrets.OHOS_KEYSTORE_PASSWORD }} KEY_PASSWORD: ${{ secrets.OHOS_KEY_PASSWORD }} KEY_ALIAS: ${{ secrets.OHOS_KEY_ALIAS }} - # Debug: show actual alias value (masked in logs) - # The alias 'electerm_key' must match the one in the .p12 keystore - # ── Step 7: Upload artifact ────────────────────────────────────────── - name: Find HAP file id: find_hap diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 2fb7beb..05c5df7 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -1,24 +1,29 @@ #!/usr/bin/env bash -# build-app.sh �?Build and sign the HarmonyOS HAP package. +# build-app.sh — Build and sign the HarmonyOS HAP package. +# +# This script builds an UNSIGNED HAP using hvigorw, then signs it +# directly using hap-sign-tool.jar with plaintext passwords. +# This bypasses the hvigor plugin's password encryption requirement +# (which needs DevEco Studio's encrypted passwords + material/ key dirs). # # Prerequisites: # - HarmonyOS Command Line Tools installed (ohpm, hvigorw in PATH) -# - Signing materials in signing/ directory OR provided via env vars +# - Signing materials in signing/ directory # - prepare-node.sh and prepare-web.sh already run # # Usage: # ./scripts/build-app.sh [--debug|--release] # # Environment variables (all optional, see defaults below): -# OHOS_SDK_HOME �?path to HarmonyOS SDK -# COMMANDLINE_TOOLS �?path to Command Line Tools -# SIGNING_DIR �?directory with .p12, .cer, .p7b (default: signing/) -# KEYSTORE_FILE �?keystore filename (default: electerm.p12) -# CERT_FILE �?certificate filename (default: electerm_publish.cer) -# PROFILE_FILE �?profile filename (default: electermRelease.p7b) -# KEYSTORE_PASSWORD �?keystore password -# KEY_PASSWORD �?key password -# KEY_ALIAS �?key alias (default: electerm_key) +# OHOS_SDK_HOME — path to HarmonyOS SDK +# COMMANDLINE_TOOLS — path to Command Line Tools +# SIGNING_DIR — directory with .p12, .cer, .p7b (default: signing/) +# KEYSTORE_FILE — keystore filename (default: electerm.p12) +# CERT_FILE — certificate filename (default: electerm_publish.cer) +# PROFILE_FILE — profile filename (default: electermRelease.p7b) +# KEYSTORE_PASSWORD — keystore password (plaintext) +# KEY_PASSWORD — key password (plaintext) +# KEY_ALIAS — key alias (default: electerm_key) set -euo pipefail @@ -37,8 +42,6 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" SIGNING_DIR="${SIGNING_DIR:-${PROJECT_ROOT}/signing}" -# HarmonyOS signing tool requires files in signing/material/ subdirectory -SIGNING_MATERIAL_DIR="${SIGNING_DIR}/material" KEYSTORE_FILE="${KEYSTORE_FILE:-electerm.p12}" CERT_FILE="${CERT_FILE:-electerm_publish.cer}" PROFILE_FILE="${PROFILE_FILE:-electermRelease.p7b}" @@ -48,31 +51,21 @@ KEY_ALIAS="${KEY_ALIAS:-electerm_key}" echo "==> Checking signing materials ..." -KEYSTORE_PATH="${SIGNING_MATERIAL_DIR}/${KEYSTORE_FILE}" -CERT_PATH="${SIGNING_MATERIAL_DIR}/${CERT_FILE}" -PROFILE_PATH="${SIGNING_MATERIAL_DIR}/${PROFILE_FILE}" +KEYSTORE_PATH="${SIGNING_DIR}/${KEYSTORE_FILE}" +CERT_PATH="${SIGNING_DIR}/${CERT_FILE}" +PROFILE_PATH="${SIGNING_DIR}/${PROFILE_FILE}" for f in "${KEYSTORE_PATH}" "${CERT_PATH}" "${PROFILE_PATH}"; do if [ ! -f "${f}" ]; then - echo " �?Missing: ${f}" + echo " ✗ Missing: ${f}" echo " See build/ENV_SETUP.md for instructions." exit 1 fi - echo " �?Found: $(basename "${f}")" + echo " ✓ Found: $(basename "${f}")" done if [ -z "${KEYSTORE_PASSWORD:-}" ] || [ -z "${KEY_PASSWORD:-}" ]; then - echo " �?KEYSTORE_PASSWORD and KEY_PASSWORD environment variables are required." - exit 1 -fi - -# HarmonyOS signing requires passwords to be at least 32 characters -KEYSTORE_LEN=${#KEYSTORE_PASSWORD} -KEY_LEN=${#KEY_PASSWORD} -if [ "${KEYSTORE_LEN}" -lt 32 ] || [ "${KEY_LEN}" -lt 32 ]; then - echo " �?ERROR: HarmonyOS signing requires storePassword and keyPassword" - echo " to be at least 32 characters each (got ${KEYSTORE_LEN} and ${KEY_LEN})." - echo " Update OHOS_KEYSTORE_PASSWORD and OHOS_KEY_PASSWORD GitHub Secrets." + echo " ✗ KEYSTORE_PASSWORD and KEY_PASSWORD environment variables are required." exit 1 fi @@ -94,7 +87,7 @@ if [ -z "${COMMANDLINE_TOOLS:-}" ]; then fi if [ -z "${COMMANDLINE_TOOLS:-}" ]; then - echo " �?HarmonyOS Command Line Tools not found." + echo " ✗ HarmonyOS Command Line Tools not found." echo " Set COMMANDLINE_TOOLS env var or install to /opt/commandline-tools-linux-x64" exit 1 fi @@ -111,38 +104,37 @@ fi export OHOS_SDK_HOME export PATH="${PATH}:${COMMANDLINE_TOOLS}/bin:${COMMANDLINE_TOOLS}/hvigor/bin" +# Locate hap-sign-tool.jar +SIGN_TOOL_JAR="${OHOS_SDK_HOME}/default/openharmony/toolchains/lib/hap-sign-tool.jar" +if [ ! -f "${SIGN_TOOL_JAR}" ]; then + # Try alternative path + SIGN_TOOL_JAR=$(find "${OHOS_SDK_HOME}" -name "hap-sign-tool.jar" -type f 2>/dev/null | head -1) +fi +if [ -z "${SIGN_TOOL_JAR:-}" ] || [ ! -f "${SIGN_TOOL_JAR}" ]; then + echo " ✗ hap-sign-tool.jar not found in SDK" + exit 1 +fi + echo " OHOS_SDK_HOME: ${OHOS_SDK_HOME}" echo " ohpm: ${OHPM}" echo " hvigorw: ${HVIGORW}" +echo " sign tool: ${SIGN_TOOL_JAR}" -# --- Generate build-profile.json5 with signing config ----------------------- +# --- Generate build-profile.json5 (without signing config) ------------------ +# We build an UNSIGNED HAP and sign it separately with hap-sign-tool.jar. +# This avoids the hvigor plugin's password encryption requirement. -echo "==> Configuring signing in build-profile.json5 ..." +echo "==> Configuring build-profile.json5 ..." BUILD_PROFILE="${PROJECT_ROOT}/build-profile.json5" cat > "${BUILD_PROFILE}" < "${BUILD_PROFILE}" < "${HVIGOR_CONFIG}" < Configuring npm registry for hvigor ..." -# hvigor requires an .npmrc file in the user's home directory. -# @ohos/hvigor is still fetched from the HarmonyOS npm registry. NPMRC_FILE="${HOME}/.npmrc" cat > "${NPMRC_FILE}" <<'NPMRC' @ohos:registry=https://repo.harmonyos.com/npm/ registry=https://registry.npmjs.org/ NPMRC -echo " �?Created ${NPMRC_FILE} with scoped HarmonyOS + npmjs registry" +echo " ✓ Created ${NPMRC_FILE} with scoped HarmonyOS + npmjs registry" # --- Install ohpm dependencies ---------------------------------------------- @@ -229,28 +216,66 @@ echo "==> Installing ohpm dependencies ..." cd "${PROJECT_ROOT}" "${OHPM}" install -# --- Build the HAP ---------------------------------------------------------- +# --- Build the unsigned HAP ------------------------------------------------- -echo "==> Building HAP (${BUILD_MODE}) ..." +echo "==> Building unsigned HAP (${BUILD_MODE}) ..." +# Build with enableSignTask=false to skip the hvigor signing step. +# We sign separately using hap-sign-tool.jar with plaintext passwords. if [ "${BUILD_MODE}" = "debug" ]; then "${HVIGORW}" assembleHap --mode module -p product=default \ - -p buildMode=debug --no-daemon + -p buildMode=debug -p enableSignTask=false --no-daemon else "${HVIGORW}" assembleHap --mode module -p product=default \ - -p buildMode=release --no-daemon + -p buildMode=release -p enableSignTask=false --no-daemon fi -# --- Locate output ---------------------------------------------------------- +# --- Locate the unsigned HAP ------------------------------------------------ HAP_DIR="${PROJECT_ROOT}/entry/build/default/outputs/default" -HAP_FILE=$(find "${HAP_DIR}" -name "*.hap" -type f | head -1) +UNSIGNED_HAP=$(find "${HAP_DIR}" -name "*.hap" -type f | head -1) -if [ -z "${HAP_FILE}" ]; then - echo " �?No .hap file found in ${HAP_DIR}" +if [ -z "${UNSIGNED_HAP}" ]; then + echo " ✗ No .hap file found in ${HAP_DIR}" exit 1 fi +echo " ✓ Unsigned HAP: ${UNSIGNED_HAP} ($(du -h "${UNSIGNED_HAP}" | cut -f1))" + +# --- Sign the HAP with hap-sign-tool.jar ------------------------------------ + +echo "==> Signing HAP with hap-sign-tool.jar ..." + +SIGNED_HAP="${UNSIGNED_HAP%.hap}-signed.hap" + +java -jar "${SIGN_TOOL_JAR}" sign-app \ + -mode localSign \ + -keyAlias "${KEY_ALIAS}" \ + -keyPwd "${KEY_PASSWORD}" \ + -appCertFile "${CERT_PATH}" \ + -profileFile "${PROFILE_PATH}" \ + -inFile "${UNSIGNED_HAP}" \ + -signAlg SHA256withECDSA \ + -keystoreFile "${KEYSTORE_PATH}" \ + -keystorePwd "${KEYSTORE_PASSWORD}" \ + -outFile "${SIGNED_HAP}" \ + -compatibleVersion 13 \ + -signCode 1 \ + -pwdInputMode 0 + +if [ ! -f "${SIGNED_HAP}" ]; then + echo " ✗ Signing failed — no signed HAP produced" + exit 1 +fi + +# Replace the unsigned HAP with the signed one +mv -f "${SIGNED_HAP}" "${UNSIGNED_HAP}" +HAP_FILE="${UNSIGNED_HAP}" + +echo " ✓ Signed HAP: ${HAP_FILE} ($(du -h "${HAP_FILE}" | cut -f1))" + +# --- Done ------------------------------------------------------------------- + echo "" echo "==> Build complete!" echo " Mode: ${BUILD_MODE}" @@ -258,4 +283,3 @@ echo " HAP: ${HAP_FILE}" echo " Size: $(du -h "${HAP_FILE}" | cut -f1)" echo "" echo " Install with: hdc install \"${HAP_FILE}\"" - From 5a6c0a5767506bfc741ca3dacc199dcc142cc02e Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 16:10:52 +0800 Subject: [PATCH 50/52] fix: remove unsupported signing params (-mode, -compatibleVersion, -signCode, -pwdInputMode) --- scripts/build-app.sh | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 05c5df7..3b001cf 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -248,8 +248,16 @@ echo "==> Signing HAP with hap-sign-tool.jar ..." SIGNED_HAP="${UNSIGNED_HAP%.hap}-signed.hap" +# Try to show the supported parameters from the tool (helps debugging) +echo "==> Checking hap-sign-tool.jar supported parameters ..." +java -jar "${SIGN_TOOL_JAR}" sign-app --help 2>&1 || \ + java -jar "${SIGN_TOOL_JAR}" --help 2>&1 || \ + echo " ⚠ Could not retrieve help text" + +# Sign using only universally supported parameters. +# Note: -compatibleVersion, -signCode, and -pwdInputMode were added in +# newer SDK versions and cause "COMMAND_PARAM_ERROR" (code: 110) on older tools. java -jar "${SIGN_TOOL_JAR}" sign-app \ - -mode localSign \ -keyAlias "${KEY_ALIAS}" \ -keyPwd "${KEY_PASSWORD}" \ -appCertFile "${CERT_PATH}" \ @@ -258,10 +266,7 @@ java -jar "${SIGN_TOOL_JAR}" sign-app \ -signAlg SHA256withECDSA \ -keystoreFile "${KEYSTORE_PATH}" \ -keystorePwd "${KEYSTORE_PASSWORD}" \ - -outFile "${SIGNED_HAP}" \ - -compatibleVersion 13 \ - -signCode 1 \ - -pwdInputMode 0 + -outFile "${SIGNED_HAP}" if [ ! -f "${SIGNED_HAP}" ]; then echo " ✗ Signing failed — no signed HAP produced" From 980ec3fcaa938f562994ac55e3d412e5fd3cad08 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 16:18:02 +0800 Subject: [PATCH 51/52] fix: add back -mode localSign, keep -compatibleVersion/-signCode/-pwdInputMode removed --- scripts/build-app.sh | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 3b001cf..2195828 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -248,16 +248,12 @@ echo "==> Signing HAP with hap-sign-tool.jar ..." SIGNED_HAP="${UNSIGNED_HAP%.hap}-signed.hap" -# Try to show the supported parameters from the tool (helps debugging) -echo "==> Checking hap-sign-tool.jar supported parameters ..." -java -jar "${SIGN_TOOL_JAR}" sign-app --help 2>&1 || \ - java -jar "${SIGN_TOOL_JAR}" --help 2>&1 || \ - echo " ⚠ Could not retrieve help text" - -# Sign using only universally supported parameters. -# Note: -compatibleVersion, -signCode, and -pwdInputMode were added in -# newer SDK versions and cause "COMMAND_PARAM_ERROR" (code: 110) on older tools. +# Sign the HAP. +# NOTE: -mode localSign is required (COMMAND_ERROR code 101 if missing). +# NOTE: -compatibleVersion, -signCode, -pwdInputMode are NOT supported by +# this SDK version (COMMAND_PARAM_ERROR code 110). They were added later. java -jar "${SIGN_TOOL_JAR}" sign-app \ + -mode localSign \ -keyAlias "${KEY_ALIAS}" \ -keyPwd "${KEY_PASSWORD}" \ -appCertFile "${CERT_PATH}" \ From dd6dec8ce838cd63f295ed3f7806b0639b86d230 Mon Sep 17 00:00:00 2001 From: ZHAO Xudong Date: Wed, 15 Jul 2026 16:36:12 +0800 Subject: [PATCH 52/52] fix --- .github/workflows/build.yml | 9 +++++++++ scripts/build-app.sh | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dbdc862..e20fc1e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -61,6 +61,15 @@ jobs: g++ \ libsecret-1-dev + # ── Setup JDK (for hap-sign-tool.jar — must match or exceed the JDK + # used to create the .p12 keystore, otherwise PKCS12 loading fails + # with "keystore password was incorrect") ──────────────────────── + - name: Setup JDK 21 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + # ── Step 1: Download ohos-node ─────────────────────────────────────── - name: Prepare ohos-node run: ./scripts/prepare-node.sh diff --git a/scripts/build-app.sh b/scripts/build-app.sh index 2195828..256e91b 100755 --- a/scripts/build-app.sh +++ b/scripts/build-app.sh @@ -246,6 +246,10 @@ echo " ✓ Unsigned HAP: ${UNSIGNED_HAP} ($(du -h "${UNSIGNED_HAP}" | cut -f1 echo "==> Signing HAP with hap-sign-tool.jar ..." +# Show Java version for debugging (PKCS12 keystore compatibility) +JAVA_VERSION=$(java -version 2>&1 | head -1) +echo " Java: ${JAVA_VERSION}" + SIGNED_HAP="${UNSIGNED_HAP%.hap}-signed.hap" # Sign the HAP.