Skip to content

Commit 7a3b428

Browse files
authored
Merge branch 'staging' into claude/review-branch-quality-WssvC
2 parents 9bcba7d + b296975 commit 7a3b428

157 files changed

Lines changed: 32809 additions & 8311 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build-ci-image.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ name: Build CI image
22

33
on:
44
push:
5-
branches: [main]
5+
branches: [main, staging]
66
paths:
77
- 'Dockerfile'
88
- '.github/workflows/build-ci-image.yaml'
99
workflow_dispatch:
1010

1111
env:
12-
IMAGE: YOUR_DOCKERHUB_USERNAME/stack-wallet-ci
12+
IMAGE: ${{ secrets.DOCKERHUB_USERNAME }}/stackwallet-ci
1313

1414
jobs:
1515
build:

.github/workflows/build.yaml

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
name: Build
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v[0-9]+.[0-9]+.[0-9]+'
7+
workflow_dispatch:
8+
inputs:
9+
version:
10+
description: 'App version string (e.g. 1.2.3)'
11+
required: true
12+
default: '0.0.1'
13+
build_number:
14+
description: 'Build number (integer)'
15+
required: true
16+
default: '1'
17+
18+
jobs:
19+
20+
build-linux:
21+
runs-on: ubuntu-24.04
22+
container:
23+
image: stackwallet/stackwallet-ci:latest
24+
credentials:
25+
username: ${{ secrets.DOCKERHUB_USERNAME }}
26+
password: ${{ secrets.DOCKERHUB_TOKEN }}
27+
steps:
28+
- uses: actions/checkout@v6
29+
with:
30+
fetch-depth: 0
31+
submodules: recursive
32+
33+
- name: Set version
34+
id: ver
35+
run: |
36+
if [ "${{ github.ref_type }}" = "tag" ]; then
37+
VERSION="${{ github.ref_name }}"
38+
VERSION="${VERSION#v}"
39+
BUILD_NUMBER="${{ github.run_number }}"
40+
else
41+
VERSION="${{ inputs.version }}"
42+
BUILD_NUMBER="${{ inputs.build_number }}"
43+
fi
44+
echo "version=${VERSION}" >> $GITHUB_OUTPUT
45+
echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT
46+
47+
- name: Configure app
48+
run: |
49+
cd scripts
50+
echo "yes" | ./build_app.sh \
51+
-v "${{ steps.ver.outputs.version }}" \
52+
-b "${{ steps.ver.outputs.build_number }}" \
53+
-p linux -a stack_wallet -d -s
54+
55+
- name: Get dependencies
56+
run: flutter pub get
57+
58+
- name: Create git_versions.dart stubs
59+
run: |
60+
mkdir -p crypto_plugins/flutter_libepiccash/lib
61+
mkdir -p crypto_plugins/flutter_libmwc/lib
62+
63+
EPIC_TAG=$(git -C crypto_plugins/flutter_libepiccash describe --tags --exact-match HEAD 2>/dev/null || echo "dev")
64+
MWC_TAG=$(git -C crypto_plugins/flutter_libmwc describe --tags --exact-match HEAD 2>/dev/null || echo "dev")
65+
66+
printf 'String getPluginVersion() => "%s";\n' "$EPIC_TAG" \
67+
> crypto_plugins/flutter_libepiccash/lib/git_versions.dart
68+
printf 'String getPluginVersion() => "%s";\n' "$MWC_TAG" \
69+
> crypto_plugins/flutter_libmwc/lib/git_versions.dart
70+
71+
- name: Decode secrets
72+
env:
73+
CHANGE_NOW: ${{ secrets.CHANGE_NOW }}
74+
run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart
75+
76+
- name: Generate app config
77+
run: dart run build_runner build --delete-conflicting-outputs
78+
79+
- name: Build
80+
run: flutter build linux --release
81+
82+
- name: Package
83+
run: |
84+
tar -czf "stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" \
85+
-C build/linux/x64/release bundle
86+
87+
- uses: actions/upload-artifact@v4
88+
with:
89+
name: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}
90+
path: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz
91+
92+
build-android:
93+
runs-on: ubuntu-24.04
94+
container:
95+
image: stackwallet/stackwallet-ci:latest
96+
credentials:
97+
username: ${{ secrets.DOCKERHUB_USERNAME }}
98+
password: ${{ secrets.DOCKERHUB_TOKEN }}
99+
steps:
100+
- uses: actions/checkout@v6
101+
with:
102+
fetch-depth: 0
103+
submodules: recursive
104+
105+
- name: Set version
106+
id: ver
107+
run: |
108+
if [ "${{ github.ref_type }}" = "tag" ]; then
109+
VERSION="${{ github.ref_name }}"
110+
VERSION="${VERSION#v}"
111+
BUILD_NUMBER="${{ github.run_number }}"
112+
else
113+
VERSION="${{ inputs.version }}"
114+
BUILD_NUMBER="${{ inputs.build_number }}"
115+
fi
116+
echo "version=${VERSION}" >> $GITHUB_OUTPUT
117+
echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT
118+
119+
- name: Configure app
120+
run: |
121+
cd scripts
122+
echo "yes" | ./build_app.sh \
123+
-v "${{ steps.ver.outputs.version }}" \
124+
-b "${{ steps.ver.outputs.build_number }}" \
125+
-p android -a stack_wallet -d -s
126+
127+
- name: Get dependencies
128+
run: flutter pub get
129+
130+
- name: Create git_versions.dart stubs
131+
run: |
132+
mkdir -p crypto_plugins/flutter_libepiccash/lib
133+
mkdir -p crypto_plugins/flutter_libmwc/lib
134+
135+
EPIC_TAG=$(git -C crypto_plugins/flutter_libepiccash describe --tags --exact-match HEAD 2>/dev/null || echo "dev")
136+
MWC_TAG=$(git -C crypto_plugins/flutter_libmwc describe --tags --exact-match HEAD 2>/dev/null || echo "dev")
137+
138+
printf 'String getPluginVersion() => "%s";\n' "$EPIC_TAG" \
139+
> crypto_plugins/flutter_libepiccash/lib/git_versions.dart
140+
printf 'String getPluginVersion() => "%s";\n' "$MWC_TAG" \
141+
> crypto_plugins/flutter_libmwc/lib/git_versions.dart
142+
143+
- name: Decode secrets
144+
env:
145+
CHANGE_NOW: ${{ secrets.CHANGE_NOW }}
146+
run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart
147+
148+
- name: Generate app config
149+
run: dart run build_runner build --delete-conflicting-outputs
150+
151+
- name: Set up Android local.properties
152+
run: |
153+
cat > android/local.properties <<EOF
154+
sdk.dir=${ANDROID_SDK_ROOT}
155+
flutter.sdk=${FLUTTER_HOME}
156+
EOF
157+
158+
- name: Set up signing
159+
env:
160+
KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
161+
run: |
162+
echo "$KEYSTORE_BASE64" | base64 --decode > android/keystore.jks
163+
cat > android/key.properties <<EOF
164+
storeFile=../keystore.jks
165+
storePassword=${{ secrets.ANDROID_STORE_PASSWORD }}
166+
keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }}
167+
keyAlias=${{ secrets.ANDROID_KEY_ALIAS }}
168+
EOF
169+
170+
- name: Build APKs
171+
run: flutter build apk --split-per-abi --release
172+
173+
- name: Build AAB
174+
run: flutter build appbundle --release
175+
176+
- name: Collect artifacts
177+
run: |
178+
VERSION="${{ steps.ver.outputs.version }}"
179+
mkdir -p android-artifacts
180+
cp build/app/outputs/flutter-apk/app-arm64-v8a-release.apk \
181+
android-artifacts/stack_wallet-android-arm64-v8a-${VERSION}.apk
182+
cp build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk \
183+
android-artifacts/stack_wallet-android-armeabi-v7a-${VERSION}.apk
184+
cp build/app/outputs/flutter-apk/app-x86_64-release.apk \
185+
android-artifacts/stack_wallet-android-x86_64-${VERSION}.apk
186+
cp build/app/outputs/bundle/release/app-release.aab \
187+
android-artifacts/stack_wallet-android-${VERSION}.aab
188+
189+
- uses: actions/upload-artifact@v4
190+
with:
191+
name: stack_wallet-android-${{ steps.ver.outputs.version }}
192+
path: android-artifacts/
193+
194+
release:
195+
if: github.ref_type == 'tag'
196+
needs: [build-linux, build-android]
197+
runs-on: ubuntu-latest
198+
permissions:
199+
contents: write
200+
steps:
201+
- uses: actions/download-artifact@v4
202+
with:
203+
path: artifacts
204+
merge-multiple: true
205+
206+
- uses: softprops/action-gh-release@v2
207+
with:
208+
generate_release_notes: true
209+
files: artifacts/*

.github/workflows/test.yaml

Lines changed: 38 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,56 @@
1-
#should deny
21
name: Test
32
on: [pull_request]
43
jobs:
54
test:
65
runs-on: ubuntu-24.04
6+
container:
7+
image: stackwallet/stackwallet-ci:latest
8+
credentials:
9+
username: ${{ secrets.DOCKERHUB_USERNAME }}
10+
password: ${{ secrets.DOCKERHUB_TOKEN }}
711
steps:
812
- name: Prepare repository
9-
uses: actions/checkout@v4
13+
uses: actions/checkout@v6
1014
with:
1115
fetch-depth: 0
12-
- name: Install Flutter
13-
uses: subosito/flutter-action@v2
14-
with:
15-
flutter-version: '3.38.1'
16-
channel: 'stable'
17-
18-
# - name: Setup | Rust
19-
# uses: dtolnay/rust-toolchain@stable
20-
# with:
21-
# components: clippy
22-
- name: Checkout submodules
23-
run: git submodule update --init --recursive
24-
25-
- name: install dependencies
26-
run: |
27-
cargo install cargo-ndk
28-
rustup target add x86_64-unknown-linux-gnu
29-
sudo apt update
30-
sudo apt install -y meson ninja-build libglib2.0-dev libgcrypt20-dev libgirepository1.0-dev unzip automake build-essential file pkg-config git python3 libtool cmake openjdk-8-jre-headless libgit2-dev clang libncurses5-dev libncursesw5-dev zlib1g-dev llvm debhelper libclang-dev opencl-headers libssl-dev ocl-icd-opencl-dev libc6-dev-i386
31-
# - name: Build Epic Cash
32-
#run: |
33-
#cd crypto_plugins/flutter_libepiccash/scripts/linux/
34-
#./build_all.sh
16+
submodules: recursive
3517

3618
- name: Configure app
3719
run: |
3820
cd scripts
39-
yes yes | ./build_app.sh -v "0.0.1" -b "1" -p "linux" -a "stack_wallet" || true
21+
echo "yes" | ./build_app.sh -v "0.0.1" -b "1" -p "linux" -a "stack_wallet" -d -s
4022
4123
- name: Get dependencies
4224
run: flutter pub get
4325

44-
- name: Create temp files
45-
id: secret-file1
26+
- name: Create git_versions.dart stubs
4627
run: |
47-
$secretFileExchange = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "lib/external_api_keys.dart";
48-
$encodedBytes = [System.Convert]::FromBase64String($env:CHANGE_NOW);
49-
Set-Content $secretFileExchange -Value $encodedBytes -AsByteStream;
50-
$secretFileExchangeHash = Get-FileHash $secretFileExchange;
51-
Write-Output "Secret file $secretFileExchange has hash $($secretFileExchangeHash.Hash)";
52-
53-
$secretFileBitcoin = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/bitcoin/bitcoin_wallet_test_parameters.dart";
54-
$encodedBytes = [System.Convert]::FromBase64String($env:BITCOIN_TEST);
55-
Set-Content $secretFileBitcoin -Value $encodedBytes -AsByteStream;
56-
$secretFileBitcoinHash = Get-FileHash $secretFileBitcoin;
57-
Write-Output "Secret file $secretFileBitcoin has hash $($secretFileBitcoinHash.Hash)";
58-
59-
$secretFileDogecoin = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/dogecoin/dogecoin_wallet_test_parameters.dart";
60-
$encodedBytes = [System.Convert]::FromBase64String($env:DOGECOIN_TEST);
61-
Set-Content $secretFileDogecoin -Value $encodedBytes -AsByteStream;
62-
$secretFileDogecoinHash = Get-FileHash $secretFileDogecoin;
63-
Write-Output "Secret file $secretFileDogecoin has hash $($secretFileDogecoinHash.Hash)";
64-
65-
$secretFileFiro = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/firo/firo_wallet_test_parameters.dart";
66-
$encodedBytes = [System.Convert]::FromBase64String($env:FIRO_TEST);
67-
Set-Content $secretFileFiro -Value $encodedBytes -AsByteStream;
68-
$secretFileFiroHash = Get-FileHash $secretFileFiro;
69-
Write-Output "Secret file $secretFileFiro has hash $($secretFileFiroHash.Hash)";
70-
71-
$secretFileBitcoinCash = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/bitcoincash/bitcoincash_wallet_test_parameters.dart";
72-
$encodedBytes = [System.Convert]::FromBase64String($env:BITCOINCASH_TEST);
73-
Set-Content $secretFileBitcoinCash -Value $encodedBytes -AsByteStream;
74-
$secretFileBitcoinCashHash = Get-FileHash $secretFileBitcoinCash;
75-
Write-Output "Secret file $secretFileBitcoinCash has hash $($secretFileBitcoinCashHash.Hash)";
76-
77-
$secretFileNamecoin = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/namecoin/namecoin_wallet_test_parameters.dart";
78-
$encodedBytes = [System.Convert]::FromBase64String($env:NAMECOIN_TEST);
79-
Set-Content $secretFileNamecoin -Value $encodedBytes -AsByteStream;
80-
$secretFileNamecoinHash = Get-FileHash $secretFileNamecoin;
81-
Write-Output "Secret file $secretFileNamecoin has hash $($secretFileNamecoinHash.Hash)";
82-
83-
$secretFileParticl = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/particl/particl_wallet_test_parameters.dart";
84-
$encodedBytes = [System.Convert]::FromBase64String($env:PARTICL_TEST);
85-
Set-Content $secretFileParticl -Value $encodedBytes -AsByteStream;
86-
$secretFileParticlHash = Get-FileHash $secretFileParticl;
87-
Write-Output "Secret file $secretFileParticl has hash $($secretFileParticlHash.Hash)";
88-
89-
shell: pwsh
28+
mkdir -p crypto_plugins/flutter_libepiccash/lib
29+
mkdir -p crypto_plugins/flutter_libmwc/lib
30+
31+
cat > crypto_plugins/flutter_libepiccash/lib/git_versions.dart << 'EOF'
32+
String getPluginVersion() => "stub-for-tests";
33+
EOF
34+
35+
cat > crypto_plugins/flutter_libmwc/lib/git_versions.dart << 'EOF'
36+
String getPluginVersion() => "stub-for-tests";
37+
EOF
38+
39+
- name: Decode secrets
9040
env:
9141
CHANGE_NOW: ${{ secrets.CHANGE_NOW }}
92-
BITCOIN_TEST: ${{ secrets.BITCOIN_TEST }}
93-
DOGECOIN_TEST: ${{ secrets.DOGECOIN_TEST }}
94-
FIRO_TEST: ${{ secrets.FIRO_TEST }}
95-
BITCOINCASH_TEST: ${{ secrets.BITCOINCASH_TEST }}
96-
NAMECOIN_TEST: ${{ secrets.NAMECOIN_TEST }}
97-
PARTICL_TEST: ${{ secrets.PARTICL_TEST }}
42+
run: |
43+
echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart
44+
45+
- name: Ensure app config for tests
46+
run: bash scripts/ensure_test_app_config.sh
47+
48+
- name: Create test stubs
49+
run: bash prebuild.sh
50+
working-directory: scripts
51+
52+
- name: Regenerate mocks
53+
run: dart run build_runner build --delete-conflicting-outputs
9854

9955
- name: Check formatting of changed files
10056
run: |
@@ -114,29 +70,14 @@ jobs:
11470
# - name: Analyze
11571
# run: flutter analyze
11672
- name: Test
117-
run: flutter test --coverage
73+
run: |
74+
bash scripts/ensure_test_app_config.sh
75+
test -s lib/app_config.g.dart
76+
grep -Fq "part of 'app_config.dart';" lib/app_config.g.dart
77+
flutter test --coverage
11878
- name: Upload to code coverage
11979
uses: codecov/codecov-action@v1.2.2
12080
if: success() || failure()
12181
with:
12282
token: ${{secrets.CODECOV_TOKEN}}
12383
file: coverage/lcov.info
124-
- name: Delete temp files
125-
run: |
126-
$secretFileExchange = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "lib/external_api_keys.dart";
127-
$secretFileBitcoin = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/bitcoin/bitcoin_wallet_test_parameters.dart";
128-
$secretFileDogecoin = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/dogecoin/dogecoin_wallet_test_parameters.dart";
129-
$secretFileFiro = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/firo/firo_wallet_test_parameters.dart";
130-
$secretFileBitcoinCash = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/bitcoincash/bitcoincash_wallet_test_parameters.dart";
131-
$secretFileNamecoin = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/namecoin/namecoin_wallet_test_parameters.dart";
132-
$secretFileParticl = Join-Path -Path $env:GITHUB_WORKSPACE -ChildPath "test/services/coins/particl/particl_wallet_test_parameters.dart";
133-
134-
Remove-Item -Path $secretFileExchange;
135-
Remove-Item -Path $secretFileBitcoin;
136-
Remove-Item -Path $secretFileDogecoin;
137-
Remove-Item -Path $secretFileFiro;
138-
Remove-Item -Path $secretFileBitcoinCash;
139-
Remove-Item -Path $secretFileNamecoin;
140-
Remove-Item -Path $secretFileParticl;
141-
shell: pwsh
142-
if: always()

0 commit comments

Comments
 (0)