From 543e2f92014929cee61d72750d62270e98f011f2 Mon Sep 17 00:00:00 2001 From: Christopher Mosetick Date: Fri, 19 Dec 2025 03:21:34 +0100 Subject: [PATCH 1/4] Optimize Dockerfile for web+Android, add ARM64 multi-arch build in GH workflow --- .github/workflows/build-push.yml | 76 ++++++++++++++++++++++++++++++++ Dockerfile | 13 +----- 2 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/build-push.yml diff --git a/.github/workflows/build-push.yml b/.github/workflows/build-push.yml new file mode 100644 index 0000000..108cc64 --- /dev/null +++ b/.github/workflows/build-push.yml @@ -0,0 +1,76 @@ +name: Build and Push Flutter Image + +on: + push: + branches: + - main + paths: + - 'Dockerfile' + - '.github/workflows/build-push.yml' + workflow_dispatch: + inputs: + flutter_version: + description: 'Flutter version to build (leave empty to use Dockerfile default)' + required: false + type: string + +env: + REGISTRY: ghcr.io + IMAGE_NAME: opsdev-ws/flutter + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Extract Flutter version from Dockerfile + id: version + run: | + if [ -n "${{ inputs.flutter_version }}" ]; then + VERSION="${{ inputs.flutter_version }}" + else + VERSION=$(grep -m1 'ARG flutter_ver=' Dockerfile | cut -d'=' -f2) + fi + echo "flutter_version=${VERSION}" >> $GITHUB_OUTPUT + echo "Building Flutter version: ${VERSION}" + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value=${{ steps.version.outputs.flutter_version }} + type=raw,value=latest + + - name: Build and push multi-arch image + uses: docker/build-push-action@v5 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + build-args: | + flutter_ver=${{ steps.version.outputs.flutter_version }} diff --git a/Dockerfile b/Dockerfile index e484622..538fed8 100755 --- a/Dockerfile +++ b/Dockerfile @@ -17,25 +17,16 @@ RUN apt-get update \ ca-certificates \ && update-ca-certificates \ \ - # Install dependencies for Linux toolchain - && apt-get install -y --no-install-recommends --no-install-suggests \ - build-essential \ - clang cmake \ - lcov \ - libgtk-3-dev liblzma-dev \ - ninja-build \ - pkg-config \ - \ # Install Flutter itself && curl -fL -o /tmp/flutter.tar.xz \ https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${flutter_ver}-stable.tar.xz \ && tar -xf /tmp/flutter.tar.xz -C /usr/local/ \ && git config --global --add safe.directory /usr/local/flutter \ && flutter config --enable-android \ - --enable-linux-desktop \ --enable-web \ + --no-enable-linux-desktop \ --no-enable-ios \ - && flutter precache --universal --linux --web --no-ios \ + && flutter precache --universal --android --web --no-ios \ && (yes | flutter doctor --android-licenses) \ && flutter --version \ \ From ca6f353b1e1de1e214718c23d6699aa735cc0d9f Mon Sep 17 00:00:00 2001 From: Christopher Mosetick Date: Fri, 19 Dec 2025 03:58:16 +0100 Subject: [PATCH 2/4] experiment: Use git clone for multi-arch Flutter support (x64 + ARM64) --- Dockerfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 538fed8..d9aadee 100755 --- a/Dockerfile +++ b/Dockerfile @@ -15,12 +15,11 @@ RUN apt-get update \ && apt-get upgrade -y \ && apt-get install -y --no-install-recommends --no-install-suggests \ ca-certificates \ + git \ && update-ca-certificates \ \ - # Install Flutter itself - && curl -fL -o /tmp/flutter.tar.xz \ - https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_${flutter_ver}-stable.tar.xz \ - && tar -xf /tmp/flutter.tar.xz -C /usr/local/ \ + # Install Flutter via git clone (works on both x64 and arm64) + && git clone --depth 1 --branch ${flutter_ver} https://github.com/flutter/flutter.git /usr/local/flutter \ && git config --global --add safe.directory /usr/local/flutter \ && flutter config --enable-android \ --enable-web \ From a7aa421e4d0ff8ff15e48431d2181a176340fa1c Mon Sep 17 00:00:00 2001 From: Christopher Mosetick Date: Fri, 19 Dec 2025 04:19:29 +0100 Subject: [PATCH 3/4] Add ARM64 support via git clone, disable Linux desktop tests --- Dockerfile | 1 + tests/main.bats | 48 +++++++++++++++++++++++++----------------------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/Dockerfile b/Dockerfile index d9aadee..1e85b0d 100755 --- a/Dockerfile +++ b/Dockerfile @@ -21,6 +21,7 @@ RUN apt-get update \ # Install Flutter via git clone (works on both x64 and arm64) && git clone --depth 1 --branch ${flutter_ver} https://github.com/flutter/flutter.git /usr/local/flutter \ && git config --global --add safe.directory /usr/local/flutter \ + && git config --system --add safe.directory /usr/local/flutter \ && flutter config --enable-android \ --enable-web \ --no-enable-linux-desktop \ diff --git a/tests/main.bats b/tests/main.bats index 2a377f3..5d45913 100755 --- a/tests/main.bats +++ b/tests/main.bats @@ -1,17 +1,18 @@ #!/usr/bin/env bats -@test "clang is installed" { - run docker run --rm --pull never --entrypoint sh $IMAGE -c \ - 'which clang' - [ "$status" -eq 0 ] -} - -@test "clang runs ok" { - run docker run --rm --pull never --entrypoint sh $IMAGE -c \ - 'clang --help' - [ "$status" -eq 0 ] -} +# Disabled: clang not needed for web+Android builds +#@test "clang is installed" { +# run docker run --rm --pull never --entrypoint sh $IMAGE -c \ +# 'which clang' +# [ "$status" -eq 0 ] +#} +# +#@test "clang runs ok" { +# run docker run --rm --pull never --entrypoint sh $IMAGE -c \ +# 'clang --help' +# [ "$status" -eq 0 ] +#} @test "flutter is installed" { @@ -70,18 +71,19 @@ } -@test "Linux toolchain is enabled" { - run docker run --rm --pull never --entrypoint sh $IMAGE -c \ - 'flutter config --list | grep "enable-linux-desktop: true"' - [ "$status" -eq 0 ] -} - -@test "Linux toolchain is present" { - run docker run --rm --pull never --entrypoint sh $IMAGE -c \ - 'flutter doctor | grep "Linux toolchain"' - [ "$status" -eq 0 ] - [[ "$output" == *"[✓] Linux toolchain"* ]] -} +# Disabled: Linux desktop toolchain not needed for web+Android builds +#@test "Linux toolchain is enabled" { +# run docker run --rm --pull never --entrypoint sh $IMAGE -c \ +# 'flutter config --list | grep "enable-linux-desktop: true"' +# [ "$status" -eq 0 ] +#} +# +#@test "Linux toolchain is present" { +# run docker run --rm --pull never --entrypoint sh $IMAGE -c \ +# 'flutter doctor | grep "Linux toolchain"' +# [ "$status" -eq 0 ] +# [[ "$output" == *"[✓] Linux toolchain"* ]] +#} @test "Web toolchain is enabled" { From d74001a8944e7ec79467894e7b60761f752f436c Mon Sep 17 00:00:00 2001 From: Christopher Mosetick Date: Fri, 19 Dec 2025 04:29:34 +0100 Subject: [PATCH 4/4] fix: fix non-root permissions for flutter cache directory --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1e85b0d..7d34c7d 100755 --- a/Dockerfile +++ b/Dockerfile @@ -30,8 +30,9 @@ RUN apt-get update \ && (yes | flutter doctor --android-licenses) \ && flutter --version \ \ - # Make Flutter tools available for non-root usage + # Make Flutter cache writable for non-root users && chown -R 1000:1000 /usr/local/flutter/packages/flutter_tools/.dart_tool/ \ + && chmod -R a+w /usr/local/flutter/bin/cache \ \ && rm -rf /var/lib/apt/lists/* \ /tmp/*