|
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