Я могу запустить lintDebug или тестовые примеры на своем локальном терминале студии Android, сборки проходят успешно. В настоящее время я изучаю CI/CD и пытаюсь запустить Github Actions, чтобы выполнить задание, когда я отправляю свой код. Но при нажатии CI терпит неудачу при первом задании со следующим исключением:
> Could not resolve all files for configuration ':classpath'.
> Could not resolve androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7.
Required by:
project : > androidx.navigation.safeargs:androidx.navigation.safeargs.gradle.plugin:2.7.7
> No matching variant of androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7 was found. The consumer was configured to find a library for use during runtime, compatible with Java 11, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '8.4' but:
- Variant 'apiElements' capability androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7 declares a library, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares a component for use during compile-time, compatible with Java 17 and the consumer needed a component for use during runtime, compatible with Java 11
- Other compatible attribute:
- Doesn't say anything about org.gradle.plugin.api-version (required '8.4')
- Variant 'runtimeElements' capability androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7 declares a library for use during runtime, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares a component, compatible with Java 17 and the consumer needed a component, compatible with Java 11
- Other compatible attribute:
- Doesn't say anything about org.gradle.plugin.api-version (required '8.4')
- Variant 'sourcesElements' capability androidx.navigation:navigation-safe-args-gradle-plugin:2.7.7 declares a component for use during runtime, and its dependencies declared externally:
- Incompatible because this component declares documentation and the consumer needed a library
- Other compatible attributes:
- Doesn't say anything about its target Java version (required compatibility with Java 11)
- Doesn't say anything about its elements (required them packaged as a jar)
- Doesn't say anything about org.gradle.plugin.api-version (required '8.4')
Как я понимаю из ошибки, бегун GitHub использует Java 11, а мой код использует Java 17. Поэтому в моем CI я добавил версию Java и распространение под каждым ключевым словом Uses, чтобы решить эту проблему. Я также пытался запустить с самостоятельным хостингом, тоже не получилось. Вот моя начальная часть кода CI, которая генерирует ошибку:
name: CI
on:
push:
branches: [master]
pull_request:
branches: [master]
jobs:
start:
runs-on: ubuntu-latest
steps:
- name: Checkout the code
uses: actions/checkout@v4
with:
distribution: 'temurin'
java-version: '17'
overwrite-settings: false
- name: Run sample script
run: echo Hello, world
lint:
name: Perform lint check
needs: [start]
runs-on: ubuntu-latest
steps:
- name: Checkout the code
uses: actions/checkout@v4
with:
distribution: 'temurin'
java-version: '17'
overwrite-settings: false
- name: Cache Gradle
uses: actions/cache@v4
with:
distribution: 'temurin'
java-version: '17'
overwrite-settings: false
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
restore-keys: ${{ runner.os }}-gradle-
- name: Make Gradle executable
run: chmod +x ./gradlew
- name: Run lint
run: ./gradlew lintDebug
- name: Upload html test report
uses: actions/upload-artifact@v4
with:
distribution: 'temurin'
java-version: '17'
overwrite-settings: false
name: lint.html
path: app/build/reports/lint-results-debug.html
unit-test:
name: Perform Unit Testing
needs: [lint]
runs-on: ubuntu-latest
steps:
- name: Checkout the code
uses: actions/checkout@v4
with:
distribution: 'temurin'
java-version: '17'
overwrite-settings: false
- name: Run tests
run: ./gradlew test
- name: Upload test report
uses: actions/upload-artifact@v4
with:
distribution: 'temurin'
java-version: '17'
overwrite-settings: false
name: unit_test_report
path: app/build/reports/test/testDebugUnitTest/
Когда я искал похожие проблемы, я предлагал поместить соответствующий плагин id("androidx.navigation.safeargs.kotlin") в конец разделов плагинов и проверить наличие JavaVersion.VERSION_17 compileOptions в build.gradle. Сделано это, но все еще не могу устранить ошибку. Любая помощь или идеи будут оценены по достоинству. Заранее спасибо.
Через некоторое время я обнаружил, что ошибка SafeArgs не возникает. Потому что, когда я полностью удаляю Safeargs из своего проекта и использую Bundle, на этот раз следующий плагин, который я объявил в build.gradle, ниже Safears com.android.application, выдает ту же ошибку.
Я думал, что запускаю свой CI, используя JavaVersion.VERSION_17, а приведенный ниже код, по-видимому, не отменяет Java-версию github runner:
with:
distribution: 'temurin'
java-version: '17'
В документации я обнаружил, что могу установить свою собственную версию Java в Github runner, поэтому в каждом задании я добавлял строки с run. С помощью этого я создал ту же среду, что и моя локальная машина с Ubuntu, и там она тоже работала как часы. Приведенный ниже код является лишь частью моего CI, но его достаточно, чтобы вы могли увидеть, как изменить машину-раннер Github по умолчанию. Надеюсь, это поможет.
lint:
name: Perform lint check
needs: [start]
runs-on: ubuntu-latest
steps:
- name: Checkout the code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cache Gradle
uses: actions/cache@v4
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
restore-keys: ${{ runner.os }}-gradle-
- run: |
download_url = "https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz"
wget -O $RUNNER_TEMP/java_package.tar.gz $download_url
- uses: actions/setup-java@v4
with:
distribution: 'jdkfile'
jdkFile: ${{ runner.temp }}/java_package.tar.gz
java-version: '17'
architecture: x64
- name: Make Gradle executable
run: chmod +x ./gradlew
- name: Run lint
run: ./gradlew lintDebug
- name: Upload html test report
uses: actions/upload-artifact@v4
with:
name: lint.html
path: app/build/reports/lint-results-debug.html