diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index ad26a9f2220..177a55c5c04 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -29,84 +29,93 @@ runs: echo "::set-output name=SPECS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- specs | wc -l)" echo "::set-output name=COMMON_SPECS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- specs/common | wc -l)" - echo "::set-output name=SEARCH_SPECS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- specs/search | wc -l)" - echo "::set-output name=RECOMMEND_SPECS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- specs/recommend | wc -l)" - echo "::set-output name=QUERY_SUGGESTIONS_SPECS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- specs/query-suggestions | wc -l)" - echo "::set-output name=PERSO_SPECS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- specs/personalization | wc -l)" - echo "::set-output name=INSIGHTS_SPECS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- specs/insights | wc -l)" - echo "::set-output name=ANALYTICS_SPECS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- specs/analytics | wc -l)" - echo "::set-output name=ABTESTING_SPECS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- specs/abtesting | wc -l)" echo "::set-output name=TESTS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- tests | wc -l)" echo "::set-output name=SCRIPTS_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- scripts | wc -l)" echo "::set-output name=JS_CLIENT_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- clients/algoliasearch-client-javascript | wc -l)" - echo "::set-output name=JS_SEARCH_CLIENT_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- clients/algoliasearch-client-javascript/client-search | wc -l)" - echo "::set-output name=JS_RECOMMEND_CLIENT_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- clients/algoliasearch-client-javascript/recommend | wc -l)" - echo "::set-output name=JS_QUERY_SUGGESTIONS_CLIENT_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- clients/algoliasearch-client-javascript/client-query-suggestions | wc -l)" - echo "::set-output name=JS_PERSO_CLIENT_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- clients/algoliasearch-client-javascript/client-personalization | wc -l)" - echo "::set-output name=JS_ANALYTICS_CLIENT_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- clients/algoliasearch-client-javascript/client-analytics | wc -l)" - echo "::set-output name=JS_ABTESTING_CLIENT_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- clients/algoliasearch-client-javascript/client-abtesting | wc -l)" - echo "::set-output name=JS_INSIGHTS_CLIENT_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- clients/algoliasearch-client-javascript/client-insights | wc -l)" echo "::set-output name=JS_TEMPLATE_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- templates/javascript | wc -l)" echo "::set-output name=JAVA_CLIENT_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- clients/algoliasearch-client-java-2 | wc -l)" echo "::set-output name=JAVA_TEMPLATE_CHANGED::$(git diff --shortstat origin/${{ github.base_ref }}..HEAD -- templates/java | wc -l)" + - name: Compute specs matrix + id: spec-matrix + shell: bash + run: | + base_changed=${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 }} + + matrix=$(./scripts/ci/create-spec-matrix.sh $base_changed ${{ github.base_ref }}) + + if [[ $matrix == '{"client":["no-run"]}' ]]; then + run="false" + else + run="true" + fi + + echo "::set-output name=MATRIX::$matrix" + echo "::set-output name=RUN_SPECS::$run" + + - name: Compute the JS client build matrix + id: js-matrix + shell: bash + run: | + base_changed=${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.JS_TEMPLATE_CHANGED > 0 }} + + matrix=$(./scripts/ci/create-client-matrix.sh javascript $base_changed ${{ github.base_ref }}) + + if [[ $matrix == '{"client":["no-run"]}' ]]; then + run="false" + else + run="true" + fi + + echo "::set-output name=MATRIX::$matrix" + echo "::set-output name=RUN_CLIENT::$run" + + - name: Compute the Java client build matrix + id: java-matrix + shell: bash + run: | + base_changed=${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.JAVA_TEMPLATE_CHANGED > 0 }} + + matrix=$(./scripts/ci/create-client-matrix.sh java $base_changed ${{ github.base_ref }}) + + if [[ $matrix == '{"client":["no-run"]}' ]]; then + run="false" + else + run="true" + fi + + echo "::set-output name=MATRIX::$matrix" + echo "::set-output name=RUN_CLIENT::$run" + outputs: - # specs variables - RUN_SPECS_SEARCH: - description: Determine if the `specs_search` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.SEARCH_SPECS_CHANGED > 0 }} - RUN_SPECS_RECOMMEND: - description: Determine if the `specs_recommend` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.RECOMMEND_SPECS_CHANGED > 0 }} - RUN_SPECS_QUERY_SUGGESTIONS: - description: Determine if the `specs_query_suggestions` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.QUERY_SUGGESTIONS_SPECS_CHANGED > 0 }} - RUN_SPECS_PERSO: - description: Determine if the `specs_perso` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.PERSO_SPECS_CHANGED > 0 }} - RUN_SPECS_INSIGHTS: - description: Determine if the `specs_insights` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.INSIGHTS_SPECS_CHANGED > 0 }} - RUN_SPECS_ANALYTICS: - description: Determine if the `specs_analytics` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.ANALYTICS_SPECS_CHANGED > 0 }} - RUN_SPECS_ABTESTING: - description: Determine if the `specs_abtesting` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.ABTESTING_SPECS_CHANGED > 0 }} - - # js client variables - RUN_JS_CLIENT_SEARCH: - description: Determine if the `client_javascript_search` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.SEARCH_SPECS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.JS_SEARCH_CLIENT_CHANGED > 0 || steps.diff.outputs.JS_TEMPLATE_CHANGED > 0 }} - RUN_JS_CLIENT_RECOMMEND: - description: Determine if the `client_javascript_recommend` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.RECOMMEND_SPECS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.JS_RECOMMEND_CLIENT_CHANGED > 0 || steps.diff.outputs.JS_TEMPLATE_CHANGED > 0 }} - RUN_JS_CLIENT_QUERY_SUGGESTIONS: - description: Determine if the `client_javascript_query_suggestions` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.QUERY_SUGGESTIONS_SPECS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.JS_QUERY_SUGGESTIONS_CLIENT_CHANGED > 0 || steps.diff.outputs.JS_TEMPLATE_CHANGED > 0 }} - RUN_JS_CLIENT_PERSO: - description: Determine if the `client_javascript_perso` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.PERSO_SPECS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.JS_PERSO_CLIENT_CHANGED > 0 || steps.diff.outputs.JS_TEMPLATE_CHANGED > 0 }} - RUN_JS_CLIENT_ANALYTICS: - description: Determine if the `client_javascript_analytics` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.ANALYTICS_SPECS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.JS_ANALYTICS_CLIENT_CHANGED > 0 || steps.diff.outputs.JS_TEMPLATE_CHANGED > 0 }} - RUN_JS_CLIENT_ABTESTING: - description: Determine if the `client_javascript_abtesting` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.ABTESTING_SPECS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.JS_ABTESTING_CLIENT_CHANGED > 0 || steps.diff.outputs.JS_TEMPLATE_CHANGED > 0 }} - RUN_JS_CLIENT_INSIGHTS: - description: Determine if the `client_javascript_insights` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.INSIGHTS_SPECS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.JS_INSIGHTS_CLIENT_CHANGED > 0 || steps.diff.outputs.JS_TEMPLATE_CHANGED > 0 }} - - # java client variables - RUN_JAVA_CLIENT: - description: Determine if the `client_java_*` job should run - value: ${{ github.ref == 'refs/heads/main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.COMMON_SPECS_CHANGED > 0 || steps.diff.outputs.SEARCH_SPECS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 || steps.diff.outputs.JAVA_CLIENT_CHANGED > 0 || steps.diff.outputs.JAVA_TEMPLATE_CHANGED > 0 }} - - # cts variables + RUN_SPECS: + description: Whether to run specs or not + value: ${{ steps.spec-matrix.outputs.RUN_SPECS }} + + SPECS_MATRIX: + description: Generate the matrix for specs + value: ${{ steps.spec-matrix.outputs.MATRIX }} + + RUN_JS: + description: Whether to run js client or not + value: ${{ steps.js-matrix.outputs.RUN_CLIENT }} + + JS_MATRIX: + description: Generate the matrix for the Javascript client + value: ${{ steps.js-matrix.outputs.MATRIX }} + + RUN_JAVA: + description: Whether to run java client or not + value: ${{ steps.java-matrix.outputs.RUN_CLIENT }} + + JAVA_MATRIX: + description: Generate the matrix for the Java client + value: ${{ steps.java-matrix.outputs.MATRIX }} + RUN_CTS: description: Determine if the `cts` job should run value: ${{ github.ref_name == 'main' || steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.SPECS_CHANGED > 0 || steps.diff.outputs.TESTS_CHANGED > 0 || steps.diff.outputs.JS_CLIENT_CHANGED > 0 || steps.diff.outputs.JS_TEMPLATE_CHANGED > 0 || steps.diff.outputs.JAVA_CLIENT_CHANGED > 0 || steps.diff.outputs.JAVA_TEMPLATE_CHANGED > 0 }} diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 9b5dd854365..e417cb0d5c1 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -25,318 +25,74 @@ jobs: - name: Lint GitHub actions run: yarn eslint --ext=yml .github/actions .github/workflows + outputs: - RUN_SPECS_SEARCH: ${{ steps.setup.outputs.RUN_SPECS_SEARCH }} - RUN_SPECS_RECOMMEND: ${{ steps.setup.outputs.RUN_SPECS_RECOMMEND }} - RUN_SPECS_QUERY_SUGGESTIONS: ${{ steps.setup.outputs.RUN_SPECS_QUERY_SUGGESTIONS }} - RUN_SPECS_PERSO: ${{ steps.setup.outputs.RUN_SPECS_PERSO }} - RUN_SPECS_INSIGHTS: ${{ steps.setup.outputs.RUN_SPECS_INSIGHTS }} - RUN_SPECS_ANALYTICS: ${{ steps.setup.outputs.RUN_SPECS_ANALYTICS }} - RUN_SPECS_ABTESTING: ${{ steps.setup.outputs.RUN_SPECS_ABTESTING }} + RUN_SPECS: ${{ steps.setup.outputs.RUN_SPECS }} + SPECS_MATRIX: ${{ steps.setup.outputs.SPECS_MATRIX }} - RUN_JS_CLIENT_SEARCH: ${{ steps.setup.outputs.RUN_JS_CLIENT_SEARCH }} - RUN_JS_CLIENT_RECOMMEND: ${{ steps.setup.outputs.RUN_JS_CLIENT_RECOMMEND }} - RUN_JS_CLIENT_QUERY_SUGGESTIONS: ${{ steps.setup.outputs.RUN_JS_CLIENT_QUERY_SUGGESTIONS }} - RUN_JS_CLIENT_PERSO: ${{ steps.setup.outputs.RUN_JS_CLIENT_PERSO }} - RUN_JS_CLIENT_ANALYTICS: ${{ steps.setup.outputs.RUN_JS_CLIENT_ANALYTICS }} - RUN_JS_CLIENT_ABTESTING: ${{ steps.setup.outputs.RUN_JS_CLIENT_ABTESTING }} - RUN_JS_CLIENT_INSIGHTS: ${{ steps.setup.outputs.RUN_JS_CLIENT_INSIGHTS }} + RUN_JS: ${{ steps.setup.outputs.RUN_JS }} + JS_MATRIX: ${{ steps.setup.outputs.JS_MATRIX }} - RUN_JAVA_CLIENT: ${{ steps.setup.outputs.RUN_JAVA_CLIENT }} + RUN_JAVA: ${{ steps.setup.outputs.RUN_JAVA }} + JAVA_MATRIX: ${{ steps.setup.outputs.JAVA_MATRIX }} RUN_CTS: ${{ steps.setup.outputs.RUN_CTS }} - specs_search: - runs-on: ubuntu-20.04 - needs: setup - if: ${{ always() && needs.setup.outputs.RUN_SPECS_SEARCH == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Checking search specs - run: yarn build:specs search - - - name: Lint search specs - run: yarn eslint --ext=yml specs/search - - specs_recommend: + specs: runs-on: ubuntu-20.04 needs: setup - if: ${{ always() && needs.setup.outputs.RUN_SPECS_RECOMMEND == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Checking recommend specs - run: yarn build:specs recommend - - - name: Lint recommend specs - run: yarn eslint --ext=yml specs/recommend - - specs_query_suggestions: - runs-on: ubuntu-20.04 - needs: setup - if: ${{ always() && needs.setup.outputs.RUN_SPECS_QUERY_SUGGESTIONS == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Checking query-suggestions specs - run: yarn build:specs query-suggestions - - - name: Lint query-suggestions specs - run: yarn eslint --ext=yml specs/query-suggestions - - specs_perso: - runs-on: ubuntu-20.04 - needs: setup - if: ${{ always() && needs.setup.outputs.RUN_SPECS_PERSO == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Checking personalization specs - run: yarn build:specs personalization - - - name: Lint personalization specs - run: yarn eslint --ext=yml specs/personalization - - specs_analytics: - runs-on: ubuntu-20.04 - needs: setup - if: ${{ always() && needs.setup.outputs.RUN_SPECS_ANALYTICS == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Checking analytics specs - run: yarn build:specs analytics - - - name: Lint analytics specs - run: yarn eslint --ext=yml specs/analytics - - specs_abtesting: - runs-on: ubuntu-20.04 - needs: setup - if: ${{ always() && needs.setup.outputs.RUN_SPECS_ABTESTING == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Checking abtesting specs - run: yarn build:specs abtesting - - - name: Lint abtesting specs - run: yarn eslint --ext=yml specs/abtesting - - specs_insights: - runs-on: ubuntu-20.04 - needs: setup - if: ${{ always() && needs.setup.outputs.RUN_SPECS_INSIGHTS == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Checking insights specs - run: yarn build:specs insights - - - name: Lint insights specs - run: yarn eslint --ext=yml specs/insights - - client_javascript_search: - runs-on: ubuntu-20.04 - needs: [specs_search] - if: ${{ always() && needs.setup.outputs.RUN_JS_CLIENT_SEARCH == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Cache search client - id: cache - uses: actions/cache@v2 - with: - path: /home/runner/work/api-clients-automation/api-clients-automation/clients/algoliasearch-client-javascript/client-search/dist - key: ${{ runner.os }}-js-client-search-${{ hashFiles('clients/algoliasearch-client-javascript/client-search/**') }} - - - name: Generate search client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn generate javascript search - - - name: Build search client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn build:clients javascript search - - client_javascript_recommend: - runs-on: ubuntu-20.04 - needs: [specs_recommend] - if: ${{ always() && needs.setup.outputs.RUN_JS_CLIENT_RECOMMEND == 'true' }} + if: ${{ always() && needs.setup.outputs.RUN_SPECS == 'true' }} + strategy: + matrix: ${{ fromJSON(needs.setup.outputs.SPECS_MATRIX) }} steps: - uses: actions/checkout@v2 - name: Restore cache uses: ./.github/actions/cache - - name: Cache recommend client - id: cache - uses: actions/cache@v2 - with: - path: /home/runner/work/api-clients-automation/api-clients-automation/clients/algoliasearch-client-javascript/recommend/dist - key: ${{ runner.os }}-js-client-recommend-${{ hashFiles('clients/algoliasearch-client-javascript/recommend/**') }} - - - name: Generate recommend client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn generate javascript recommend + - name: Checking ${{ matrix.client }} specs + run: yarn build:specs ${{ matrix.client }} - - name: Build recommend client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn build:clients javascript recommend + - name: Lint ${{ matrix.client }} specs + run: yarn eslint --ext=yml specs/${{ matrix.client }} - client_javascript_query_suggestions: + client_javascript: runs-on: ubuntu-20.04 - needs: [specs_query_suggestions] - if: ${{ always() && needs.setup.outputs.RUN_JS_CLIENT_QUERY_SUGGESTIONS == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Cache query-suggestions client - id: cache - uses: actions/cache@v2 - with: - path: /home/runner/work/api-clients-automation/api-clients-automation/clients/algoliasearch-client-javascript/client-query-suggestions/dist - key: ${{ runner.os }}-js-client-query-suggestions-${{ hashFiles('clients/algoliasearch-client-javascript/client-query-suggestions/**') }} - - - name: Generate query-suggestions client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn generate javascript query-suggestions - - - name: Build query-suggestions client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn build:clients javascript query-suggestions - - client_javascript_perso: - runs-on: ubuntu-20.04 - needs: [specs_perso] - if: ${{ always() && needs.setup.outputs.RUN_JS_CLIENT_PERSO == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Cache personalization client - id: cache - uses: actions/cache@v2 - with: - path: /home/runner/work/api-clients-automation/api-clients-automation/clients/algoliasearch-client-javascript/client-personalization/dist - key: ${{ runner.os }}-js-client-personalization-${{ hashFiles('clients/algoliasearch-client-javascript/client-personalization/**') }} - - - name: Generate personalization client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn generate javascript personalization - - - name: Build personalization client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn build:clients javascript personalization - - client_javascript_analytics: - runs-on: ubuntu-20.04 - needs: [specs_analytics] - if: ${{ always() && needs.setup.outputs.RUN_JS_CLIENT_ANALYTICS == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Cache analytics client - id: cache - uses: actions/cache@v2 - with: - path: /home/runner/work/api-clients-automation/api-clients-automation/clients/algoliasearch-client-javascript/client-analytics/dist - key: ${{ runner.os }}-js-client-analytics-${{ hashFiles('clients/algoliasearch-client-javascript/client-analytics/**') }} - - - name: Generate analytics client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn generate javascript analytics - - - name: Build analytics client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn build:clients javascript analytics - - client_javascript_abtesting: - runs-on: ubuntu-20.04 - needs: [specs_abtesting] - if: ${{ always() && needs.setup.outputs.RUN_JS_CLIENT_ABTESTING == 'true' }} - steps: - - uses: actions/checkout@v2 - - - name: Restore cache - uses: ./.github/actions/cache - - - name: Cache abtesting client - id: cache - uses: actions/cache@v2 - with: - path: /home/runner/work/api-clients-automation/api-clients-automation/clients/algoliasearch-client-javascript/client-abtesting/dist - key: ${{ runner.os }}-js-client-abtesting-${{ hashFiles('clients/algoliasearch-client-javascript/client-abtesting/**') }} - - - name: Generate abtesting client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn generate javascript abtesting - - - name: Build abtesting client - if: steps.cache.outputs.cache-hit != 'true' - run: yarn build:clients javascript abtesting - - client_javascript_insights: - runs-on: ubuntu-20.04 - needs: [specs_insights] - if: ${{ always() && needs.setup.outputs.RUN_JS_CLIENT_INSIGHTS == 'true' }} + needs: + - setup + - specs + if: ${{ always() && needs.setup.outputs.RUN_JS == 'true' }} + strategy: + matrix: ${{ fromJSON(needs.setup.outputs.JS_MATRIX) }} steps: - uses: actions/checkout@v2 - name: Restore cache uses: ./.github/actions/cache - - name: Cache insights client + - name: Cache ${{ matrix.client.name }} client id: cache uses: actions/cache@v2 with: - path: /home/runner/work/api-clients-automation/api-clients-automation/clients/algoliasearch-client-javascript/client-insights/dist - key: ${{ runner.os }}-js-client-insights-${{ hashFiles('clients/algoliasearch-client-javascript/client-insights/**') }} + path: '/home/runner/work/api-clients-automation/api-clients-automation/${{ matrix.client.folder }}/dist' + key: ${{ runner.os }}-js-client-${{ matrix.client.name }}-${{ hashFiles(format('{0}/**', matrix.client.folder)) }} - - name: Generate insights client + - name: Generate ${{ matrix.client.name }} client if: steps.cache.outputs.cache-hit != 'true' - run: yarn generate javascript insights + run: yarn generate javascript ${{ matrix.client.name }} - - name: Build insights client + - name: Build ${{ matrix.client.name }} client if: steps.cache.outputs.cache-hit != 'true' - run: yarn build:clients javascript insights + run: yarn build:clients javascript ${{ matrix.client.name }} - client_java_search: + client_java: runs-on: ubuntu-20.04 - needs: [specs_search] - if: ${{ always() && needs.setup.outputs.RUN_JAVA_CLIENT == 'true' }} + needs: + - setup + - specs + if: ${{ always() && needs.setup.outputs.RUN_JAVA == 'true' }} + strategy: + matrix: ${{ fromJSON(needs.setup.outputs.JAVA_MATRIX) }} steps: - uses: actions/checkout@v2 @@ -345,33 +101,26 @@ jobs: with: job: java - - name: Cache built clients + - name: Cache ${{ matrix.client.name }} client id: cache uses: actions/cache@v2 with: - path: /home/runner/work/api-clients-automation/api-clients-automation/clients/algoliasearch-client-java-2/target - key: ${{ runner.os }}-java-client-${{ hashFiles('clients/algoliasearch-client-java-2/**') }} + path: '/home/runner/work/api-clients-automation/api-clients-automation/${{ matrix.client.folder }}/dist' + key: ${{ runner.os }}-java-client-${{ matrix.client.name }}-${{ hashFiles(format('{0}/**', matrix.client.folder)) }} - - name: Generate search client + - name: Generate ${{ matrix.client.name }} client if: steps.cache.outputs.cache-hit != 'true' - run: yarn generate java search + run: yarn generate java ${{ matrix.client.name }} - - name: Build search client + - name: Build ${{ matrix.client.name }} client if: steps.cache.outputs.cache-hit != 'true' - run: yarn build:clients java search + run: yarn build:clients java ${{ matrix.client.name }} cts: runs-on: ubuntu-20.04 needs: - - client_javascript_search - - client_javascript_recommend - - client_javascript_query_suggestions - - client_javascript_perso - - client_javascript_analytics - - client_javascript_abtesting - - client_javascript_insights - - client_java_search - + - client_javascript + - client_java if: ${{ always() && needs.setup.outputs.RUN_CTS == 'true' }} steps: - uses: actions/checkout@v2 diff --git a/scripts/ci/create-client-matrix.sh b/scripts/ci/create-client-matrix.sh new file mode 100755 index 00000000000..a927606c044 --- /dev/null +++ b/scripts/ci/create-client-matrix.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +LANGUAGE=$1 +BASE_CHANGED=$2 +BASE_BRANCH=$3 + +clients=$(cat openapitools.json | jq --arg lang $LANGUAGE -c '."generator-cli".generators + | with_entries( + if (.key | test($lang + "-.*")) then + ({key:.key,value:.value}) + else + empty + end + ) + | to_entries + | map({ + name:.key | sub($lang + "-";""), + folder:.value.output | sub("#{cwd}/";"") + }) + | .[]') + +to_test='{"client": []}' +for pair in $clients; do + name=$(echo $pair | jq '.name') + folder=$(echo $pair | jq '.folder') + spec_changed=$(git diff --shortstat origin/$BASE_BRANCH..HEAD -- specs/$name | wc -l) + client_changed=$(git diff --shortstat origin/$BASE_BRANCH..HEAD -- $folder | wc -l) + if [[ $BASE_CHANGED || $spec_changed > 0 || $client_changed > 0 ]]; then + to_test=$(echo $to_test | jq --argjson pair $pair '.client |= .+ [$pair]') + fi +done + +# Convert the array to json for the matrix +if [[ $(echo $to_test | jq '.client | length') == 0 ]]; then + # client cannot be empty or the matrix will fail + matrix='{"client":["no-run"]}' +else + matrix=$(echo $to_test | jq -c) +fi + +echo $matrix diff --git a/scripts/ci/create-spec-matrix.sh b/scripts/ci/create-spec-matrix.sh new file mode 100755 index 00000000000..cff3aeb123e --- /dev/null +++ b/scripts/ci/create-spec-matrix.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +BASE_CHANGED=$1 +BASE_BRANCH=$2 + +specs='{"client":[]}' +generators=( $(cat openapitools.json | jq '."generator-cli".generators' | jq -r 'keys[]') ) + +for generator in "${generators[@]}"; do + client=${generator#*-} + if [[ ! ${specs[*]} =~ $client ]]; then + changed=$(git diff --shortstat origin/$BASE_BRANCH..HEAD -- specs/$client | wc -l) + if [[ $BASE_CHANGED || $changed > 0 ]]; then + specs=$(echo $specs | jq --arg client $client '.client |= .+ [$client]') + fi + fi +done + +# Convert the array to json for the matrix +if [[ $(echo $specs | jq '.client | length') == 0 ]]; then + # client cannot be empty or the matrix will fail + matrix='{"client":["no-run"]}' +else + matrix=$(echo $specs | jq -c) +fi + +echo $matrix