|
1 | 1 | #!/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}") |
4 | 4 |
|
5 |
| -# Args |
| 5 | +# Action inputs |
6 | 6 | FLUTTER_VERSION=${1:-"latest"}
|
7 | 7 | 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..." |
19 | 20 | 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" |
21 | 22 | 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 |
23 | 25 | 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}" |
43 | 35 | 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 |
51 | 38 | 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." |
59 | 39 | fi
|
60 | 40 |
|
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* ]] |
63 | 43 | 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//') |
66 | 45 | fi
|
67 | 46 |
|
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 |
73 | 54 |
|
| 55 | + FLUTTER_BUILD_OS="macos_arm64" |
| 56 | + echo "Apple Silicon detected, using \"${FLUTTER_BUILD_OS}\" build!" |
| 57 | +fi |
74 | 58 |
|
75 | 59 | # OS archive file extension
|
76 | 60 | EXT="zip"
|
|
79 | 63 | EXT="tar.xz"
|
80 | 64 | fi
|
81 | 65 |
|
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}"} |
98 | 80 |
|
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" |
108 | 87 |
|
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}\" ..." |
111 | 91 |
|
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" |
120 | 96 | if [ $? -ne 0 ]; then
|
121 | 97 | echo -e "::error::Download failed! Please check passed arguments."
|
122 | 98 | exit 1
|
123 | 99 | fi
|
124 | 100 |
|
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 |
145 | 102 | mkdir -p "${FLUTTER_RUNNER_TOOL_CACHE}"
|
146 | 103 |
|
147 | 104 | # Extracting installation archive
|
148 |
| - EXTRACT_ARCHIVE_CODE=0 |
149 | 105 | echo -n "Extracting Flutter SDK archive..."
|
150 | 106 | if [[ $OS == linux ]]
|
151 | 107 | 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 |
153 | 109 | EXTRACT_ARCHIVE_CODE=$?
|
154 | 110 | 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 |
156 | 112 | EXTRACT_ARCHIVE_CODE=$?
|
157 | 113 | fi
|
158 | 114 | if [ $EXTRACT_ARCHIVE_CODE -eq 0 ]; then
|
|
167 | 123 |
|
168 | 124 | # Configure pub to use a fixed location.
|
169 | 125 | echo "PUB_CACHE=${FLUTTER_PUB_CACHE}" >> $GITHUB_ENV
|
| 126 | +mkdir -p $FLUTTER_PUB_CACHE |
170 | 127 |
|
171 | 128 | # Update paths.
|
172 | 129 | echo "${FLUTTER_PUB_CACHE}/bin" >> $GITHUB_PATH
|
173 | 130 | echo "${FLUTTER_RUNNER_TOOL_CACHE}/flutter/bin" >> $GITHUB_PATH
|
174 | 131 |
|
175 | 132 | # 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 |
177 | 134 |
|
178 | 135 | # 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 |
181 | 138 |
|
182 | 139 | # Report success, and print version.
|
183 | 140 | echo "Succesfully installed Flutter SDK:"
|
|
0 commit comments