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