Skip to content

Commit d733e70

Browse files
committed
Rework implementation on how action download Flutter SDK and improve caching
1 parent c7fdb36 commit d733e70

File tree

2 files changed

+80
-123
lines changed

2 files changed

+80
-123
lines changed

action.sh

Lines changed: 76 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,60 @@
11
#!/bin/bash
2-
ARCH=$(echo "${RUNNER_ARCH:-x64}" | awk '{print tolower($0)}')
3-
OS=$(echo "${RUNNER_OS:-linux}" | awk '{print tolower($0)}')
2+
OS=$(echo "${RUNNER_OS:-linux}")
3+
ARCH=$(echo "${RUNNER_ARCH:-x64}")
44

5-
# Args
5+
# Action inputs
66
FLUTTER_VERSION=${1:-"latest"}
77
FLUTTER_CHANNEL=${2:-"stable"}
8-
FLUTTER_OS=$OS
9-
FLUTTER_ARCH=$ARCH
10-
11-
# Flutter SDK release manifest
12-
FLUTTER_RELEASE_MANIFEST_URL="https://storage.googleapis.com/flutter_infra_release/releases/releases_$FLUTTER_OS.json"
13-
FLUTTER_RELEASE_MANIFEST_FILE="${RUNNER_TEMP}/releases_$FLUTTER_OS.json"
14-
FLUTTER_RELEASE_BASE_URL="https://storage.googleapis.com/flutter_infra_release/releases"
15-
16-
# Check if Flutter SDK release manifest exists
17-
# Otherwise fetch and cache it
18-
if [ ! -f "$FLUTTER_RELEASE_MANIFEST_FILE" ]; then
8+
FLUTTER_OS=$(echo "${OS}" | awk '{print tolower($0)}')
9+
FLUTTER_ARCH=$(echo "${ARCH}" | awk '{print tolower($0)}')
10+
FLUTTER_RELEASE_URL=${FLUTTER_RELEASE_URL:-"https://storage.googleapis.com/flutter_infra_release/releases"}
11+
12+
# Automatically determine the latest Flutter SDK version via the release manifest
13+
if [[ $FLUTTER_VERSION == "latest" ]]; then
14+
# Flutter SDK release manifest
15+
FLUTTER_RELEASE_MANIFEST_URL="${FLUTTER_RELEASE_URL}/releases_${FLUTTER_OS}.json"
16+
FLUTTER_RELEASE_MANIFEST_FILE="${RUNNER_TEMP}/releases_${FLUTTER_OS}.json"
17+
18+
echo "You have selected to install the latest Flutter SDK version (${FLUTTER_CHANNEL}) on \"${FLUTTER_OS}_${FLUTTER_ARCH}\"."
19+
echo "Attempting to determine the latest Flutter SDK version..."
1920
echo "Fetching Flutter SDK release manifest..."
20-
curl -fsSL "$FLUTTER_RELEASE_MANIFEST_URL" -o "$FLUTTER_RELEASE_MANIFEST_FILE"
21+
curl --silent --connect-timeout 15 --retry 5 "$FLUTTER_RELEASE_MANIFEST_URL" -o "$FLUTTER_RELEASE_MANIFEST_FILE"
2122
if [ $? -ne 0 ]; then
22-
echo -e "::warning::Failed to fetch Flutter SDK release manifest."
23+
echo -e "::error::Failed to fetch Flutter SDK release manifest."
24+
exit 1
2325
fi
24-
else
25-
echo "Using cached Flutter SDK release manifest."
26-
fi
27-
if [ -f "$FLUTTER_RELEASE_MANIFEST_FILE" ]; then
28-
# Obtain the base URL and override FLUTTER_RELEASE_BASE_URL
29-
FLUTTER_RELEASE_BASE_URL=$(jq -r ".base_url" "$FLUTTER_RELEASE_MANIFEST_FILE")
30-
31-
# Detect the latest version
32-
if [[ $FLUTTER_VERSION == "latest" ]]
33-
then
34-
FLUTTER_RELEASE_CURRENT=$(jq -r ".current_release.${FLUTTER_CHANNEL}" "$FLUTTER_RELEASE_MANIFEST_FILE")
35-
__QUERY="select(.hash == \"${FLUTTER_RELEASE_CURRENT}\" and .dart_sdk_arch == \"${ARCH}\")"
36-
FLUTTER_RELEASE_VERSION=$(jq -r ".releases | map(${__QUERY}) | .[0].version" "$FLUTTER_RELEASE_MANIFEST_FILE")
37-
FLUTTER_RELEASE_SHA256=$(jq -r ".releases | map(${__QUERY}) | .[0].sha256" "$FLUTTER_RELEASE_MANIFEST_FILE")
38-
FLUTTER_RELEASE_ARCHIVE=$(jq -r ".releases | map(${__QUERY}) | .[0].archive" "$FLUTTER_RELEASE_MANIFEST_FILE")
39-
40-
# Set the detected version
41-
FLUTTER_VERSION=$FLUTTER_RELEASE_VERSION
42-
FLUTTER_DOWNLOAD_URL="${FLUTTER_RELEASE_BASE_URL}/${FLUTTER_RELEASE_ARCHIVE}"
26+
if [ -f "$FLUTTER_RELEASE_MANIFEST_FILE" ]; then
27+
__FLUTTER_CURRENT_RELEASE=$(jq -r ".current_release.${FLUTTER_CHANNEL}" "$FLUTTER_RELEASE_MANIFEST_FILE")
28+
__QUERY="select(.hash == \"${__FLUTTER_CURRENT_RELEASE}\" and .dart_sdk_arch == \"${ARCH}\")"
29+
FLUTTER_VERSION=$(jq -r ".releases | map(${__QUERY}) | .[0].version" "$FLUTTER_RELEASE_MANIFEST_FILE")
30+
if [ -z "$FLUTTER_VERSION" ]; then
31+
echo -e "::error::Failed to determine the latest Flutter SDK version."
32+
exit 1
33+
fi
34+
echo "Found the latest Flutter SDK version: ${FLUTTER_VERSION}"
4335
else
44-
__QUERY="select(.version == \"${FLUTTER_VERSION}\" and .dart_sdk_arch == \"${ARCH}\")"
45-
FLUTTER_RELEASE_SHA256=$(jq -r ".releases | map(${__QUERY}) | .[0].sha256" "$FLUTTER_RELEASE_MANIFEST_FILE")
46-
FLUTTER_RELEASE_ARCHIVE=$(jq -r ".releases | map(${__QUERY}) | .[0].archive" "$FLUTTER_RELEASE_MANIFEST_FILE")
47-
48-
# Set the detected version
49-
FLUTTER_RELEASE_VERSION=$FLUTTER_VERSION
50-
FLUTTER_DOWNLOAD_URL="${FLUTTER_RELEASE_BASE_URL}/${FLUTTER_RELEASE_ARCHIVE}"
36+
echo -e "::error::Failed to determine the latest Flutter SDK version."
37+
exit 1
5138
fi
52-
53-
# Debug information
54-
echo "::debug::FLUTTER_RELEASE_VERSION=$FLUTTER_RELEASE_VERSION"
55-
echo "::debug::FLUTTER_RELEASE_SHA256=$FLUTTER_RELEASE_SHA256"
56-
echo "::debug::FLUTTER_RELEASE_ARCHIVE=$FLUTTER_RELEASE_ARCHIVE"
57-
else
58-
echo -e "::warning::Flutter SDK release manifest not found. Switched to using default fallback download strategy."
5939
fi
6040

