From 1efc69f1f30f469f0053359a186d7e52c7273ce0 Mon Sep 17 00:00:00 2001 From: Maksim Merzhanov Date: Fri, 24 Apr 2026 14:50:34 +0300 Subject: [PATCH] ci: add reproducible builds for Android --- .github/workflows/build-manual.yml | 27 ++++++++++++++------------- build.sh | 15 ++++++++------- cmd/awl-tray/go.mod | 2 +- cmd/awl-tray/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- 6 files changed, 28 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build-manual.yml b/.github/workflows/build-manual.yml index c39673a5..6144fbf7 100644 --- a/.github/workflows/build-manual.yml +++ b/.github/workflows/build-manual.yml @@ -1,6 +1,9 @@ name: Manual build release on: + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+*' workflow_dispatch: inputs: awl_ref: @@ -30,13 +33,13 @@ jobs: uses: actions/checkout@v6 with: fetch-depth: 0 # also fetch tags for 'git describe' - ref: ${{ github.event.inputs.awl_ref }} + ref: ${{ github.event.inputs.awl_ref || github.ref }} path: 'awl' - name: Checkout awl-flutter code uses: actions/checkout@v6 with: repository: 'anywherelan/awl-flutter' - ref: ${{ github.event.inputs.awl_flutter_ref }} + ref: ${{ github.event.inputs.awl_flutter_ref || github.ref }} path: 'awl-flutter' - name: Install Go @@ -58,14 +61,7 @@ jobs: - run: flutter --version - name: Install ndk run: | - echo "ls $ANDROID_HOME/" - ls -lah $ANDROID_HOME/ || true - echo "ls $ANDROID_HOME/tools/bin/" - ls -lah $ANDROID_HOME/tools/bin/ || true - echo "ls $ANDROID_HOME/cmdline-tools/latest/bin/" - ls -lah $ANDROID_HOME/cmdline-tools/latest/bin/ || true - echo "install ndk" - $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "ndk;27.0.12077973" + $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "ndk;27.3.13750724" - name: List available space run: | df -h @@ -86,8 +82,9 @@ jobs: - name: Build run: | - export ANDROID_NDK_ROOT=$ANDROID_HOME/ndk-bundle - unset ANDROID_NDK_HOME + export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/27.3.13750724 + unset ANDROID_NDK_ROOT + export SOURCE_DATE_EPOCH=$(git -C awl-flutter log -1 --format=%ct) cd awl GOMOBILE_VERSION=$(go list -m -f '{{.Version}}' golang.org/x/mobile) go install golang.org/x/mobile/cmd/gomobile@$GOMOBILE_VERSION @@ -96,10 +93,14 @@ jobs: cd cmd/awl-tray && go mod tidy -compat=1.26 && cd ../.. echo "check go mod tidy and git dirty" test -z "$(git status --porcelain)" || (git status; git diff && false) - echo "start building" + cd ../awl-flutter && flutter pub get && cd ../awl + echo "=== Patching flutter_zxing for reproducible builds ===" + sed -i '1a add_link_options("LINKER:--build-id=none")' $HOME/.pub-cache/hosted/pub.dev/flutter_zxing-*/src/CMakeLists.txt + echo "start building" ./build.sh release echo "ls build" ls -lah build + - name: List available space run: | df -h diff --git a/build.sh b/build.sh index 7d1f0b33..5cd7c07f 100755 --- a/build.sh +++ b/build.sh @@ -2,6 +2,7 @@ awldir=$(pwd) builddir="$awldir/build" +mkdir -p "$builddir" awlflutterdir="$awldir/../awl-flutter" tempdir=$(dirname $(mktemp -u)) @@ -57,7 +58,7 @@ gobuild-linux() { for arch in 386 amd64 arm arm64 mips mipsle; do archive_name="$name-linux-$arch-$VERSION.tar.gz" filename="$name" - CGO_ENABLED=0 GOOS=linux GOARCH=$arch go build -trimpath -ldflags "-s -w -X github.com/anywherelan/awl/config.Version=${VERSION}" -o "$filename" + CGO_ENABLED=0 GOOS=linux GOARCH=$arch go build -trimpath -ldflags "-buildid= -s -w -X github.com/anywherelan/awl/config.Version=${VERSION}" -o "$filename" tar -czf "$archive_name" "$filename" rm "$filename" mv "$archive_name" "$builddir" @@ -70,7 +71,7 @@ gobuild-macos() { for arch in amd64 arm64; do archive_name="$name-macos-$arch-$VERSION.zip" filename="$name" - CGO_ENABLED=1 GOOS=darwin GOARCH=$arch go build -trimpath -ldflags "-s -w -X github.com/anywherelan/awl/config.Version=${VERSION}" -o "$filename" + CGO_ENABLED=1 GOOS=darwin GOARCH=$arch go build -trimpath -ldflags "-buildid= -s -w -X github.com/anywherelan/awl/config.Version=${VERSION}" -o "$filename" zip "$archive_name" "$filename" rm "$filename" mv "$archive_name" "$builddir" @@ -84,7 +85,7 @@ gobuild-windows() { install-wintun "$arch" archive_name="$name-windows-$arch-$VERSION.zip" filename="$name.exe" - CGO_ENABLED=0 GOOS=windows GOARCH=$arch go build -trimpath -ldflags "-s -w -H windowsgui -X github.com/anywherelan/awl/config.Version=${VERSION}" -o "$filename" + CGO_ENABLED=0 GOOS=windows GOARCH=$arch go build -trimpath -ldflags "-buildid= -s -w -H windowsgui -X github.com/anywherelan/awl/config.Version=${VERSION}" -o "$filename" zip "$archive_name" "$filename" rm "$filename" mv "$archive_name" "$builddir" @@ -98,7 +99,7 @@ gobuild-windows7() { install-wintun "$arch" archive_name="$name-windows7-$arch-$VERSION.zip" filename="$name.exe" - CGO_ENABLED=0 GOOS=windows GOARCH=$arch go build -trimpath -ldflags "-s -w -H windowsgui -X github.com/anywherelan/awl/config.Version=${VERSION} -X github.com/anywherelan/awl/config.IsWindows7=true" -o "$filename" + CGO_ENABLED=0 GOOS=windows GOARCH=$arch go build -trimpath -ldflags "-buildid= -s -w -H windowsgui -X github.com/anywherelan/awl/config.Version=${VERSION} -X github.com/anywherelan/awl/config.IsWindows7=true" -o "$filename" zip "$archive_name" "$filename" rm "$filename" mv "$archive_name" "$builddir" @@ -137,7 +138,7 @@ build-android-lib() { cd "$awldir/cmd/gomobile-lib" # about `-checklinkname=0` https://github.com/wlynxg/anet#how-to-build-with-go-1230-or-later gomobile bind -androidapi 24 -trimpath \ - -ldflags "-linkmode=external -extldflags=-Wl,-z,max-page-size=16384 -s -w -checklinkname=0 -X github.com/anywherelan/awl/config.Version=${VERSION}" \ + -ldflags "-buildid= -linkmode=external -extldflags=-Wl,-z,max-page-size=16384 -s -w -checklinkname=0 -X github.com/anywherelan/awl/config.Version=${VERSION}" \ -o anywherelan.aar -target=android . || { echo "gomobile bind failed"; exit 1; } mkdir -p "$awlflutterdir/android/app/src/main/libs" mv anywherelan.aar "$awlflutterdir/android/app/src/main/libs/" @@ -147,7 +148,7 @@ build-android-lib() { build-android-apk() { cd "$awlflutterdir" flutter build apk --release - mv "$awlflutterdir/build/app/outputs/flutter-apk/app-release.apk" "$builddir/awl-android-$VERSION.apk" + cp "$awlflutterdir/build/app/outputs/flutter-apk/app-release.apk" "$builddir/awl-android-$VERSION.apk" } # build for android @@ -184,7 +185,7 @@ build-awl-tray() { archive_name="$archive_name.tar.gz" fi cd "$awldir/cmd/awl-tray" - CGO_ENABLED=0 go build -trimpath -ldflags "-s -w -X github.com/anywherelan/awl/config.Version=${VERSION}" -o "$filename" + CGO_ENABLED=0 go build -trimpath -ldflags "-buildid= -s -w -X github.com/anywherelan/awl/config.Version=${VERSION}" -o "$filename" if [ "$goos" == "windows" ]; then zip "$archive_name" "$filename" elif [ "$goos" == "linux" ]; then diff --git a/cmd/awl-tray/go.mod b/cmd/awl-tray/go.mod index f4112ec0..377ee4b7 100644 --- a/cmd/awl-tray/go.mod +++ b/cmd/awl-tray/go.mod @@ -76,7 +76,7 @@ require ( github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.3.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect - github.com/libp2p/go-libp2p-kad-dht v0.39.0 // indirect + github.com/libp2p/go-libp2p-kad-dht v0.39.1 // indirect github.com/libp2p/go-libp2p-kbucket v0.8.0 // indirect github.com/libp2p/go-libp2p-record v0.3.1 // indirect github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect diff --git a/cmd/awl-tray/go.sum b/cmd/awl-tray/go.sum index 6d507e22..27f16687 100644 --- a/cmd/awl-tray/go.sum +++ b/cmd/awl-tray/go.sum @@ -326,8 +326,8 @@ github.com/libp2p/go-libp2p v0.48.0 h1:h2BrLAgrj7X8bEN05K7qmrjpNHYA+6tnsGRdprjTn github.com/libp2p/go-libp2p v0.48.0/go.mod h1:Q1fBZNdmC2Hf82husCTfkKJVfHm2we5zk+NWmOGEmWk= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= -github.com/libp2p/go-libp2p-kad-dht v0.39.0 h1:mww38eBYiUvdsu+Xl/GLlBC0Aa8M+5HAwvafkFOygAM= -github.com/libp2p/go-libp2p-kad-dht v0.39.0/go.mod h1:Po2JugFEkDq9Vig/JXtc153ntOi0q58o4j7IuITCOVs= +github.com/libp2p/go-libp2p-kad-dht v0.39.1 h1:9RzUBc7zywT4ZNamRSgEvPZmVlK3Y6xdlCYfXXvlR/Q= +github.com/libp2p/go-libp2p-kad-dht v0.39.1/go.mod h1:Po2JugFEkDq9Vig/JXtc153ntOi0q58o4j7IuITCOVs= github.com/libp2p/go-libp2p-kbucket v0.8.0 h1:QAK7RzKJpYe+EuSEATAaaHYMYLkPDGC18m9jxPLnU8s= github.com/libp2p/go-libp2p-kbucket v0.8.0/go.mod h1:JMlxqcEyKwO6ox716eyC0hmiduSWZZl6JY93mGaaqc4= github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg= diff --git a/go.mod b/go.mod index 2d271ae5..5173c4e9 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/labstack/echo-contrib v0.50.1 github.com/labstack/echo/v4 v4.15.1 github.com/libp2p/go-libp2p v0.48.0 - github.com/libp2p/go-libp2p-kad-dht v0.39.0 + github.com/libp2p/go-libp2p-kad-dht v0.39.1 github.com/libp2p/go-libp2p-kbucket v0.8.0 github.com/marcopolo/simnet v0.0.6 github.com/mdp/qrterminal/v3 v3.2.1 diff --git a/go.sum b/go.sum index 85836c56..6b24d9eb 100644 --- a/go.sum +++ b/go.sum @@ -305,8 +305,8 @@ github.com/libp2p/go-libp2p v0.48.0 h1:h2BrLAgrj7X8bEN05K7qmrjpNHYA+6tnsGRdprjTn github.com/libp2p/go-libp2p v0.48.0/go.mod h1:Q1fBZNdmC2Hf82husCTfkKJVfHm2we5zk+NWmOGEmWk= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= -github.com/libp2p/go-libp2p-kad-dht v0.39.0 h1:mww38eBYiUvdsu+Xl/GLlBC0Aa8M+5HAwvafkFOygAM= -github.com/libp2p/go-libp2p-kad-dht v0.39.0/go.mod h1:Po2JugFEkDq9Vig/JXtc153ntOi0q58o4j7IuITCOVs= +github.com/libp2p/go-libp2p-kad-dht v0.39.1 h1:9RzUBc7zywT4ZNamRSgEvPZmVlK3Y6xdlCYfXXvlR/Q= +github.com/libp2p/go-libp2p-kad-dht v0.39.1/go.mod h1:Po2JugFEkDq9Vig/JXtc153ntOi0q58o4j7IuITCOVs= github.com/libp2p/go-libp2p-kbucket v0.8.0 h1:QAK7RzKJpYe+EuSEATAaaHYMYLkPDGC18m9jxPLnU8s= github.com/libp2p/go-libp2p-kbucket v0.8.0/go.mod h1:JMlxqcEyKwO6ox716eyC0hmiduSWZZl6JY93mGaaqc4= github.com/libp2p/go-libp2p-record v0.3.1 h1:cly48Xi5GjNw5Wq+7gmjfBiG9HCzQVkiZOUZ8kUl+Fg=