diff --git a/.github/workflows/ai-nightlies.yml b/.github/workflows/ai-nightlies.yml new file mode 100644 index 00000000000..ee33a3f7c52 --- /dev/null +++ b/.github/workflows/ai-nightlies.yml @@ -0,0 +1,66 @@ +name: Firebase AI Nightlies + +on: + schedule: + - cron: 2 7 * * * # Runs automatically once a day + workflow_dispatch: # Allow triggering the workflow manually + +jobs: + nightlies: + name: "Nightlies" + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 2 + submodules: true + + - name: Enable KVM + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + + - name: Set up JDK 17 + uses: actions/setup-java@3a4f6e1af504cf6a31855fa899c6aa5355ba6c12 # v4.7.0 + with: + java-version: 17 + distribution: temurin + cache: gradle + + - name: Add google-services.json + env: + INTEG_TESTS_GOOGLE_SERVICES: ${{ secrets.INTEG_TESTS_GOOGLE_SERVICES }} + run: | + echo $INTEG_TESTS_GOOGLE_SERVICES | base64 -d > google-services.json + - uses: google-github-actions/auth@71f986410dfbc7added4569d411d040a91dc6935 # v2.1.8 + with: + credentials_json: ${{ secrets.GCP_SERVICE_ACCOUNT }} + + - uses: google-github-actions/setup-gcloud@77e7a554d41e2ee56fc945c52dfd3f33d12def9a # v2.1.4 + + - name: Run tests + uses: reactivecircus/android-emulator-runner@62dbb605bba737720e10b196cb4220d374026a6d #v2.33.0 + env: + FIREBASE_CI: 1 + FTL_RESULTS_BUCKET: android-ci + FTL_RESULTS_DIR: ${{ format('logs/{0}/{1}_{2}/artifacts/', github.workflow, github.run_id, github.run_attempt) }} + FIREBASE_APP_CHECK_DEBUG_SECRET: ${{ secrets.FIREBASE_APP_CHECK_DEBUG_SECRET }} + with: + api-level: 31 + arch: x86_64 + ram-size: 4096M + heap-size: 4096M + script: | + adb logcat -v time > logcat.txt & + ./gradlew firebase-ai:connectedCheck withErrorProne -PtargetBackend="prod" + + - name: Upload logs + if: failure() + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + with: + name: logcat.txt + path: logcat.txt + retention-days: 7 + if-no-files-found: ignore diff --git a/firebase-ai/firebase-ai.gradle.kts b/firebase-ai/firebase-ai.gradle.kts index ba7f21b56fb..26bb6c76a66 100644 --- a/firebase-ai/firebase-ai.gradle.kts +++ b/firebase-ai/firebase-ai.gradle.kts @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("firebase-library") id("kotlin-android") + id("copy-google-services") alias(libs.plugins.kotlinx.serialization) } diff --git a/firebase-ai/src/androidTest/kotlin/com/google/firebase/ai/AIModels.kt b/firebase-ai/src/androidTest/kotlin/com/google/firebase/ai/AIModels.kt index 2b151a7b34c..d544f8df4e0 100644 --- a/firebase-ai/src/androidTest/kotlin/com/google/firebase/ai/AIModels.kt +++ b/firebase-ai/src/androidTest/kotlin/com/google/firebase/ai/AIModels.kt @@ -17,7 +17,6 @@ package com.google.firebase.ai import androidx.test.platform.app.InstrumentationRegistry import com.google.firebase.FirebaseApp -import com.google.firebase.FirebaseOptions import com.google.firebase.ai.type.GenerativeBackend class AIModels { @@ -48,15 +47,7 @@ class AIModels { fun setup() { val context = InstrumentationRegistry.getInstrumentation().context - app = - FirebaseApp.initializeApp( - context, - FirebaseOptions.Builder() - .setApiKey(API_KEY) - .setApplicationId(APP_ID) - .setProjectId(PROJECT_ID) - .build() - ) + app = FirebaseApp.initializeApp(context) flash2Model = FirebaseAI.getInstance(app!!, GenerativeBackend.vertexAI()) .generativeModel( diff --git a/firebase-ai/src/androidTest/kotlin/com/google/firebase/ai/ImagenTests.kt b/firebase-ai/src/androidTest/kotlin/com/google/firebase/ai/ImagenTests.kt index dbc35a71dad..218637d4b32 100644 --- a/firebase-ai/src/androidTest/kotlin/com/google/firebase/ai/ImagenTests.kt +++ b/firebase-ai/src/androidTest/kotlin/com/google/firebase/ai/ImagenTests.kt @@ -22,10 +22,13 @@ import com.google.firebase.ai.type.ImagenEditingConfig import com.google.firebase.ai.type.ImagenRawImage import com.google.firebase.ai.type.PublicPreviewAPI import kotlinx.coroutines.runBlocking +import org.junit.Ignore import org.junit.Test @OptIn(PublicPreviewAPI::class) class ImagenTests { + + @Ignore("Currently not supported by backend model") @Test fun testGenerateAndEditImage() { val imageGenerationModel = FirebaseAI.getInstance(app()).imagenModel("imagen-3.0-generate-002")