61-
# Apple Intel or Apple Silicon
62-
if [[ $OS == "macos" && $ARCH == "arm64" && $FLUTTER_VERSION < 3.* ]]
41+
# Strip 'v' prefix from the version
42+
if [[ $FLUTTER_VERSION == v* ]]
6343
then
64-
echo -e "::error::Flutter SDK version \"${FLUTTER_VERSION}\" is not supported on Apple Silicon. Please use version 3.0.0 or higher."
65-
exit 1
44+
FLUTTER_VERSION=$(echo $FLUTTER_VERSION | sed 's/^v//')
6645
fi
6746

68-
# Flutter runner tool cache and pub cache
69-
# path: "${{ runner.tool_cache }}/flutter-${{ runner.os }}-${{ inputs.version }}-${{ runner.arch }}"
70-
# key: flutter-action-setup-flutter-${{ runner.os }}-${{ inputs.version }}-${{ runner.arch }}
71-
FLUTTER_RUNNER_TOOL_CACHE="${RUNNER_TOOL_CACHE}/flutter-${RUNNER_OS}-${FLUTTER_VERSION}-${RUNNER_ARCH}"
72-
FLUTTER_PUB_CACHE="${RUNNER_TEMP}/pub-cache"
47+
# Fix Flutter SDK version for Apple Silicon
48+
FLUTTER_BUILD_OS=$FLUTTER_OS
49+
if [[ $OS == "macos" && $ARCH == "arm64" ]]; then
50+
if [[ $FLUTTER_VERSION < 3.* ]]; then
51+
echo -e "::error::Flutter SDK version \"${FLUTTER_VERSION}\" is not supported on Apple Silicon. Please use version 3.0.0 or higher."
52+
exit 1
53+
fi
7354

