Add script to build deterministic android aar
[ldk-java] / .github / workflows / build.yml
1 name: Continuous Integration Checks
2
3 on: [push, pull_request]
4
5 jobs:
6   check_bindings:
7     runs-on: ubuntu-latest
8     # Ubuntu's version of rustc uses its own LLVM instead of being a real native package.
9     # This leaves us with an incompatible LLVM version when linking. Instead, use a real OS.
10     container: debian:bullseye
11     env:
12       TOOLCHAIN: stable
13     steps:
14       - name: Install native Rust toolchain, Valgrind, and build utilitis
15         run: |
16           apt-get update
17           apt-get -y dist-upgrade
18           apt-get -y install cargo libstd-rust-dev-wasm32 valgrind lld git g++ clang openjdk-11-jdk maven faketime zip unzip llvm
19       - name: Checkout source code
20         uses: actions/checkout@v2
21         with:
22           fetch-depth: 0
23       - name: Install cbindgen
24         run: cargo install --force cbindgen
25       - name: Checkout Rust-Lightning and LDK-C-Bindings git
26         run: |
27           git config --global user.email "ldk-ci@example.com"
28           git config --global user.name "LDK CI"
29           # Note this is a different endpoint, as we need one non-upstream commit!
30           git clone https://git.bitcoin.ninja/rust-lightning
31           cd rust-lightning
32           git checkout origin/2021-03-java-bindings-base
33           cd ..
34           git clone https://github.com/lightningdevkit/ldk-c-bindings
35       - name: Rebuild C bindings without STD for WASM
36         run: |
37           cd ldk-c-bindings
38           ./genbindings.sh ../rust-lightning false
39           mv lightning-c-bindings/target/wasm32-wasi ./
40           cd ..
41       - name: Rebuild C bindings, and check the sample app builds + links
42         run: |
43           cd ldk-c-bindings
44           # Reset the Cargo.toml file so that git describe doesn't think we're "-dirty"
45           git checkout lightning-c-bindings/Cargo.toml
46           ./genbindings.sh ../rust-lightning true
47           mv wasm32-wasi lightning-c-bindings/target/
48           cd ..
49       - name: Build Java/TS Debug Bindings
50         run: ./genbindings.sh ./ldk-c-bindings/ "-I/usr/lib/jvm/java-11-openjdk-amd64/include/ -I/usr/lib/jvm/java-11-openjdk-amd64/include/linux/" true false
51       - name: Run Java Tests against Debug Bindings
52         run: |
53           mv liblightningjni_debug_Linux-amd64.so liblightningjni.so
54           export ASAN_OPTIONS=detect_leaks=0
55           LD_PRELOAD=/usr/lib/llvm-11/lib/clang/11.0.1/lib/linux/libclang_rt.asan-x86_64.so LD_LIBRARY_PATH=. mvn test
56       - name: Detect current git version
57         run: |
58           # We assume the top commit is just a bindings update commit, so we
59           # check out the previous commit to use as the commit we git describe.
60           # If the top commit is a merge commit, we need to get the last merge
61           # head and assume the latest bindings are built against its parent.
62           COMMIT_PARENTS=$(git show -s --pretty=format:%P HEAD)
63           if [ "${#COMMIT_PARENTS}" = 40 ]; then
64             export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD^1)"
65           else
66             MERGE_HEAD=$(git show --pretty=format:%P HEAD | ( for last in $(cat /dev/stdin); do true; done; echo $last ))
67             export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag $MERGE_HEAD^1)"
68           fi
69           echo "Using $LDK_GARBAGECOLLECTED_GIT_OVERRIDE as git version"
70           echo "$LDK_GARBAGECOLLECTED_GIT_OVERRIDE" > .git_ver
71       - name: Checkout latest MacOS binaries
72         run: |
73           export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(cat .git_ver)"
74           git clone --depth 1 https://git.bitcoin.ninja/ldk-java-bins
75           mkdir -p src/main/resources/
76           cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/liblightningjni_MacOSX-"* src/main/resources/
77       - name: Build Java/TS Release Bindings
78         run: |
79           export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(cat .git_ver)"
80           ./genbindings.sh ./ldk-c-bindings/ "-I/usr/lib/jvm/java-11-openjdk-amd64/include/ -I/usr/lib/jvm/java-11-openjdk-amd64/include/linux/" false false
81       - name: Build deterministic release jar
82         run: ./build-release-jar.sh
83       - name: Run Java Tests against built release jar
84         run: |
85           mvn install:install-file -Dfile=ldk-java.jar -DgroupId=org.ldk -DartifactId=ldk-java -Dversion=1.0-SNAPSHOT -Dpackaging=jar
86           cd javatester
87           mvn package
88           java -ea -jar target/ldk-java-tests-1.0-SNAPSHOT-jar-with-dependencies.jar
89           cd ..
90       - name: Check latest headers are in git
91         run: |
92           git diff --exit-code
93       - name: Check latest library and jars are in bins repo
94         run: |
95           export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(cat .git_ver)"
96           rm "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"*.jar
97           rm "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"liblightningjni_Linux*.nativelib
98           cp src/main/resources/liblightningjni_Linux-amd64.nativelib "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"
99           cp ldk-java-sources.jar "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"
100           cp ldk-java.jar "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"
101           cp ldk-java-classes.jar "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"
102           cd ldk-java-bins
103           git diff --exit-code
104
105   android:
106     runs-on: ubuntu-latest
107     # Frankly, I'm not really sure why debian and ubuntu differ in the results here, they really shouldn't
108     container: debian:bullseye
109     env:
110       TOOLCHAIN: stable
111     steps:
112       - name: Install rust targets
113         run: |
114           apt-get update
115           apt-get -y dist-upgrade
116           apt-get -y install git g++ clang faketime zip unzip curl openjdk-11-jdk
117           curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > rustup.sh
118           chmod +x ./rustup.sh
119           ./rustup.sh -y
120           . $HOME/.cargo/env
121           rustup target add armv7-linux-androideabi
122           rustup target add aarch64-linux-android
123           rustup target add i686-linux-android
124           rustup target add x86_64-linux-android
125       - name: Checkout source code
126         uses: actions/checkout@v2
127         with:
128           fetch-depth: 0
129       - name: Install android NDK compilers
130         run: |
131           curl https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip > android-ndk-r22b-linux-x86_64.zip
132           if [ "$(sha256sum android-ndk-r22b-linux-x86_64.zip | awk '{ print $1 }')" != "ac3a0421e76f71dd330d0cd55f9d99b9ac864c4c034fc67e0d671d022d4e806b" ]; then
133             echo "Bad hash"
134             exit 1
135           fi
136           unzip android-ndk-r22b-linux-x86_64.zip
137       - name: Install cbindgen
138         run: |
139           . $HOME/.cargo/env
140           cargo install --force cbindgen
141       - name: Checkout Rust-Lightning and LDK-C-Bindings git
142         run: |
143           git config --global user.email "ldk-ci@example.com"
144           git config --global user.name "LDK CI"
145           # Note this is a different endpoint, as we need one non-upstream commit!
146           git clone https://git.bitcoin.ninja/rust-lightning
147           cd rust-lightning
148           git checkout origin/2021-03-java-bindings-base
149           cd ..
150           git clone https://github.com/lightningdevkit/ldk-c-bindings
151       - name: Detect current git version
152         run: |
153           # We assume the top commit is just a bindings update commit, so we
154           # check out the previous commit to use as the commit we git describe.
155           # If the top commit is a merge commit, we need to get the last merge
156           # head and assume the latest bindings are built against its parent.
157           COMMIT_PARENTS=$(git show -s --pretty=format:%P HEAD)
158           if [ "${#COMMIT_PARENTS}" = 40 ]; then
159             export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD^1)"
160           else
161             MERGE_HEAD=$(git show --pretty=format:%P HEAD | ( for last in $(cat /dev/stdin); do true; done; echo $last ))
162             export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag $MERGE_HEAD^1)"
163           fi
164           echo "Using $LDK_GARBAGECOLLECTED_GIT_OVERRIDE as git version"
165           echo "$LDK_GARBAGECOLLECTED_GIT_OVERRIDE" > .git_ver
166       - name: Checkout Android AAR binaries and artifacts
167         run: git clone --depth 1 https://git.bitcoin.ninja/ldk-java-bins
168       - name: Build Android aar
169         run: |
170           . $HOME/.cargo/env
171           export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(cat .git_ver)"
172           cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/ldk-java-classes.jar" ./
173           export ANDROID_TOOLCHAIN="$(pwd)/android-ndk-r22b/toolchains/llvm/prebuilt/linux-x86_64"
174           export PATH="$PATH:$ANDROID_TOOLCHAIN/bin"
175           ./android-build.sh ./rust-lightning ./ldk-c-bindings/ ./ldk-java-bins/android-artifacts
176       - name: Check latest library and jars are in bins repo
177         run: |
178           export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(cat .git_ver)"
179           rm "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/LDK-release.aar"
180           cp LDK-release.aar "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"
181           cd ldk-java-bins
182           git diff --exit-code
183
184   osx:
185     strategy:
186       matrix:
187         include:
188           - platform: macos-10.15
189           - platform: macos-11
190     runs-on: ${{ matrix.platform }}
191     env:
192       TOOLCHAIN: stable
193     steps:
194       - name: Install other Rust platforms
195         run: rustup target install aarch64-apple-darwin
196       - name: Fetch upstream LLVM/clang snapshot
197         run: |
198           wget -O clang+llvm-12.0.0-x86_64-apple-darwin.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.0/clang+llvm-12.0.0-x86_64-apple-darwin.tar.xz
199           if [ "$(shasum -a 256 clang+llvm-12.0.0-x86_64-apple-darwin.tar.xz | awk '{ print $1 }')" != "7bc2259bf75c003f644882460fc8e844ddb23b27236fe43a2787870a4cd8ab50" ]; then
200             echo "Bad hash"
201             exit 1
202           fi
203       - name: Unpack upstream LLVM+clang and use it by default
204         run: |
205           tar xvvf clang+llvm-12.0.0-x86_64-apple-darwin.tar.xz
206       - name: Checkout source code
207         uses: actions/checkout@v2
208         with:
209           fetch-depth: 0
210       - name: Install cbindgen
211         run: cargo install --force cbindgen
212       - name: Checkout Rust-Lightning and LDK-C-Bindings git
213         run: |
214           git config --global user.email "ldk-ci@example.com"
215           git config --global user.name "LDK CI"
216           git clone https://github.com/rust-bitcoin/rust-lightning
217           cd rust-lightning
218           git remote add matt https://git.bitcoin.ninja/rust-lightning
219           git fetch matt
220           git merge matt/2021-03-java-bindings-base
221           cd ..
222           git clone https://github.com/lightningdevkit/ldk-c-bindings
223       - name: Rebuild C bindings with upstream clang, and check the sample app builds + links
224         run: |
225           cd ldk-c-bindings
226           export PATH=`pwd`/clang+llvm-12.0.0-x86_64-apple-darwin/bin:$PATH
227           CC=clang ./genbindings.sh ../rust-lightning true
228           cd ..
229       - name: Fetch OpenJDK 16
230         run: |
231           wget -O openjdk-16.0.1_osx-x64_bin.tar.gz https://download.java.net/java/GA/jdk16.0.1/7147401fd7354114ac51ef3e1328291f/9/GPL/openjdk-16.0.1_osx-x64_bin.tar.gz
232           if [ "$(shasum -a 256 openjdk-16.0.1_osx-x64_bin.tar.gz | awk '{ print $1 }')" != "6098f839954439d4916444757c542c1b8778a32461706812d41cc8bbefce7f2f" ]; then
233             echo "Bad hash"
234             exit 1
235           fi
236           tar xvvf openjdk-16.0.1_osx-x64_bin.tar.gz
237           export JAVA_HOME=`pwd`/jdk-16.0.1.jdk/Contents/Home
238           export PATH=$JAVA_HOME/bin:$PATH
239       - name: Detect current git version
240         run: |
241           # We assume the top commit is just a bindings update commit, so we
242           # check out the previous commit to use as the commit we git describe.
243           # If the top commit is a merge commit, we need to get the last merge
244           # head and assume the latest bindings are built against its parent.
245           COMMIT_PARENTS=$(git show -s --pretty=format:%P HEAD)
246           if [ "${#COMMIT_PARENTS}" = 40 ]; then
247             export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag HEAD^1)"
248           else
249             MERGE_HEAD=$(git show --pretty=format:%P HEAD | ( for last in $(cat /dev/stdin); do true; done; echo $last ))
250             export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(git describe --tag $MERGE_HEAD^1)"
251           fi
252           echo "Using $LDK_GARBAGECOLLECTED_GIT_OVERRIDE as git version"
253           echo "$LDK_GARBAGECOLLECTED_GIT_OVERRIDE" > .git_ver
254       - name: Checkout latest Linux binaries
255         run: |
256           export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(cat .git_ver)"
257           git clone --depth 1 https://git.bitcoin.ninja/ldk-java-bins
258           mkdir -p src/main/resources/
259           cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/liblightningjni_Linux-"* src/main/resources/
260       - name: Build Java/TS Release Bindings
261         run: |
262           export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(cat .git_ver)"
263           # genbindings.sh always fails as there is no wasm32-wasi library
264           # available, so instead we check that the expected JNI library
265           # is created.
266           export PATH=`pwd`/clang+llvm-12.0.0-x86_64-apple-darwin/bin:$PATH
267           ./genbindings.sh ./ldk-c-bindings/ "-I$JAVA_HOME/include/ -I$JAVA_HOME/include/darwin -isysroot$(xcrun --show-sdk-path)" false false || echo
268           cat src/main/resources/liblightningjni_MacOSX-x86_64.nativelib > /dev/null
269           if [ "${{ matrix.platform }}" = "macos-11" ]; then
270             export CC="clang --target=aarch64-apple-darwin"
271             export LDK_TARGET=aarch64-apple-darwin
272             export LDK_TARGET_CPU=apple-a14
273             ./genbindings.sh ./ldk-c-bindings/ "-I$JAVA_HOME/include/ -I$JAVA_HOME/include/darwin -isysroot$(xcrun --show-sdk-path)" false false || echo
274             cat src/main/resources/liblightningjni_MacOSX-aarch64.nativelib > /dev/null
275           fi
276       - name: Fetch Maven 3.8.1
277         run: |
278           wget -O apache-maven-3.8.1-bin.tar.gz https://apache.osuosl.org/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz
279           if [ "$(shasum -a 256 apache-maven-3.8.1-bin.tar.gz | awk '{ print $1 }')" != "b98a1905eb554d07427b2e5509ff09bd53e2f1dd7a0afa38384968b113abef02" ]; then
280             echo "Bad hash"
281             exit 1
282           fi
283           tar xvvf apache-maven-3.8.1-bin.tar.gz
284           export PATH=apache-maven-3.8.1/bin:$PATH
285       - name: Run Java Tests against built jar
286         run: |
287           mvn -DskipTests=true package
288           mvn install:install-file -Dfile=target/ldk-java-1.0-SNAPSHOT.jar -DgroupId=org.ldk -DartifactId=ldk-java -Dversion=1.0-SNAPSHOT -Dpackaging=jar
289           cd javatester
290           mvn package
291           java -ea -jar target/ldk-java-tests-1.0-SNAPSHOT-jar-with-dependencies.jar
292           cd ..
293       - name: Check latest release libs are in git
294         run: |
295           if [ "${{ matrix.platform }}" = "macos-11" ]; then
296             export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(cat .git_ver)"
297             rm "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"liblightningjni_MacOSX-{x86_64,aarch64}.nativelib
298             cp src/main/resources/liblightningjni_MacOSX-*.nativelib "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"
299             cd ldk-java-bins
300             # Sadly, OSX binaries are not currently deterministic, more debugging is needed.
301             #git diff --exit-code
302           fi
303       - name: Run Java Tests against release bins
304         run: |
305           if [ "${{ matrix.platform }}" != "macos-11" ]; then
306             export LDK_GARBAGECOLLECTED_GIT_OVERRIDE="$(cat .git_ver)"
307             cp "ldk-java-bins/${LDK_GARBAGECOLLECTED_GIT_OVERRIDE}/"liblightningjni_MacOSX-{x86_64,aarch64}.nativelib src/main/resources/
308             mvn clean
309             mvn -DskipTests=true package
310             mvn install:install-file -Dfile=target/ldk-java-1.0-SNAPSHOT.jar -DgroupId=org.ldk -DartifactId=ldk-java -Dversion=1.0-SNAPSHOT -Dpackaging=jar
311             cd javatester
312             mvn package
313             java -ea -jar target/ldk-java-tests-1.0-SNAPSHOT-jar-with-dependencies.jar
314             cd ..
315           fi