Skip to content

Commit 808c3b4

Browse files
committed
Expanded Docker image rebuild triggers for native sources.
1 parent 5c08fc4 commit 808c3b4

3 files changed

Lines changed: 88 additions & 35 deletions

File tree

.github/workflows/docker-builder.yml

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,19 @@ on:
55
paths:
66
- 'docker/Dockerfile'
77
- '.github/workflows/docker-builder.yml'
8+
- 'TMessagesProj/jni/boringssl'
9+
- 'TMessagesProj/jni/ffmpeg'
10+
- 'TMessagesProj/jni/libvpx'
11+
- 'TMessagesProj/jni/dav1d'
12+
- 'TMessagesProj/jni/tde2e_source'
13+
- 'TMessagesProj/jni/patches/**'
14+
- 'TMessagesProj/jni/build_*.sh'
15+
- 'TMessagesProj/jni/prepare.py'
16+
- 'TMessagesProj/jni/CMakeLists.txt'
17+
- 'TMessagesProj/jni/voip/**'
818
branches:
919
- dev
1020
schedule:
11-
# First Sunday of each month at 03:00 UTC
1221
- cron: '0 3 1-7 * 0'
1322
workflow_dispatch:
1423

@@ -23,8 +32,23 @@ jobs:
2332
packages: write
2433

2534
steps:
35+
- name: Free up disk space
36+
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be
37+
with:
38+
tool-cache: true
39+
android: true
40+
2641
- name: Checkout
2742
uses: actions/checkout@v4
43+
with:
44+
submodules: true
45+
46+
- name: Clone untracked submodules (boringssl, ffmpeg)
47+
run: |
48+
git clone https://github.com/google/boringssl TMessagesProj/jni/boringssl
49+
cd TMessagesProj/jni/boringssl && git checkout a6d321b11fa80496b7c8ae6405468c212d4f5c87 && cd -
50+
git clone https://github.com/FFmpeg/FFmpeg TMessagesProj/jni/ffmpeg
51+
cd TMessagesProj/jni/ffmpeg && git checkout 71fb6132637a2a430375c24afc381fff8b854fe7 && cd -
2852
2953
- name: Lowercase image name
3054
id: lower
@@ -40,7 +64,7 @@ jobs:
4064
- name: Build and push
4165
uses: docker/build-push-action@v6
4266
with:
43-
context: docker
67+
context: .
4468
file: docker/Dockerfile
4569
push: true
4670
tags: |

