chore(ci): use setup-gradle to handle cache #13649
Workflow file for this run
This file contains 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: Checks | |
on: | |
pull_request: | |
types: [opened, synchronize] | |
push: | |
branches: | |
- main | |
merge_group: | |
types: [checks_requested] | |
concurrency: | |
group: ${{ github.ref }} | |
cancel-in-progress: true | |
# Uncomment the line below to enable artifacts debugging | |
# env: | |
# ACTIONS_RUNNER_DEBUG: true | |
jobs: | |
setup: | |
runs-on: ubuntu-22.04 | |
timeout-minutes: 10 | |
steps: | |
- name: debugging - dump GitHub context | |
env: | |
GITHUB_CONTEXT: ${{ toJSON(github) }} | |
run: echo "$GITHUB_CONTEXT" | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Setup | |
id: setup | |
uses: ./.github/actions/setup | |
# Computing jobs that should run | |
- name: Setting diff outputs variables | |
id: diff | |
shell: bash | |
run: | | |
previousCommit=${{ github.event.before }} | |
baseRef=${{ github.base_ref }} | |
origin=$( [[ -z $baseRef ]] && echo $previousCommit || echo "origin/$baseRef" ) | |
yarn workspace scripts setRunVariables "$origin" | |
- name: Compute specs matrix | |
id: spec-matrix | |
shell: bash | |
run: yarn workspace scripts createMatrix ${{ steps.diff.outputs.ORIGIN_BRANCH }} | |
- name: Compute the client codegen matrix | |
id: gen-matrix | |
shell: bash | |
run: yarn workspace scripts createMatrix ${{ steps.diff.outputs.ORIGIN_BRANCH }} clients | |
- name: check that custom actions are built | |
run: | | |
yarn workspace scripts build:actions | |
diff=$(git status --porcelain ./scripts/ci/actions | wc -l) | |
if [[ $diff > 0 ]]; then | |
echo "Build the custom github actions by running `yarn workspace scripts build:actions`" | |
fi | |
exit $diff | |
- name: Lint GitHub actions | |
run: yarn github-actions:lint | |
- name: Lint generators | |
run: | | |
yarn cli format java generators | |
diff=$(git status --porcelain ./generators | wc -l) | |
if [[ $diff > 0 ]]; then | |
echo "Format the generators folder by running 'apic format java generators'" | |
fi | |
exit $diff | |
- name: Lint json files | |
run: | | |
yarn eslint --ext=json . | |
echo 'Use yarn fix:json to fix issues' | |
outputs: | |
RUN_SCRIPTS: ${{ steps.diff.outputs.GITHUB_ACTIONS_CHANGED > 0 || steps.diff.outputs.SCRIPTS_CHANGED > 0 }} | |
SPECS_MATRIX: ${{ steps.spec-matrix.outputs.MATRIX }} | |
RUN_GEN: ${{ steps.gen-matrix.outputs.RUN_GEN }} | |
GEN_MATRIX: ${{ steps.gen-matrix.outputs.GEN_MATRIX }} | |
JAVASCRIPT_DATA: ${{ steps.gen-matrix.outputs.JAVASCRIPT_DATA }} | |
RUN_GEN_JAVASCRIPT: ${{ steps.gen-matrix.outputs.RUN_GEN_JAVASCRIPT }} | |
scripts: | |
runs-on: ubuntu-22.04 | |
timeout-minutes: 10 | |
needs: setup | |
if: ${{ needs.setup.outputs.RUN_SCRIPTS == 'true' }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup | |
uses: ./.github/actions/setup | |
with: | |
type: minimal | |
- name: Check script linting | |
run: yarn scripts:lint | |
- name: Test scripts | |
run: yarn scripts:test | |
- name: Test custom eslint plugin | |
run: yarn workspace eslint-plugin-automation-custom test | |
specs: | |
runs-on: ubuntu-22.04 | |
timeout-minutes: 10 | |
needs: setup | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Cache bundled specs | |
id: cache | |
uses: actions/cache@v4 | |
with: | |
key: ${{ fromJSON(needs.setup.outputs.SPECS_MATRIX).cacheKey }} | |
path: ${{ fromJSON(needs.setup.outputs.SPECS_MATRIX).bundledPath }} | |
- name: Setup | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
uses: ./.github/actions/setup | |
with: | |
type: minimal | |
- name: Building specs | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
run: yarn cli build specs ${{ fromJSON(needs.setup.outputs.SPECS_MATRIX).toRun }} | |
- name: Store bundled specs | |
uses: actions/upload-artifact@v4 | |
with: | |
if-no-files-found: error | |
name: specs | |
path: ${{ fromJSON(needs.setup.outputs.SPECS_MATRIX).bundledPath }} | |
client_javascript_utils: | |
timeout-minutes: 10 | |
runs-on: ubuntu-22.04 | |
needs: setup | |
if: ${{ needs.setup.outputs.RUN_GEN_JAVASCRIPT == 'true' }} | |
strategy: | |
matrix: | |
client: | |
- client-common | |
- requester-browser-xhr | |
- requester-node-http | |
- requester-fetch | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Cache '${{ matrix.client }}' client folder | |
if: ${{ github.ref != 'refs/heads/main' }} | |
id: cache | |
uses: actions/cache@v4 | |
with: | |
key: | | |
${{ matrix.client }}-${{ env.CACHE_VERSION }}-${{ hashFiles( | |
format('clients/algoliasearch-client-javascript/packages/{0}/**', matrix.client), | |
'clients/algoliasearch-client-javascript/yarn.lock' | |
)}} | |
path: clients/algoliasearch-client-javascript/packages/${{ matrix.client }} | |
- name: Remove generated clients | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
run: cd clients/algoliasearch-client-javascript/packages && ls | grep -v -E "(client-common|requester-*)" | xargs rm -rf | |
- name: Setup | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
uses: ./.github/actions/setup | |
with: | |
type: minimal | |
language: javascript | |
- name: Build '${{ matrix.client }}' client | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
run: cd clients/algoliasearch-client-javascript && yarn build:many @algolia/${{ matrix.client }} | |
- name: Run tests for '${{ matrix.client }}' | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
run: cd clients/algoliasearch-client-javascript && yarn workspace @algolia/${{ matrix.client }} test | |
client_gen_javascript: | |
timeout-minutes: 10 | |
runs-on: ubuntu-22.04 | |
needs: | |
- setup | |
- client_javascript_utils | |
- specs | |
- scripts | |
if: | | |
always() && | |
needs.setup.outputs.RUN_GEN_JAVASCRIPT == 'true' && | |
!contains(needs.*.result, 'cancelled') && | |
!contains(needs.*.result, 'failure') | |
env: | |
ALGOLIA_APPLICATION_ID: ${{ secrets.ALGOLIA_APPLICATION_ID }} | |
ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Cache clients folder | |
if: ${{ github.ref != 'refs/heads/main' }} | |
id: cache | |
uses: actions/cache@v4 | |
with: | |
key: ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).cacheKey }} | |
path: ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).path }} | |
- name: Download specs artifacts | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
uses: ./scripts/ci/actions/restore-artifacts | |
with: | |
type: specs | |
- name: Remove generated clients | |
if: ${{ steps.cache.outputs.cache-hit != 'true' && startsWith(env.head_ref, 'chore/prepare-release-') }} | |
run: | | |
cd clients/algoliasearch-client-javascript/packages | |
ls | grep -v -E "(client-common|requester-*|algoliasearch)" | xargs rm -rf | |
cd algoliasearch | |
ls | grep -v -E "(__tests__|jest.config.ts)" | xargs rm -rf | |
- name: Setup | |
uses: ./.github/actions/setup | |
with: | |
language: javascript | |
- name: Generate clients | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
run: yarn cli generate javascript ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).toRun }} | |
- name: Update `yarn.lock` for JavaScript | |
run: cd clients/algoliasearch-client-javascript && YARN_ENABLE_HARDENED_MODE=0 YARN_ENABLE_IMMUTABLE_INSTALLS=false yarn install | |
- name: Build clients | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
run: ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).buildCommand }} | |
- name: Test JavaScript bundle size | |
if: ${{ steps.cache.outputs.cache-hit != 'true' && startsWith(env.head_ref, 'chore/prepare-release-') }} | |
run: cd clients/algoliasearch-client-javascript && yarn test:size | |
- name: Run JavaScript 'algoliasearch' client tests | |
if: ${{ steps.cache.outputs.cache-hit != 'true' && contains(fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).toRun,'algoliasearch') }} | |
run: cd clients/algoliasearch-client-javascript && yarn workspace algoliasearch test | |
- name: Remove previous CTS output | |
run: rm -rf ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).testsToDelete }} | |
- name: Generate CTS | |
run: yarn cli cts generate javascript ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).toRun }} | |
# JavaScript test deps (needs to be cached because they are huge and inefficient) | |
- name: Get yarn js test cache directory path | |
shell: bash | |
id: yarn-cache-dir-tests | |
run: echo "dir=$(cd tests/output/javascript && yarn config get cacheFolder)" >> $GITHUB_OUTPUT | |
- name: Restore Yarn js tests | |
uses: actions/cache@v4 | |
with: | |
path: ${{ steps.yarn-cache-dir-tests.outputs.dir || 'tests/output/javascript/.yarn/cache' }} | |
# let yarn handle the cache hash | |
key: yarn-cache-tests-${{ env.CACHE_VERSION }} | |
- name: Cache js tests node modules | |
uses: actions/cache@v4 | |
with: | |
path: tests/output/javascript/node_modules | |
key: node-modules-tests-${{ env.CACHE_VERSION }}-${{ hashFiles('tests/output/javascript/yarn.lock') }} | |
- name: Run CTS | |
run: yarn cli cts run javascript | |
- name: Generate code snippets for documentation | |
run: yarn cli snippets javascript ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).toRun }} | |
- name: Zip artifact before storing | |
run: zip -r -y clients-javascript.zip clients/algoliasearch-client-javascript ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).testsToStore }} ${{ fromJSON(needs.setup.outputs.JAVASCRIPT_DATA).snippetsToStore }} -x "**/node_modules**" "**/.yarn/cache/**" "**/.yarn/install-state.gz" "**/build/**" "**/dist/**" "**/.gradle/**" "**/bin/**" "**/.nx/**" | |
- name: Store javascript clients | |
uses: actions/upload-artifact@v4 | |
with: | |
if-no-files-found: error | |
name: clients-javascript | |
path: clients-javascript.zip | |
client_gen: | |
timeout-minutes: 20 | |
runs-on: 'ubuntu-22.04' | |
needs: | |
- setup | |
- specs | |
- scripts | |
if: | | |
always() && | |
needs.setup.outputs.RUN_GEN == 'true' && | |
!contains(needs.*.result, 'cancelled') && | |
!contains(needs.*.result, 'failure') | |
strategy: | |
matrix: ${{ fromJSON(needs.setup.outputs.GEN_MATRIX) }} | |
env: | |
ALGOLIA_APPLICATION_ID: ${{ secrets.ALGOLIA_APPLICATION_ID }} | |
ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Cache clients folder | |
if: ${{ github.ref != 'refs/heads/main' }} | |
id: cache | |
uses: actions/cache@v4 | |
with: | |
key: ${{ matrix.client.cacheKey }} | |
path: ${{ matrix.client.path }} | |
- name: Download specs artifacts | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
uses: ./scripts/ci/actions/restore-artifacts | |
with: | |
type: specs | |
- name: Setup | |
uses: ./.github/actions/setup | |
with: | |
language: ${{ matrix.client.language }} | |
- name: Generate clients | |
if: ${{ steps.cache.outputs.cache-hit != 'true' }} | |
run: yarn cli generate ${{ matrix.client.language }} ${{ matrix.client.toRun }} | |
- name: Build clients | |
if: ${{ steps.cache.outputs.cache-hit != 'true' && matrix.client.language != 'php' }} | |
run: ${{ matrix.client.buildCommand }} | |
- name: Run Java 'algoliasearch' public API validation | |
if: ${{ steps.cache.outputs.cache-hit != 'true' && matrix.client.language == 'java' }} | |
run: | | |
cd ${{ matrix.client.path }} | |
./gradlew :api:japicmp || exit 0 | |
FILE=${{ matrix.client.path }}/api/build/reports/japi.txt | |
if [[ -f "$FILE" ]]; then | |
cat $FILE | |
fi | |
- name: Remove previous CTS output | |
run: rm -rf ${{ matrix.client.testsToDelete }} || true | |
- name: Generate CTS | |
run: yarn cli cts generate ${{ matrix.client.language }} ${{ matrix.client.toRun }} | |
- name: Run CTS | |
run: yarn cli cts run ${{ matrix.client.language }} | |
- name: Generate code snippets for documentation | |
run: yarn cli snippets ${{ matrix.client.language }} ${{ matrix.client.toRun }} | |
- name: Zip artifact before storing | |
run: zip -r -y clients-${{ matrix.client.language }}.zip ${{ matrix.client.path }} ${{ matrix.client.testsToStore }} ${{ matrix.client.snippetsToStore }} -x "**/node_modules**" "**/__pycache__/**" "**/.yarn/cache/**" "**/build/**" "**/.build/**" "**/dist/**" "**/.gradle/**" "**/bin/**" "**/vendor/**" "**/target/**" "**/.dart_tool/**" | |
- name: Store ${{ matrix.client.language }} clients | |
uses: actions/upload-artifact@v4 | |
with: | |
if-no-files-found: error | |
name: clients-${{matrix.client.language }} | |
path: clients-${{matrix.client.language }}.zip | |
codegen: | |
runs-on: ubuntu-22.04 | |
timeout-minutes: 10 | |
needs: | |
- setup | |
- client_gen | |
- client_gen_javascript | |
if: | | |
always() && | |
!contains(needs.*.result, 'cancelled') && | |
!contains(needs.*.result, 'failure') | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
ref: ${{ github.event.pull_request.head.ref }} | |
token: ${{ secrets.ALGOLIA_BOT_TOKEN }} | |
- name: Download all artifacts | |
if: ${{ needs.setup.outputs.RUN_GEN == 'true' }} | |
uses: ./scripts/ci/actions/restore-artifacts | |
with: | |
type: all | |
- name: Setup | |
uses: ./.github/actions/setup | |
with: | |
type: minimal | |
- name: Push generated code | |
id: pushGeneratedCode | |
run: yarn workspace scripts pushGeneratedCode | |
env: | |
GITHUB_TOKEN: ${{ secrets.ALGOLIA_BOT_TOKEN }} | |
PR_NUMBER: ${{ github.event.number }} | |
- name: Spread generation to each repository | |
id: spreadGeneration | |
if: github.ref == 'refs/heads/main' | |
run: yarn workspace scripts spreadGeneration | |
env: | |
GITHUB_TOKEN: ${{ secrets.ALGOLIA_BOT_TOKEN }} | |
- name: Push specs to new worlds documentation | |
if: github.ref == 'refs/heads/main' | |
run: yarn workspace scripts pushSpecsToNewWorldDocs | |
env: | |
GITHUB_TOKEN: ${{ secrets.ALGOLIA_BOT_TOKEN }} | |
- name: Wait for all release CI | |
if: github.ref == 'refs/heads/main' | |
run: yarn workspace scripts waitForAllReleases ${{ steps.spreadGeneration.outputs.PUSHED_LANGUAGES }} | |
env: | |
GITHUB_TOKEN: ${{ secrets.ALGOLIA_BOT_TOKEN }} |