Fast CI/CD build #45
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: Fast CI/CD build | |
| on: | |
| schedule: | |
| # Combined schedule covering both EST and CET working hours | |
| # Morning/Early builds | |
| - cron: '30 6 * * 1-5' # 7:30 AM CET / 1:30 AM EST | |
| - cron: '30 11 * * 1-5' # 12:30 PM CET / 6:30 AM EST | |
| # Midday builds | |
| - cron: '30 16 * * 1-5' # 7:30 PM CET / 11:30 AM EST | |
| # Afternoon/Evening builds | |
| - cron: '30 21 * * 1-5' # 10:30 PM CET / 4:30 PM EST | |
| workflow_dispatch: | |
| jobs: | |
| build-all: | |
| name: Build all modules | |
| runs-on: ubuntu-latest | |
| if: ${{ github.repository_owner == 'spring-projects' }} | |
| steps: | |
| - name: Checkout source code | |
| uses: actions/checkout@v4 | |
| - name: Free Disk Space | |
| uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 | |
| with: | |
| large-packages: false | |
| docker-images: false | |
| - name: Set up JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '25' # This action actually installs several and the toolchains plugin in maven will select 25 alright, but this makes 25 the 'default' | |
| distribution: 'temurin' | |
| cache: 'maven' | |
| - name: Build all modules with unit tests | |
| run: | | |
| ./mvnw --batch-mode -ntp --update-snapshots clean install | |
| - name: Upload Maven repository | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: maven-repo | |
| path: ~/.m2/repository | |
| retention-days: 1 | |
| test-ollama: | |
| name: Test Ollama | |
| runs-on: ubuntu-latest | |
| needs: build-all | |
| if: ${{ github.repository_owner == 'spring-projects' }} | |
| services: | |
| ollama: | |
| image: ollama/ollama:latest | |
| ports: | |
| - 11434:11434 | |
| env: | |
| OLLAMA_WITH_REUSE: true | |
| OLLAMA_AUTOCONF_TESTS_ENABLED: "true" | |
| steps: | |
| - name: Checkout source code | |
| uses: actions/checkout@v4 | |
| - name: Set up JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '25' # This action actually installs several and the toolchains plugin in maven will select 25 alright, but this makes 25 the 'default' | |
| distribution: 'temurin' | |
| cache: 'maven' | |
| - name: Download Maven repository | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: maven-repo | |
| path: ~/.m2/repository | |
| - name: Configure Testcontainers | |
| run: | | |
| echo "testcontainers.reuse.enable=true" > $HOME/.testcontainers.properties | |
| - name: Test Ollama modules | |
| env: | |
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
| SPRING_AI_OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
| run: | | |
| ./mvnw --batch-mode -ntp --no-snapshot-updates \ | |
| -pl models/spring-ai-ollama,auto-configurations/models/spring-ai-autoconfigure-model-ollama \ | |
| -Pci-fast-integration-tests \ | |
| -Dfailsafe.rerunFailingTestsCount=3 \ | |
| verify | |
| test-openai: | |
| name: Test OpenAI | |
| runs-on: ubuntu-latest | |
| needs: build-all | |
| if: ${{ github.repository_owner == 'spring-projects' }} | |
| steps: | |
| - name: Checkout source code | |
| uses: actions/checkout@v4 | |
| - name: Set up JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '25' # This action actually installs several and the toolchains plugin in maven will select 25 alright, but this makes 25 the 'default' | |
| distribution: 'temurin' | |
| cache: 'maven' | |
| - name: Download Maven repository | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: maven-repo | |
| path: ~/.m2/repository | |
| - name: Configure Testcontainers | |
| run: | | |
| echo "testcontainers.reuse.enable=true" > $HOME/.testcontainers.properties | |
| - name: Test OpenAI modules | |
| env: | |
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
| SPRING_AI_OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
| run: | | |
| ./mvnw --batch-mode -ntp --no-snapshot-updates \ | |
| -pl models/spring-ai-openai,auto-configurations/models/spring-ai-autoconfigure-model-openai \ | |
| -Pci-fast-integration-tests \ | |
| -Dfailsafe.rerunFailingTestsCount=3 \ | |
| verify | |
| test-remaining: | |
| name: Test Remaining (MCP, Google GenAI, Chroma, PgVector) | |
| runs-on: ubuntu-latest | |
| needs: build-all | |
| if: ${{ github.repository_owner == 'spring-projects' }} | |
| steps: | |
| - name: Checkout source code | |
| uses: actions/checkout@v4 | |
| - name: Set up JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '25' # This action actually installs several and the toolchains plugin in maven will select 25 alright, but this makes 25 the 'default' | |
| distribution: 'temurin' | |
| cache: 'maven' | |
| - name: Download Maven repository | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: maven-repo | |
| path: ~/.m2/repository | |
| - name: Configure Testcontainers | |
| run: | | |
| echo "testcontainers.reuse.enable=true" > $HOME/.testcontainers.properties | |
| - name: Test remaining modules | |
| env: | |
| OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
| SPRING_AI_OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
| run: | | |
| ./mvnw --batch-mode -ntp --no-snapshot-updates \ | |
| -pl models/spring-ai-google-genai,auto-configurations/models/spring-ai-autoconfigure-model-google-genai,mcp/common,mcp/mcp-annotations-spring,auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common,auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient,auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux,auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common,auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc,auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux,vector-stores/spring-ai-chroma-store,vector-stores/spring-ai-pgvector-store,spring-ai-integration-tests \ | |
| -Pci-fast-integration-tests \ | |
| -Dfailsafe.rerunFailingTestsCount=3 \ | |
| verify | |
| generate-artifacts: | |
| name: Generate documentation artifacts | |
| runs-on: ubuntu-latest | |
| needs: [build-all, test-ollama, test-openai, test-remaining] | |
| if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'spring-projects' }} | |
| steps: | |
| - name: Checkout source code | |
| uses: actions/checkout@v4 | |
| - name: Set up JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '25' | |
| distribution: 'temurin' | |
| cache: 'maven' | |
| - name: Download Maven repository | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: maven-repo | |
| path: ~/.m2/repository | |
| - name: Generate Java docs | |
| run: ./mvnw --batch-mode -ntp javadoc:aggregate | |
| - name: Generate assembly | |
| working-directory: spring-ai-docs | |
| run: ../mvnw --batch-mode -ntp assembly:single | |
| - name: Upload Javadoc | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: javadoc | |
| path: target/site/apidocs | |
| retention-days: 1 | |
| - name: Upload assembly | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: assembly | |
| path: spring-ai-docs/target/*.zip | |
| retention-days: 1 | |
| deploy-artifactory: | |
| name: Deploy to Artifactory | |
| runs-on: ubuntu-latest | |
| needs: [build-all, test-ollama, test-openai, test-remaining] | |
| if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'spring-projects' }} | |
| steps: | |
| - name: Checkout source code | |
| uses: actions/checkout@v4 | |
| - name: Set up JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '25' | |
| distribution: 'temurin' | |
| cache: 'maven' | |
| - name: Download Maven repository | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: maven-repo | |
| path: ~/.m2/repository | |
| - name: Deploy to Artifactory | |
| env: | |
| ARTIFACTORY_USERNAME: ${{ secrets.ARTIFACTORY_USERNAME }} | |
| ARTIFACTORY_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }} | |
| run: | | |
| ./mvnw -s settings.xml --batch-mode -ntp -DskipTests deploy | |
| deploy-docs: | |
| name: Deploy documentation | |
| runs-on: ubuntu-latest | |
| needs: [generate-artifacts] | |
| if: ${{ github.ref == 'refs/heads/main' && github.repository_owner == 'spring-projects' }} | |
| steps: | |
| - name: Checkout source code | |
| uses: actions/checkout@v4 | |
| - name: Set up JDK | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '25' | |
| distribution: 'temurin' | |
| cache: 'maven' | |
| - name: Download Javadoc | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: javadoc | |
| path: target/site/apidocs | |
| - name: Download assembly | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: assembly | |
| path: spring-ai-docs/target | |
| - name: Capture project version | |
| run: echo PROJECT_VERSION=$(./mvnw help:evaluate -Dexpression=project.version --quiet -DforceStdout) >> $GITHUB_ENV | |
| - name: Setup SSH key | |
| env: | |
| DOCS_SSH_KEY: ${{ secrets.DOCS_SSH_KEY }} | |
| DOCS_SSH_HOST_KEY: ${{ secrets.DOCS_SSH_HOST_KEY }} | |
| run: | | |
| mkdir "$HOME/.ssh" | |
| echo "$DOCS_SSH_KEY" > "$HOME/.ssh/key" | |
| chmod 600 "$HOME/.ssh/key" | |
| echo "$DOCS_SSH_HOST_KEY" > "$HOME/.ssh/known_hosts" | |
| - name: Deploy docs | |
| env: | |
| DOCS_HOST: ${{ secrets.DOCS_HOST }} | |
| DOCS_PATH: ${{ secrets.DOCS_PATH }} | |
| DOCS_USERNAME: ${{ secrets.DOCS_USERNAME }} | |
| working-directory: spring-ai-docs/target | |
| run: | | |
| unzip spring-ai-$PROJECT_VERSION-docs.zip | |
| ssh -i $HOME/.ssh/key $DOCS_USERNAME@$DOCS_HOST "cd $DOCS_PATH && mkdir -p $PROJECT_VERSION" | |
| scp -i $HOME/.ssh/key -r api $DOCS_USERNAME@$DOCS_HOST:$DOCS_PATH/$PROJECT_VERSION |