.github/workflows/tandroid.yml

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010
name: Build
1111
runs-on: ubuntu-latest
1212
container:
13-
image: ghcr.io/${{ github.repository }}/forkgram-builder:latest
13+
image: ghcr.io/forkgram/telegramandroid/forkgram-builder:latest
1414
credentials:
1515
username: ${{ github.actor }}
1616
password: ${{ secrets.GITHUB_TOKEN }}
@@ -57,15 +57,22 @@ jobs:
5757
echo "LASTFM_API_KEY=${{ secrets.LASTFM_API_KEY }}" >> $vars
5858
echo "LASTFM_API_SECRET=${{ secrets.LASTFM_API_SECRET }}" >> $vars
5959
60-
if [ -d /prebuilt/arm64-v8a ]; then
61-
NATIVE_FLAG="-PprebuiltNativeDir=/prebuilt"
62-
echo "Using prebuilt native libraries from Docker image"
63-
else
64-
NATIVE_FLAG=""
65-
echo "Building native libraries from source"
60+
if [ -d /prebuilt/boringssl ]; then
61+
echo "Copying cached Phase 1 native artifacts from Docker image"
62+
for lib in boringssl ffmpeg libvpx dav1d; do
63+
if [ -d "/prebuilt/$lib/build" ]; then
64+
cp -r /prebuilt/$lib/build TMessagesProj/jni/$lib/
65+
fi
66+
done
67+
for arch in arm64-v8a armeabi-v7a; do
68+
if [ -d "/prebuilt/tde2e/$arch" ]; then
69+
mkdir -p TMessagesProj/jni/tde2e/$arch
70+
cp /prebuilt/tde2e/$arch/*.a TMessagesProj/jni/tde2e/$arch/
71+
fi
72+
done
6673
fi
6774
68-
./gradlew :TMessagesProj_App:${{ matrix.afat }} $NATIVE_FLAG
75+
./gradlew :TMessagesProj_App:${{ matrix.afat }}
6976
7077
grep VERSION_NAME TMessagesProj/build/generated/source/buildConfig/${{ matrix.type }}/org/telegram/messenger/BuildConfig.java | cut -d'"' -f 2 > ver.txt
7178

docker/Dockerfile

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ RUN yes | sdkmanager --licenses > /dev/null 2>&1 && \
6161
"ndk;23.2.8568313" \
6262
"cmake;3.10.2.4988404"
6363

64+
# Make SDK cmake available as system cmake
6465
RUN ln -sf /opt/android-sdk/cmake/3.10.2.4988404/bin/cmake /usr/local/bin/cmake && \
6566
ln -sf /opt/android-sdk/cmake/3.10.2.4988404/bin/cmake /usr/local/bin/cmake3
6667

@@ -72,35 +73,56 @@ FROM base AS native-builder
7273
COPY TMessagesProj/jni/ /build/jni/
7374
WORKDIR /build/jni
7475

75-
# Phase 1: prepare.py (boringssl, ffmpeg, libvpx, dav1d, tde2e)
76-
# Stub out git — prepare.py runs "git submodule update" and "git reset --hard"
77-
# but the sources are already in place via COPY.
78-
RUN mv /usr/bin/git /usr/bin/git.real && \
79-
printf '#!/bin/sh\ntrue\n' > /usr/bin/git && chmod +x /usr/bin/git && \
80-
python3 prepare.py arm64 arm ndk=$ANDROID_NDK_HOME silent && \
81-
mv /usr/bin/git.real /usr/bin/git
82-
83-
# Phase 2: CMake build of libtmessages.49.so per ABI
84-
RUN for abi in arm64-v8a armeabi-v7a; do \
85-
mkdir -p /build/cmake-build/$abi && \
86-
cd /build/cmake-build/$abi && \
87-
cmake \
88-
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \
89-
-DCMAKE_BUILD_TYPE=Release \
90-
-DANDROID_ABI=$abi \
91-
-DANDROID_STL=c++_static \
92-
-DANDROID_PLATFORM=android-21 \
93-
/build/jni/ && \
94-
make -j$(nproc); \
76+
# Phase 1: Build static libraries directly (bypasses prepare.py which
77+
# assumes git submodules and rm/re-checkout cycle unsuitable for Docker).
78+
ENV NDK=$ANDROID_NDK_HOME
79+
ENV NINJA_PATH=/usr/bin/ninja
80+
81+
RUN ./build_dav1d_clang.sh arm64 arm
82+
83+
RUN ./build_libvpx_clang.sh arm64 arm
84+
85+
RUN ./build_ffmpeg_clang.sh arm64 arm && ./patch_ffmpeg.sh
86+
87+
RUN ./patch_boringssl.sh && ./build_boringssl.sh arm64 arm
88+
89+
RUN tde2e_dir=$(pwd)/tde2e && \
90+
source_dir=$(pwd)/tde2e_source && \
91+
boringssl_dir=$(pwd)/boringssl && \
92+
for arch in arm64-v8a armeabi-v7a; do \
93+
mkdir -p $source_dir/example/android/third-party/openssl/$arch/lib/ && \
94+
cp "$boringssl_dir/build/$arch/crypto/libcrypto.a" "$source_dir/example/android/third-party/openssl/$arch/lib/" && \
95+
cp "$boringssl_dir/build/$arch/ssl/libssl.a" "$source_dir/example/android/third-party/openssl/$arch/lib/" && \
96+
cp -R "$boringssl_dir/include" "$source_dir/example/android/third-party/openssl/$arch/"; \
97+
done && \
98+
cp "$tde2e_dir/build-tdlib.sh" "$source_dir/example/android/." && \
99+
cp "$tde2e_dir/CMakeLists.txt" "$source_dir/example/android/." && \
100+
sed -i "s/ php//g" "$source_dir/example/android/check-environment.sh" && \
101+
sed -i "s/PHP_EXECUTABLE/FALSE/g" "$source_dir/td/generate/CMakeLists.txt" && \
102+
cd "$source_dir/example/android" && \
103+
SED_CMDS="s/x86_64//g;s/x86//g;s/rm tdlib/# rm tdlib/g;s/jar/# jar/g;s/mv tdlib/# mv tdlib/g;" && \
104+
sed "$SED_CMDS" ./build-tdlib.sh | bash -s -- "$NDK/../.." && \
105+
for arch in arm64-v8a armeabi-v7a; do \
106+
mkdir -p $tde2e_dir/$arch && \
107+
cp "$source_dir/example/android/build-$arch-Java/td/tde2e/libtde2e.a" $tde2e_dir/$arch && \
108+
cp "$source_dir/example/android/build-$arch-Java/td/tdutils/libtdutils.a" $tde2e_dir/$arch; \
95109
done
96110

97-
# Collect .so files
98-
RUN mkdir -p /prebuilt/arm64-v8a /prebuilt/armeabi-v7a && \
99-
cp /build/cmake-build/arm64-v8a/lib*.so /prebuilt/arm64-v8a/ && \
100-
cp /build/cmake-build/armeabi-v7a/lib*.so /prebuilt/armeabi-v7a/
111+
# Collect Phase 1 artifacts (.a files) for CI reuse
112+
RUN mkdir -p /prebuilt && \
113+
for lib in boringssl ffmpeg libvpx dav1d tde2e; do \
114+
if [ -d "/build/jni/$lib/build" ]; then \
115+
mkdir -p /prebuilt/$lib && cp -r /build/jni/$lib/build /prebuilt/$lib/; \
116+
fi; \
117+
done && \
118+
for arch in arm64-v8a armeabi-v7a; do \
119+
if [ -d "/build/jni/tde2e/$arch" ]; then \
120+
mkdir -p /prebuilt/tde2e/$arch && cp /build/jni/tde2e/$arch/*.a /prebuilt/tde2e/$arch/; \
121+
fi; \
122+
done
101123

102124
# ============================================================
103-
# Stage 3: Final image (tools + prebuilt .so)
125+
# Stage 3: Final image (tools + prebuilt Phase 1 .a files)
104126
# ============================================================
105127
FROM base AS final
106128

0 commit comments

Comments
 (0)