55+
FLUTTER_BUILD_OS="macos_arm64"
56+
echo "Apple Silicon detected, using \"${FLUTTER_BUILD_OS}\" build!"
57+
fi
7458

7559
# OS archive file extension
7660
EXT="zip"
@@ -79,80 +63,52 @@ then
7963
EXT="tar.xz"
8064
fi
8165

82-
# Check if Flutter SDK already exists
83-
# Otherwise download and install
84-
# https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_arm64_3.0.2-stable.zip
85-
if [ ! -d "${FLUTTER_RUNNER_TOOL_CACHE}" ]; then
86-
FLUTTER_BUILD_OS=$FLUTTER_OS
87-
echo "Installing Flutter SDK version: ${FLUTTER_VERSION} (${FLUTTER_CHANNEL}) on \"${FLUTTER_OS}_${ARCH}\" ..."
88-
89-
# Linux
90-
# /stable /linux/ flutter_linux_2.10.2-stable.tar.xz
91-
# /beta /linux/ flutter_linux_3.1.0-9.0.pre-beta.tar.xz
92-
93-
# macOS
94-
# /stable /macos/ flutter_macos_3.0.2-stable.zip
95-
# /stable /macos/ flutter_macos_arm64_3.0.2-stable.zip
96-
# /beta /macos/ flutter_macos_arm64_3.1.0-9.0.pre-beta.zip
97-
# /beta /macos/ flutter_macos_3.1.0-9.0.pre-beta.zip
66+
# Construct Flutter SDK build artifact URL
67+
# ---------- Linux ----------
68+
# /stable /linux/ flutter_linux_2.10.2-stable.tar.xz
69+
# /beta /linux/ flutter_linux_3.1.0-9.0.pre-beta.tar.xz
70+
# ---------- macOS ----------
71+
# /stable /macos/ flutter_macos_3.0.2-stable.zip
72+
# /stable /macos/ flutter_macos_arm64_3.0.2-stable.zip
73+
# /beta /macos/ flutter_macos_arm64_3.1.0-9.0.pre-beta.zip
74+
# /beta /macos/ flutter_macos_3.1.0-9.0.pre-beta.zip
75+
# ---------- Windows ----------
76+
# /stable /windows/ flutter_windows_3.0.2-stable.zip
77+
# /beta /windows/ flutter_windows_3.1.0-9.0.pre-beta.zip
78+
FLUTTER_BUILD_ARTIFACT_ID="flutter_${FLUTTER_BUILD_OS}_${FLUTTER_VERSION}-${FLUTTER_CHANNEL}.${EXT}"
79+
FLUTTER_BUILD_ARTIFACT_URL=${FLUTTER_BUILD_ARTIFACT_URL:-"${FLUTTER_RELEASE_URL}/${FLUTTER_CHANNEL}/${FLUTTER_OS}/${FLUTTER_BUILD_ARTIFACT_ID}"}
9880

