Enable AndroidX in Gradle #22
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and Deploy | |
| concurrency: | |
| group: build-and-deploy-${{ github.ref }} | |
| cancel-in-progress: true | |
| on: | |
| push: | |
| branches: [ main, elizaos-challenge ] | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| env: | |
| DOCKER_IMAGE: ${{ secrets.DOCKER_USERNAME }}/miku | |
| NOSANA_API_KEY: ${{ secrets.NOSANA_API_KEY }} | |
| LLM_API_KEY: ${{ secrets.GEMINI_API_KEY }} | |
| NOSANA_API_BASE: https://dashboard.k8s.prd.nos.ci/api | |
| NOSANA_MARKET_FILTER: 3090 | |
| NOSANA_MARKET_TYPE: PREMIUM | |
| jobs: | |
| build-debug-apk: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Java | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: '17' | |
| - name: Set up Gradle | |
| uses: gradle/actions/setup-gradle@v4 | |
| - name: Build debug APK | |
| working-directory: android | |
| run: | | |
| chmod +x gradlew | |
| ./gradlew --no-daemon --console=plain --stacktrace :app:assembleDebug | |
| - name: Normalize APK artifact | |
| run: | | |
| apk_path=$(find android/app/build/outputs/apk/debug -name '*.apk' | head -n 1) | |
| test -n "$apk_path" || { | |
| echo "Debug APK not found"; | |
| exit 1; | |
| } | |
| cp "$apk_path" app-debug.apk | |
| - name: Upload APK artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: android-debug-apk | |
| path: app-debug.apk | |
| build-and-deploy-agent: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKER_USERNAME }} | |
| password: ${{ secrets.DOCKER_PASSWORD }} | |
| - name: Build and push Docker image | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: . | |
| push: true | |
| tags: | | |
| ${{ env.DOCKER_IMAGE }}:latest | |
| ${{ env.DOCKER_IMAGE }}:${{ github.sha }} | |
| cache-from: type=gha | |
| cache-to: type=gha,mode=max | |
| - name: Validate Gemini API key | |
| run: | | |
| test -n "${{ env.LLM_API_KEY }}" || { | |
| echo "GEMINI_API_KEY secret is required for deployment"; | |
| exit 1; | |
| } | |
| - name: Resolve market address | |
| id: resolve-market | |
| run: | | |
| response=$(curl -sS \ | |
| -H "Authorization: Bearer ${{ env.NOSANA_API_KEY }}" \ | |
| "${{ env.NOSANA_API_BASE }}/markets/") | |
| market_address=$(printf '%s' "$response" | jq -r --arg filter "${{ env.NOSANA_MARKET_FILTER }}" --arg marketType "${{ env.NOSANA_MARKET_TYPE }}" ' | |
| map(select( | |
| (.type == $marketType) | |
| and | |
| ( | |
| ((.name // "") | ascii_downcase | contains($filter)) | |
| or | |
| ((.gpu // "") | ascii_downcase | contains($filter)) | |
| ) | |
| )) | |
| | .[0].address // empty | |
| ') | |
| test -n "$market_address" || { | |
| echo "Unable to resolve Nosana ${{ env.NOSANA_MARKET_TYPE }} market address for filter: ${{ env.NOSANA_MARKET_FILTER }}" | |
| echo "$response" | |
| exit 1 | |
| } | |
| echo "market_address=$market_address" >> "$GITHUB_OUTPUT" | |
| - name: Prepare deployment payload | |
| id: payload | |
| run: | | |
| tmp_job_definition=$(mktemp) | |
| jq \ | |
| --arg image "${{ env.DOCKER_IMAGE }}:latest" \ | |
| --arg apiKey "${{ env.LLM_API_KEY }}" \ | |
| --arg baseUrl "https://generativelanguage.googleapis.com/v1beta/openai" \ | |
| --arg smallModel "gemini-2.5-flash" \ | |
| --arg largeModel "gemini-2.5-flash" \ | |
| --arg embeddingModel "gemini-embedding-001" \ | |
| --arg embeddingDimensions "1536" \ | |
| ' | |
| .ops[0].args.image = $image | |
| | .ops[0].args.env.OPENAI_API_KEY = $apiKey | |
| | .ops[0].args.env.OPENAI_BASE_URL = $baseUrl | |
| | .ops[0].args.env.OPENAI_SMALL_MODEL = $smallModel | |
| | .ops[0].args.env.OPENAI_LARGE_MODEL = $largeModel | |
| | .ops[0].args.env.OPENAI_EMBEDDING_MODEL = $embeddingModel | |
| | .ops[0].args.env.OPENAI_EMBEDDING_DIMENSIONS = $embeddingDimensions | |
| ' ./nos_job_def/nosana_eliza_job_definition.json > "$tmp_job_definition" | |
| payload_file=$(mktemp) | |
| jq -n \ | |
| --arg name "miku-${GITHUB_SHA::7}" \ | |
| --arg market "${{ steps.resolve-market.outputs.market_address }}" \ | |
| --argjson timeout 300 \ | |
| --argjson replicas 1 \ | |
| --arg strategy "SIMPLE" \ | |
| --slurpfile job "$tmp_job_definition" \ | |
| '{ | |
| name: $name, | |
| market: $market, | |
| timeout: $timeout, | |
| replicas: $replicas, | |
| strategy: $strategy, | |
| job_definition: $job[0] | |
| }' > "$payload_file" | |
| echo "payload_file=$payload_file" >> "$GITHUB_OUTPUT" | |
| - name: Create deployment | |
| id: create-deployment | |
| run: | | |
| response=$(curl -sS \ | |
| -X POST \ | |
| -H "Authorization: Bearer ${{ env.NOSANA_API_KEY }}" \ | |
| -H "Content-Type: application/json" \ | |
| --data @"${{ steps.payload.outputs.payload_file }}" \ | |
| "${{ env.NOSANA_API_BASE }}/deployments/create") | |
| deployment_id=$(printf '%s' "$response" | jq -r '.id // .deployment.id // empty') | |
| test -n "$deployment_id" || { | |
| echo "Failed to create deployment" | |
| echo "$response" | |
| exit 1 | |
| } | |
| echo "deployment_id=$deployment_id" >> "$GITHUB_OUTPUT" | |
| - name: Start deployment | |
| run: | | |
| curl -sS \ | |
| -X POST \ | |
| -H "Authorization: Bearer ${{ env.NOSANA_API_KEY }}" \ | |
| "${{ env.NOSANA_API_BASE }}/deployments/${{ steps.create-deployment.outputs.deployment_id }}/start" \ | |
| | jq . |