Skip to content

Commit

Permalink
feature/ci-retry-on-fail (#302)
Browse files Browse the repository at this point in the history
* Impl retry on fail action
  • Loading branch information
mbakgun authored Oct 14, 2024
1 parent 6efbd11 commit b2750ae
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 47 deletions.
140 changes: 115 additions & 25 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:
jobs:
compose-ui-tests:
runs-on: ubuntu-latest
timeout-minutes: 25
timeout-minutes: 60

steps:
- uses: actions/checkout@v4
Expand All @@ -23,114 +23,204 @@ jobs:
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
- name: Run instrumented tests
- name: Set up Emulator, Build and Run Tests
uses: ReactiveCircus/android-emulator-runner@v2.33.0
with:
api-level: 29
script: ./gradlew connectedCheck
script: |
adb devices
./gradlew assembleDebug
./gradlew connectedCheck -PtestBuildType=debug --info
- name: Retry Tests if Failed
uses: nick-fields/retry@v2
if: failure()
with:
timeout_minutes: 15
max_attempts: 2
command: |
adb devices
./gradlew connectedCheck -PtestBuildType=debug --info
- name: Upload Compose UI Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: compose-ui-test-results
path: '**/build/reports/androidTests/'

unit-tests-and-detekt:
runs-on: ubuntu-latest
timeout-minutes: 10
timeout-minutes: 45

steps:
- uses: actions/checkout@v4

- name: Set Java 17
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: 17
distribution: 'adopt'
cache: 'gradle'

- name: Run Detekt
uses: eskatos/gradle-command-action@v3
uses: nick-fields/retry@v2
with:
arguments: detekt
timeout_minutes: 15
max_attempts: 2
command: ./gradlew detekt

- name: Run Unit Tests
run: ./gradlew test --stacktrace
uses: nick-fields/retry@v2
with:
timeout_minutes: 15
max_attempts: 2
command: ./gradlew test --stacktrace

- name: Upload Unit Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: unit-test-results
path: '**/build/reports/tests/'

- name: Upload Detekt Results
if: always()
uses: actions/upload-artifact@v4
with:
name: detekt-results
path: '**/build/reports/detekt/'

iOS-build:
runs-on: macos-latest
timeout-minutes: 20
timeout-minutes: 60

steps:
- uses: actions/checkout@v4

- uses: actions/setup-java@v4
- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17

- name: Build macOS shared code
run: ./gradlew :shared:compileKotlinIosSimulatorArm64
uses: nick-fields/retry@v2
with:
timeout_minutes: 20
max_attempts: 2
command: ./gradlew :shared:compileKotlinIosSimulatorArm64

- name: iOS set up
uses: ./.github/actions/ios-action

- name: Build iOS app
run: xcodebuild build -workspace iosApp/iosApp.xcworkspace -configuration Debug -scheme iosApp -sdk iphoneos -destination name='iPhone 14' -verbose
uses: nick-fields/retry@v2
with:
timeout_minutes: 25
max_attempts: 2
command: xcodebuild build -workspace iosApp/iosApp.xcworkspace -configuration Debug -scheme iosApp -sdk iphoneos -destination name='iPhone 14' -verbose

maestro-ui-tests-and-upload-apk:
runs-on: ubuntu-latest
timeout-minutes: 20
timeout-minutes: 45

outputs:
app: androidApp/build/outputs/apk/debug
steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'adopt'
cache: 'gradle'
- run: ./gradlew :androidApp:assembleDebug
- uses: mobile-dev-inc/action-maestro-cloud@v1.9.2

- name: Assemble Debug APK
uses: nick-fields/retry@v2
with:
timeout_minutes: 20
max_attempts: 2
command: ./gradlew :androidApp:assembleDebug

- name: Run Maestro Tests
uses: mobile-dev-inc/action-maestro-cloud@v1.9.2
with:
api-key: ${{ secrets.MAESTRO_CLOUD_API_KEY }}
app-file: androidApp/build/outputs/apk/debug/androidApp-debug.apk

- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: apk
path: androidApp/build/outputs/apk/debug/androidApp-debug.apk

- name: Upload Maestro Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: maestro-test-results
path: |
${{ github.workspace }}/report*.xml
~/.maestro/tests/**/*
desktop-build:
runs-on: ubuntu-latest
timeout-minutes: 20
timeout-minutes: 45

steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4

- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17

- name: Build desktop app
run: ./gradlew :desktop:packageDistributionForCurrentOS
uses: nick-fields/retry@v2
with:
timeout_minutes: 20
max_attempts: 2
command: ./gradlew :desktop:packageDistributionForCurrentOS

web-build:
runs-on: ubuntu-latest
timeout-minutes: 20
timeout-minutes: 45

steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4

- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17

- name: Build web app
run: ./gradlew :webApp:jsBrowserDevelopmentExecutableDistribution
uses: nick-fields/retry@v2
with:
timeout_minutes: 20
max_attempts: 2
command: ./gradlew :webApp:jsBrowserDevelopmentExecutableDistribution

wasm-build:
runs-on: ubuntu-latest
timeout-minutes: 20
timeout-minutes: 45

steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4

- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: 17

- name: Build wasm app
run: ./gradlew :wasmApp:wasmBrowserDevelopmentExecutableDistribution
uses: nick-fields/retry@v2
with:
timeout_minutes: 20
max_attempts: 2
command: ./gradlew :wasmApp:wasmBrowserDevelopmentExecutableDistribution
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.mbakgun.mj.di

import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.module.dsl.viewModelOf
import org.koin.dsl.module
import ui.MjImagesViewModel

val viewModelModule = module {
viewModel { MjImagesViewModel(get(), get()) }
viewModelOf(::MjImagesViewModel)
}
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M"

#Kotlin
kotlin.code.style=official
kotlin.native.ignoreDisabledTargets=true

#MPP
kotlin.mpp.stability.nowarn=true
Expand Down
23 changes: 7 additions & 16 deletions shared/src/androidInstrumentedTest/kotlin/ui/ScreenTestUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,20 @@ import data.source.remote.model.MjImageResponse
import data.source.remote.model.MjImagesResponse
import di.initKoin
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.context.loadKoinModules
import org.koin.core.module.dsl.viewModelOf
import org.koin.dsl.module
import java.io.IOException

// setAppContext for ImageLoader &-init koin - mock response - return viewModel
fun initAppAndMockViewModel(
context: Context,
dataSource: MjImagesDataSource.Remote? = null
): MjImagesViewModel {
return initKoin {
androidContext(androidContext = context)
if (dataSource != null) {
modules(
module { factory { dataSource } },
module { viewModel { MjImagesViewModel(get(), get()) } }
)
} else {
modules(
module { viewModel { MjImagesViewModel(get(), get()) } }
)
}
}.koin.get()
}
): MjImagesViewModel = initKoin {
androidContext(androidContext = context)
if (dataSource != null) modules(module { factory { dataSource } })
loadKoinModules(module { viewModelOf(::MjImagesViewModel) })
}.koin.get()

class SuccessMjImagesDataSource : MjImagesDataSource.Remote {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.mbakgun.mj.di

import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.module.dsl.viewModelOf
import org.koin.dsl.module
import ui.MjImagesViewModel

val viewModelModule = module {
viewModel { MjImagesViewModel(get(), get()) }
viewModelOf(::MjImagesViewModel)
}
4 changes: 2 additions & 2 deletions wearApp/src/main/java/com/mbakgun/mj/di/ViewModelModule.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.mbakgun.mj.di

import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.module.dsl.viewModelOf
import org.koin.dsl.module
import ui.MjImagesViewModel

val viewModelModule = module {
viewModel { MjImagesViewModel(get(), get()) }
viewModelOf(::MjImagesViewModel)
}

0 comments on commit b2750ae

Please sign in to comment.