|
1 | 1 | #!/bin/bash |
2 | | -# Install Maven 3.9.13 and Gradle 9.3.1 for SAM CLI integration tests. |
3 | | -# Supports both Linux and Windows (Git Bash on GitHub Actions). |
| 2 | +# Install latest stable Maven 3.x and Gradle for SAM CLI integration tests. |
| 3 | +# Auto-detects latest versions from official APIs. |
| 4 | +# Skips install if pre-installed versions meet minimums. |
4 | 5 | set -euo pipefail |
5 | 6 |
|
6 | | -MAVEN_VERSION="3.9.13" |
7 | | -GRADLE_VERSION="9.3.1" |
| 7 | +MIN_MAVEN="3.9.12" |
| 8 | +MIN_GRADLE="9.2.0" |
8 | 9 |
|
9 | | -# Check if correct versions are already installed |
10 | | -MAVEN_INSTALLED=$(mvn --version 2>/dev/null | head -1 | grep -o "${MAVEN_VERSION}" || true) |
11 | | -GRADLE_INSTALLED=$(gradle --version 2>/dev/null | grep "Gradle ${GRADLE_VERSION}" || true) |
| 10 | +version_gte() { printf '%s\n%s' "$2" "$1" | sort -V -C; } |
| 11 | +get_maven_ver() { mvn --version 2>/dev/null | head -1 | sed -n 's/.*Maven \([0-9.]*\).*/\1/p' || true; } |
| 12 | +get_gradle_ver() { gradle --version 2>/dev/null | sed -n 's/.*Gradle \([0-9.]*\).*/\1/p' || true; } |
12 | 13 |
|
13 | | -if [[ -n "$MAVEN_INSTALLED" && -n "$GRADLE_INSTALLED" ]]; then |
14 | | - echo "Maven ${MAVEN_VERSION} and Gradle ${GRADLE_VERSION} are already installed, skipping." |
15 | | - mvn --version |
16 | | - gradle --version |
| 14 | +MVN_VER=$(get_maven_ver) |
| 15 | +GRADLE_VER=$(get_gradle_ver) |
| 16 | +echo "=== Current: Maven=${MVN_VER:-none} Gradle=${GRADLE_VER:-none} ===" |
| 17 | + |
| 18 | +NEED_MAVEN=true; NEED_GRADLE=true |
| 19 | +[[ -n "$MVN_VER" ]] && version_gte "$MVN_VER" "$MIN_MAVEN" && NEED_MAVEN=false |
| 20 | +[[ -n "$GRADLE_VER" ]] && version_gte "$GRADLE_VER" "$MIN_GRADLE" && NEED_GRADLE=false |
| 21 | + |
| 22 | +if ! $NEED_MAVEN && ! $NEED_GRADLE; then |
| 23 | + echo "Versions sufficient, skipping install." |
17 | 24 | exit 0 |
18 | 25 | fi |
19 | 26 |
|
20 | | -if [[ "${RUNNER_OS:-}" == "Windows" ]]; then |
21 | | - echo "=== Installing Maven ${MAVEN_VERSION} and Gradle ${GRADLE_VERSION} on Windows via choco ===" |
22 | | - [[ -z "$MAVEN_INSTALLED" ]] && choco install maven --version="${MAVEN_VERSION}" -y --allow-downgrade |
23 | | - [[ -z "$GRADLE_INSTALLED" ]] && choco install gradle --version="${GRADLE_VERSION}" -y --allow-downgrade |
24 | | - |
25 | | - # Chocolatey updates the system PATH in the registry but the current bash session |
26 | | - # doesn't see it. Explicitly add the known install paths so mvn/gradle are available |
27 | | - # in this session and in subsequent workflow steps. |
28 | | - CHOCO_MAVEN_BIN="C:/ProgramData/chocolatey/lib/maven/apache-maven-${MAVEN_VERSION}/bin" |
29 | | - CHOCO_GRADLE_BIN="C:/ProgramData/chocolatey/lib/gradle/gradle-${GRADLE_VERSION}/bin" |
30 | | - export PATH="${CHOCO_MAVEN_BIN}:${CHOCO_GRADLE_BIN}:${PATH}" |
31 | | - echo "${CHOCO_MAVEN_BIN}" >> "$GITHUB_PATH" |
32 | | - echo "${CHOCO_GRADLE_BIN}" >> "$GITHUB_PATH" |
33 | | -else |
34 | | - echo "=== Installing Maven ${MAVEN_VERSION} and Gradle ${GRADLE_VERSION} on Linux ===" |
35 | | - sudo apt-get remove -y maven || true |
| 27 | +resolve_maven_version() { |
| 28 | + curl -sfL "https://repo1.maven.org/maven2/org/apache/maven/apache-maven/maven-metadata.xml" \ |
| 29 | + | sed -n 's/.*<version>3\.9\.\([0-9]*\)<.*/\1/p' | sort -n | tail -1 | xargs -I{} echo "3.9.{}" |
| 30 | +} |
36 | 31 |
|
37 | | - wget -q "https://dlcdn.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.zip" -P /tmp |
38 | | - sudo unzip -o -q /tmp/apache-maven-*.zip -d /opt/mvn |
| 32 | +resolve_gradle_version() { |
| 33 | + curl -sfL "https://services.gradle.org/versions/current" | sed -n 's/.*"version"\s*:\s*"\([^"]*\)".*/\1/p' |
| 34 | +} |
39 | 35 |
|
40 | | - wget -q "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" -P /tmp |
41 | | - sudo unzip -o -q /tmp/gradle-*.zip -d /opt/gradle |
42 | | - |
43 | | - sudo ln -sf "/opt/mvn/apache-maven-${MAVEN_VERSION}/bin/mvn" /usr/local/bin/mvn |
44 | | - sudo ln -sf "/opt/gradle/gradle-${GRADLE_VERSION}/bin/gradle" /usr/local/bin/gradle |
| 36 | +if [[ "${RUNNER_OS:-}" == "Windows" ]]; then |
| 37 | + $NEED_MAVEN && choco install maven -y |
| 38 | + $NEED_GRADLE && choco install gradle -y |
| 39 | + CHOCO_BASE="C:/ProgramData/chocolatey/lib" |
| 40 | + MVN_BIN=$(find "$CHOCO_BASE/maven" -name "mvn.cmd" -print -quit 2>/dev/null | xargs dirname || true) |
| 41 | + GRADLE_BIN=$(find "$CHOCO_BASE/gradle" -name "gradle.bat" -print -quit 2>/dev/null | xargs dirname || true) |
| 42 | + [[ -n "$MVN_BIN" ]] && { export PATH="$MVN_BIN:$PATH"; echo "$MVN_BIN" >> "$GITHUB_PATH"; } |
| 43 | + [[ -n "$GRADLE_BIN" ]] && { export PATH="$GRADLE_BIN:$PATH"; echo "$GRADLE_BIN" >> "$GITHUB_PATH"; } |
| 44 | +else |
| 45 | + sudo apt-get remove -y maven 2>/dev/null || true |
45 | 46 |
|
46 | | - echo "/opt/mvn/apache-maven-${MAVEN_VERSION}/bin" >> "$GITHUB_PATH" |
47 | | - echo "/opt/gradle/gradle-${GRADLE_VERSION}/bin" >> "$GITHUB_PATH" |
48 | | - echo "MAVEN_HOME=/opt/mvn/apache-maven-${MAVEN_VERSION}" >> "$GITHUB_ENV" |
| 47 | + if $NEED_MAVEN; then |
| 48 | + MAVEN_VERSION=$(resolve_maven_version) |
| 49 | + echo "Installing Maven ${MAVEN_VERSION}..." |
| 50 | + wget -q "https://dlcdn.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" -O /tmp/maven.tar.gz |
| 51 | + sudo tar -xzf /tmp/maven.tar.gz -C /opt |
| 52 | + sudo ln -sf "/opt/apache-maven-${MAVEN_VERSION}/bin/mvn" /usr/local/bin/mvn |
| 53 | + echo "MAVEN_HOME=/opt/apache-maven-${MAVEN_VERSION}" >> "$GITHUB_ENV" |
| 54 | + fi |
49 | 55 |
|
50 | | - export PATH="/opt/mvn/apache-maven-${MAVEN_VERSION}/bin:/opt/gradle/gradle-${GRADLE_VERSION}/bin:$PATH" |
| 56 | + if $NEED_GRADLE; then |
| 57 | + GRADLE_VERSION=$(resolve_gradle_version) |
| 58 | + echo "Installing Gradle ${GRADLE_VERSION}..." |
| 59 | + wget -q "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" -O /tmp/gradle.zip |
| 60 | + sudo unzip -o -q /tmp/gradle.zip -d /opt |
| 61 | + sudo ln -sf "/opt/gradle-${GRADLE_VERSION}/bin/gradle" /usr/local/bin/gradle |
| 62 | + fi |
51 | 63 | fi |
52 | 64 |
|
53 | | -mvn --version || echo "WARNING: mvn --version failed" |
54 | | -gradle --version || echo "WARNING: gradle --version failed" |
55 | | -echo "=== Maven and Gradle installation complete ===" |
| 65 | +echo "=== Installed: Maven=$(get_maven_ver) Gradle=$(get_gradle_ver) ===" |
0 commit comments