99-
# Windows
100-
# /stable /windows/ flutter_windows_3.0.2-stable.zip
101-
# /beta /windows/ flutter_windows_3.1.0-9.0.pre-beta.zip
102-
103-
# Apple Intel or Apple Silicon
104-
if [[ $OS == "macos" && $ARCH == "arm64" ]]
105-
then
106-
FLUTTER_BUILD_OS="macos_arm64"
107-
fi
81+
# Flutter runner tool cache and pub cache
82+
# Ref: https://github.com/flutter-actions/setup-flutter/pull/11
83+
# FLUTTER_RUNNER_TOOL_CACHE=${{ runner.tool_cache }}/flutter-${{ runner.os }}-${{ inputs.version }}-${{ runner.arch }}-${{ inputs.channel }}
84+
# FLUTTER_PUB_CACHE=${{ runner.temp }}/pub-cache
85+
FLUTTER_RUNNER_TOOL_CACHE="${RUNNER_TOOL_CACHE}/flutter/${FLUTTER_BUILD_ARTIFACT_ID}"
86+
FLUTTER_PUB_CACHE="${RUNNER_TEMP}/flutter/pub-cache"
10887

109-
FLUTTER_BUILD="flutter_${FLUTTER_BUILD_OS}_${FLUTTER_VERSION}-${FLUTTER_CHANNEL}.${EXT}"
110-
FLUTTER_DOWNLOAD_URL=${FLUTTER_DOWNLOAD_URL:-"${FLUTTER_RELEASE_BASE_URL}/${FLUTTER_CHANNEL}/${FLUTTER_OS}/${FLUTTER_BUILD}"}
88+
# Check if Flutter SDK already exists, otherwise download and install
89+
if [ ! -d "${FLUTTER_RUNNER_TOOL_CACHE}" ]; then
90+
echo "Installing Flutter SDK version: ${FLUTTER_VERSION} (${FLUTTER_CHANNEL}) on \"${FLUTTER_OS}_${FLUTTER_ARCH}\" ..."
11191

112-
if [[ -z "${FLUTTER_DOWNLOAD_URL}" ]]; then
113-
echo -e "::error::Failed to determine the download URL for Flutter SDK."
114-
exit 1
115-
fi
116-
# Download installation archive
117-
echo "Downloading ${FLUTTER_DOWNLOAD_URL}"
118-
DOWNLOAD_PATH="${RUNNER_TEMP}/${FLUTTER_BUILD}"
119-
curl --connect-timeout 15 --retry 5 "$FLUTTER_DOWNLOAD_URL" > ${DOWNLOAD_PATH}
92+
# Download Flutter SDK build artifact
93+
echo "Downloading ${FLUTTER_BUILD_ARTIFACT_URL}"
94+
FLUTTER_BUILD_ARTIFACT_FILE="${RUNNER_TEMP}/${FLUTTER_BUILD_ARTIFACT_ID}"
95+
curl --connect-timeout 15 --retry 5 -C - -o "${FLUTTER_BUILD_ARTIFACT_FILE}" "$FLUTTER_BUILD_ARTIFACT_URL"
12096
if [ $? -ne 0 ]; then
12197
echo -e "::error::Download failed! Please check passed arguments."
12298
exit 1
12399
fi
124100

125-
# Verifying checksum
126-
if [[ -n "${FLUTTER_RELEASE_SHA256}" ]]; then
127-
FLUTTER_RELEASE_SHA256_CODE=0
128-
echo -n "Verifying checksum: "
129-
if [[ $OS == "macos" ]]
130-
then
131-
# Note: on macOS put 2 spaces between the hash and the filename
132-
echo "${FLUTTER_RELEASE_SHA256} ${DOWNLOAD_PATH}" | shasum -a 256 -c -
133-
FLUTTER_RELEASE_SHA256_CODE=$?
134-
else
135-
echo "${FLUTTER_RELEASE_SHA256} ${DOWNLOAD_PATH}" | sha256sum -c -
136-
FLUTTER_RELEASE_SHA256_CODE=$?
137-
fi
138-
if [ $FLUTTER_RELEASE_SHA256_CODE -ne 0 ]; then
139-
echo -e "::error::Checksum verification failed! Please check passed arguments."
140-
exit 1
141-
fi
142-
fi
143-
144-
# Prepare tool cache folder
101+
# Prepare runner tool cache
145102
mkdir -p "${FLUTTER_RUNNER_TOOL_CACHE}"
146103

