| # Copyright 2022 The Flutter Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| steps: |
| # ========================================== |
| # STEP 1: Determine tags based on version |
| # ========================================== |
| - name: 'gcr.io/cloud-builders/docker' |
| entrypoint: 'bash' |
| args: |
| - '-c' |
| - | |
| set -euo pipefail |
| |
| # Install curl and jq |
| set +e |
| apt-get update && apt-get install -y curl jq 2>/dev/null || apk add curl jq 2>/dev/null |
| set -e |
| |
| # Fetch the JSON release data |
| echo "Fetching Flutter release data..." |
| JSON_DATA=$$(curl -sf https://storage.googleapis.com/flutter_infra_release/releases/releases_linux.json) |
| |
| if [ -z "$$JSON_DATA" ]; then |
| echo "Error: Failed to fetch JSON release data from Google Cloud Storage." |
| exit 1 |
| fi |
| |
| # Extract the stable and beta versions |
| STABLE_VERSION=$$(echo "$$JSON_DATA" | \ |
| jq -r '.current_release.stable as $$stable_hash | .releases[] | select(.hash == $$stable_hash) | .version' | head -n 1) |
| BETA_VERSION=$$(echo "$$JSON_DATA" | \ |
| jq -r '.current_release.beta as $$beta_hash | .releases[] | select(.hash == $$beta_hash) | .version' | head -n 1) |
| |
| if [ -z "$$STABLE_VERSION" ] || [ "$$STABLE_VERSION" == "null" ]; then |
| echo "Error: STABLE_VERSION could not be parsed." |
| exit 1 |
| fi |
| |
| if [ -z "$$BETA_VERSION" ] || [ "$$BETA_VERSION" == "null" ]; then |
| echo "Error: BETA_VERSION could not be parsed." |
| exit 1 |
| fi |
| |
| echo "Current stable version is: $$STABLE_VERSION" |
| echo "Current beta version is: $$BETA_VERSION" |
| echo "Building for version: $_FLUTTER_VERSION" |
| |
| BASE_TAGS="us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:$_FLUTTER_VERSION" |
| DEV_TAGS="us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:$_FLUTTER_VERSION" |
| |
| if [ "$_FLUTTER_VERSION" == "$$STABLE_VERSION" ]; then |
| echo "Version $_FLUTTER_VERSION is stable. Tagging as stable and latest." |
| BASE_TAGS="$$BASE_TAGS,us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:stable,us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:latest" |
| DEV_TAGS="$$DEV_TAGS,us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:stable,us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:latest" |
| elif [ "$_FLUTTER_VERSION" == "$$BETA_VERSION" ]; then |
| echo "Version $_FLUTTER_VERSION is beta. Tagging as beta." |
| BASE_TAGS="$$BASE_TAGS,us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:beta" |
| DEV_TAGS="$$DEV_TAGS,us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:beta" |
| else |
| echo "Version $_FLUTTER_VERSION is neither stable nor beta. Using version tag only." |
| fi |
| |
| echo "BASE_TAGS=$$BASE_TAGS" > /workspace/tags.env |
| echo "DEV_TAGS=$$DEV_TAGS" >> /workspace/tags.env |
| |
| # ========================================== |
| # STEP 2: Build the Multi-Arch Base Image |
| # ========================================== |
| - name: 'gcr.io/cloud-builders/docker' |
| dir: 'cloud_build/flutter_agy_docker/' |
| entrypoint: 'bash' |
| args: |
| - '-c' |
| - | |
| set -euo pipefail |
| |
| # Register QEMU emulators for multi-arch build |
| docker run --privileged --rm tonistiigi/binfmt --install all |
| |
| # Create a new buildx builder |
| docker buildx create --use |
| |
| # Read tags |
| source /workspace/tags.env |
| |
| # Convert comma-separated tags to -t arguments |
| IFS=',' read -ra ADDR <<< "$$BASE_TAGS" |
| TAG_ARGS=() |
| for tag in "$${ADDR[@]}"; do |
| TAG_ARGS+=("-t" "$$tag") |
| done |
| |
| # Build and push the base image |
| docker buildx build \ |
| --platform linux/amd64,linux/arm64 \ |
| --cache-from us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:latest \ |
| --cache-to type=inline \ |
| --build-arg FLUTTER_VERSION=$_FLUTTER_VERSION \ |
| "$${TAG_ARGS[@]}" \ |
| -f Dockerfile.base \ |
| --push \ |
| . |
| |
| # ========================================== |
| # STEP 3: Build the Multi-Arch Dev Image |
| # ========================================== |
| - name: 'gcr.io/cloud-builders/docker' |
| dir: 'cloud_build/flutter_agy_docker/' |
| entrypoint: 'bash' |
| args: |
| - '-c' |
| - | |
| set -euo pipefail |
| |
| # Register QEMU emulators |
| docker run --privileged --rm tonistiigi/binfmt --install all |
| |
| # Create a new buildx builder |
| docker buildx create --use |
| |
| # Read tags |
| source /workspace/tags.env |
| |
| # Convert comma-separated tags to -t arguments |
| IFS=',' read -ra ADDR <<< "$$DEV_TAGS" |
| TAG_ARGS=() |
| for tag in "$${ADDR[@]}"; do |
| TAG_ARGS+=("-t" "$$tag") |
| done |
| |
| # Build and push the developer image |
| docker buildx build \ |
| --platform linux/amd64,linux/arm64 \ |
| --cache-from us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:latest \ |
| --cache-to type=inline \ |
| --build-arg FLUTTER_VERSION=$_FLUTTER_VERSION \ |
| --build-arg CACHE_BUSTER=$BUILD_ID \ |
| "$${TAG_ARGS[@]}" \ |
| -f Dockerfile \ |
| --push \ |
| . |
| |
| substitutions: |
| _FLUTTER_VERSION: "3.44.3" |
| |
| options: |
| logging: CLOUD_LOGGING_ONLY |