From 9a8c23e2f065d447b55a02ff55dc5d608dafc90e Mon Sep 17 00:00:00 2001 From: nanxun Date: Fri, 21 Aug 2026 13:38:39 +0800 Subject: [PATCH] ci: prime sqlite cache before tests --- Jenkinsfile | 88 +++++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 39 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 42ccc5c..60fdf5a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -97,6 +97,55 @@ PY set -euo pipefail "$FLUTTER_ROOT/bin/flutter" config --no-analytics "$FLUTTER_ROOT/bin/flutter" pub get + ''' + sh ''' + set -euo pipefail + # sqlite3 native hooks use a workspace-local cache, which cleanWs + # removes. Prime it from a verified node-local cache so a transient + # GitHub connection failure cannot block tests or the Gradle build. + sqlite_package_dir=$(python3 - <<'PY' +import json, pathlib, urllib.parse +config = json.loads(pathlib.Path('.dart_tool/package_config.json').read_text(encoding='utf-8')) +package = next(item for item in config['packages'] if item['name'] == 'sqlite3') +uri = urllib.parse.urlparse(package['rootUri']) +if uri.scheme != 'file': + raise SystemExit(f"unexpected sqlite3 package URI: {package['rootUri']}") +print(pathlib.Path(urllib.parse.unquote(uri.path)).resolve()) +PY + ) + sqlite_release=$(basename "$sqlite_package_dir") + + prime_sqlcipher() { + sqlite_asset="$1" + sqlite_hash=$(sed -n "s/.*'$sqlite_asset': '\\([0-9a-f]\\{64\\}\\)'.*/\\1/p" \ + "$sqlite_package_dir/lib/src/hook/asset_hashes.dart") + test "${#sqlite_hash}" -eq 64 + + sqlite_cache_dir="/home/nanxunai/.cache/jizhang/sqlite3/$sqlite_hash" + sqlite_cache_file="$sqlite_cache_dir/libsqlcipher.so" + sqlite_cache_tmp="$sqlite_cache_file.tmp" + mkdir -p "$sqlite_cache_dir" + if ! printf '%s %s\n' "$sqlite_hash" "$sqlite_cache_file" | sha256sum -c -; then + rm -f "$sqlite_cache_tmp" + curl --fail --location --retry 8 --retry-all-errors --retry-delay 3 \ + --connect-timeout 20 --max-time 600 \ + --output "$sqlite_cache_tmp" \ + "https://github.com/simolus3/sqlite3.dart/releases/download/$sqlite_release/$sqlite_asset" + printf '%s %s\n' "$sqlite_hash" "$sqlite_cache_tmp" | sha256sum -c - + mv -f "$sqlite_cache_tmp" "$sqlite_cache_file" + fi + + sqlite_hash_prefix=$(printf '%.8s' "$sqlite_hash") + sqlite_hook_dir=".dart_tool/hooks_runner/shared/sqlite3/build/download-$sqlite_hash_prefix" + mkdir -p "$sqlite_hook_dir" + cp "$sqlite_cache_file" "$sqlite_hook_dir/libsqlcipher.so" + } + + prime_sqlcipher libsqlcipher.x64.linux.so + prime_sqlcipher libsqlcipher.arm64.android.so + ''' + sh ''' + set -euo pipefail # Keep warnings/errors fatal while allowing the repository's existing # informational style lints to be cleaned up independently. "$FLUTTER_ROOT/bin/flutter" analyze --no-pub --no-fatal-infos @@ -111,45 +160,6 @@ PY stage('Build arm64 Internal Release') { steps { dir('frontend') { - sh ''' - set -euo pipefail - # sqlite3 native hooks use a workspace-local cache, which cleanWs - # removes. Prime it from a verified node-local cache so a transient - # GitHub connection failure cannot waste an entire Gradle build. - sqlite_package_dir=$(python3 - <<'PY' -import json, pathlib, urllib.parse -config = json.loads(pathlib.Path('.dart_tool/package_config.json').read_text(encoding='utf-8')) -package = next(item for item in config['packages'] if item['name'] == 'sqlite3') -uri = urllib.parse.urlparse(package['rootUri']) -if uri.scheme != 'file': - raise SystemExit(f"unexpected sqlite3 package URI: {package['rootUri']}") -print(pathlib.Path(urllib.parse.unquote(uri.path)).resolve()) -PY - ) - sqlite_asset='libsqlcipher.arm64.android.so' - sqlite_hash=$(sed -n "s/.*'$sqlite_asset': '\\([0-9a-f]\\{64\\}\\)'.*/\\1/p" \ - "$sqlite_package_dir/lib/src/hook/asset_hashes.dart") - test "${#sqlite_hash}" -eq 64 - - sqlite_cache_dir="/home/nanxunai/.cache/jizhang/sqlite3/$sqlite_hash" - sqlite_cache_file="$sqlite_cache_dir/libsqlcipher.so" - sqlite_cache_tmp="$sqlite_cache_file.tmp" - mkdir -p "$sqlite_cache_dir" - if ! printf '%s %s\n' "$sqlite_hash" "$sqlite_cache_file" | sha256sum -c -; then - rm -f "$sqlite_cache_tmp" - sqlite_release=$(basename "$sqlite_package_dir") - curl --fail --location --retry 8 --retry-all-errors --retry-delay 3 \ - --connect-timeout 20 --max-time 600 \ - --output "$sqlite_cache_tmp" \ - "https://github.com/simolus3/sqlite3.dart/releases/download/$sqlite_release/$sqlite_asset" - printf '%s %s\n' "$sqlite_hash" "$sqlite_cache_tmp" | sha256sum -c - - mv -f "$sqlite_cache_tmp" "$sqlite_cache_file" - fi - - sqlite_hook_dir=".dart_tool/hooks_runner/shared/sqlite3/build/download-${sqlite_hash:0:8}" - mkdir -p "$sqlite_hook_dir" - cp "$sqlite_cache_file" "$sqlite_hook_dir/libsqlcipher.so" - ''' retry(3) { sh ''' set -euo pipefail