147104
# Extracting installation archive
148-
EXTRACT_ARCHIVE_CODE=0
149105
echo -n "Extracting Flutter SDK archive..."
150106
if [[ $OS == linux ]]
151107
then
152-
tar -C "${FLUTTER_RUNNER_TOOL_CACHE}" -xf ${DOWNLOAD_PATH} > /dev/null
108+
tar -C "${FLUTTER_RUNNER_TOOL_CACHE}" -xf ${FLUTTER_BUILD_ARTIFACT_FILE} >/dev/null
153109
EXTRACT_ARCHIVE_CODE=$?
154110
else
155-
unzip ${DOWNLOAD_PATH} -d "${FLUTTER_RUNNER_TOOL_CACHE}" > /dev/null
111+
unzip ${FLUTTER_BUILD_ARTIFACT_FILE} -d "${FLUTTER_RUNNER_TOOL_CACHE}" >/dev/null
156112
EXTRACT_ARCHIVE_CODE=$?
157113
fi
158114
if [ $EXTRACT_ARCHIVE_CODE -eq 0 ]; then
@@ -167,17 +123,18 @@ fi
167123

168124
# Configure pub to use a fixed location.
169125
echo "PUB_CACHE=${FLUTTER_PUB_CACHE}" >> $GITHUB_ENV
126+
mkdir -p $FLUTTER_PUB_CACHE
170127

171128
# Update paths.
172129
echo "${FLUTTER_PUB_CACHE}/bin" >> $GITHUB_PATH
173130
echo "${FLUTTER_RUNNER_TOOL_CACHE}/flutter/bin" >> $GITHUB_PATH
174131

175132
# Invoke Flutter SDK to suppress the analytics.
176-
${FLUTTER_RUNNER_TOOL_CACHE}/flutter/bin/flutter --version --suppress-analytics 2>&1 > /dev/null
133+
${FLUTTER_RUNNER_TOOL_CACHE}/flutter/bin/flutter --version --suppress-analytics 2>&1 >/dev/null
177134

178135
# Disable Google Analytics and CLI animations
179-
${FLUTTER_RUNNER_TOOL_CACHE}/flutter/bin/flutter config --no-analytics 2>&1 > /dev/null
180-
${FLUTTER_RUNNER_TOOL_CACHE}/flutter/bin/flutter config --no-cli-animations 2>&1 > /dev/null
136+
${FLUTTER_RUNNER_TOOL_CACHE}/flutter/bin/flutter config --no-analytics 2>&1 >/dev/null
137+
${FLUTTER_RUNNER_TOOL_CACHE}/flutter/bin/flutter config --no-cli-animations 2>&1 >/dev/null
181138

182139
# Report success, and print version.
183140
echo "Succesfully installed Flutter SDK:"

action.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ runs:
3232
name: Configure Flutter SDK cache
3333
uses: actions/cache@v4
3434
with:
35-
path: ${{ runner.tool_cache }}/flutter-${{ runner.os }}-${{ inputs.version }}-${{ runner.arch }}
36-
key: flutter-action-setup-flutter-${{ runner.os }}-${{ inputs.version }}-${{ inputs.channel }}-${{ runner.arch }}
35+
path: ${{ runner.tool_cache }}/flutter
36+
key: flutter-action-setup-flutter-sdk-${{ runner.os }}-${{ inputs.version }}-${{ runner.arch }}-${{ inputs.channel }}
3737
# Cache the pub dependencies
3838
- if: ${{ inputs.cache == 'true' }}
3939
name: Configure pub dependencies cache
4040
uses: actions/cache@v4
4141
with:
42-
path: ${{ runner.temp }}/pub-cache
43-
key: flutter-action-setup-flutter-${{ runner.os }}-${{ inputs.version }}-${{ inputs.channel }}-${{ runner.arch }}-${{ inputs.cache-key }}-pub-cache
42+
path: ${{ runner.temp }}/flutter/pub-cache
43+
key: flutter-action-setup-flutter-${{ inputs.cache-key }}-pub-cache-${{ runner.os }}-${{ inputs.version }}-${{ runner.arch }}-${{ inputs.channel }}
4444
# Run the action
4545
- name: Setup Flutter SDK
4646
run: $GITHUB_ACTION_PATH/action.sh ${{ inputs.version }} ${{ inputs.channel }}

0 commit comments

Comments
 (0)