| # 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: Build the Static Base Image | |
| # ========================================== | |
| - name: 'gcr.io/cloud-builders/docker' | |
| entrypoint: 'bash' | |
| args: ['-c', 'docker pull us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:latest || exit 0'] | |
| - name: 'gcr.io/cloud-builders/docker' | |
| dir: 'cloud_build/flutter_agy_docker/' | |
| args: | |
| - 'build' | |
| - '--cache-from' | |
| - 'us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:latest' | |
| - '--build-arg' | |
| - 'FLUTTER_VERSION=$_FLUTTER_VERSION' | |
| - '-t' | |
| - 'us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:$_FLUTTER_VERSION' | |
| - '-f' | |
| - 'Dockerfile.base' | |
| - '.' | |
| # ========================================== | |
| # STEP 2: Build the Auto-Updating Dev Image | |
| # ========================================== | |
| - name: 'gcr.io/cloud-builders/docker' | |
| entrypoint: 'bash' | |
| args: ['-c', 'docker pull us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:latest || exit 0'] | |
| - name: 'gcr.io/cloud-builders/docker' | |
| dir: 'cloud_build/flutter_agy_docker/' | |
| args: | |
| - 'build' | |
| - '--cache-from' | |
| - 'us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:latest' | |
| - '--build-arg' | |
| - 'FLUTTER_VERSION=$_FLUTTER_VERSION' | |
| # Force apt-get to run by injecting the unique build ID | |
| - '--build-arg' | |
| - 'CACHE_BUSTER=$BUILD_ID' | |
| - '-t' | |
| - 'us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:$_FLUTTER_VERSION' | |
| - '-f' | |
| - 'Dockerfile' | |
| - '.' | |
| # ========================================== | |
| # STEP 3: Conditionally Tag and Push 'latest', 'stable', or 'beta' | |
| # ========================================== | |
| - name: 'gcr.io/cloud-builders/docker' | |
| entrypoint: 'bash' | |
| args: | |
| - '-c' | |
| - | | |
| set -euo pipefail | |
| # Install curl and jq (handles both Debian and Alpine builder variants) | |
| # We temporarily disable exit-on-error to allow the fallback to work cleanly | |
| 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) | |
| # Validate that the versions were successfully parsed. | |
| # -z "$$STABLE_VERSION" checks if the variable is an empty string (e.g., if jq failed entirely). | |
| # "$$STABLE_VERSION" == "null" checks if jq succeeded but couldn't find the requested data in the JSON. | |
| if [ -z "$$STABLE_VERSION" ] || [ "$$STABLE_VERSION" == "null" ]; then | |
| echo "Error: STABLE_VERSION could not be parsed from JSON. The JSON structure may have changed." | |
| exit 1 | |
| fi | |
| if [ -z "$$BETA_VERSION" ] || [ "$$BETA_VERSION" == "null" ]; then | |
| echo "Error: BETA_VERSION could not be parsed from JSON. The JSON structure may have changed." | |
| exit 1 | |
| fi | |
| echo "Current stable version is: $$STABLE_VERSION" | |
| echo "Current beta version is: $$BETA_VERSION" | |
| echo "Building for version: $_FLUTTER_VERSION" | |
| if [ "$_FLUTTER_VERSION" == "$$STABLE_VERSION" ]; then | |
| echo "Version $_FLUTTER_VERSION is stable. Tagging and pushing as latest and stable." | |
| # Tag the previously built versioned images | |
| docker tag us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:$_FLUTTER_VERSION us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:stable | |
| docker tag us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:$_FLUTTER_VERSION us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:latest | |
| docker tag us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:$_FLUTTER_VERSION us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:stable | |
| docker tag us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:$_FLUTTER_VERSION us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:latest | |
| # Push the new tags | |
| docker push us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:stable | |
| docker push us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:latest | |
| docker push us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:stable | |
| docker push us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:latest | |
| elif [ "$_FLUTTER_VERSION" == "$$BETA_VERSION" ]; then | |
| echo "Version $_FLUTTER_VERSION is beta. Tagging and pushing as beta." | |
| # Tag the previously built versioned images | |
| docker tag us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:$_FLUTTER_VERSION us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:beta | |
| docker tag us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:$_FLUTTER_VERSION us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:beta | |
| # Push the new tags | |
| docker push us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:beta | |
| docker push us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:beta | |
| else | |
| echo "Version $_FLUTTER_VERSION is neither the stable nor beta release. Skipping extra tags." | |
| fi | |
| substitutions: | |
| _FLUTTER_VERSION: "3.44.3" | |
| # Push both the base and the final developer image to the registry | |
| images: | |
| - 'us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:$_FLUTTER_VERSION' | |
| - 'us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_docker:$_FLUTTER_VERSION' | |
| # Force Cloud Build to send logs directly to Cloud Logging | |
| # instead of an autogenerated GCS bucket | |
| options: | |
| logging: CLOUD_LOGGING_ONLY |