name: CI on: push: branches: [ main ] pull_request: branches: [ main ] # Allows running this workflow manually from the Actions tab workflow_dispatch: jobs: build_and_test: runs-on: ubuntu-latest strategy: # it is helpful to know which sets of tests would have succeeded, # even when there is a failure. fail-fast: false matrix: python-version: [3.9] node-version: [18.x] tests: - ':lint:python:client:common:smoke:stubs:' - ':server-1-of-2:' - ':server-2-of-2:' - ':nbrowser-^[A-G]:' - ':nbrowser-^[H-L]:' - ':nbrowser-^[M-O]:' - ':nbrowser-^[P-S]:' - ':nbrowser-^[^A-S]:' include: - tests: ':lint:python:client:common:smoke:' node-version: 18.x python-version: '3.10' - tests: ':lint:python:client:common:smoke:' node-version: 18.x python-version: '3.11' steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'yarn' - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} cache: 'pip' - name: Install Python packages run: | pip install virtualenv yarn run install:python - name: Install Node.js packages run: yarn install - name: Run eslint if: contains(matrix.tests, ':lint:') run: yarn run lint:ci - name: Make sure bucket is versioned if: contains(matrix.tests, ':server-') env: AWS_ACCESS_KEY_ID: administrator AWS_SECRET_ACCESS_KEY: administrator run: aws --region us-east-1 --endpoint-url http://localhost:9000 s3api put-bucket-versioning --bucket grist-docs-test --versioning-configuration Status=Enabled - name: Build Node.js code run: yarn run build:prod - name: Install chromedriver if: contains(matrix.tests, ':nbrowser-') || contains(matrix.tests, ':smoke:') || contains(matrix.tests, ':stubs:') run: ./node_modules/selenium-webdriver/bin/linux/selenium-manager --driver chromedriver - name: Run smoke test if: contains(matrix.tests, ':smoke:') run: VERBOSE=1 DEBUG=1 MOCHA_WEBDRIVER_HEADLESS=1 yarn run test:smoke - name: Run python tests if: contains(matrix.tests, ':python:') run: yarn run test:python - name: Run client tests if: contains(matrix.tests, ':client:') run: yarn run test:client - name: Run common tests if: contains(matrix.tests, ':common:') run: yarn run test:common - name: Run stubs tests if: contains(matrix.tests, ':stubs:') run: MOCHA_WEBDRIVER_HEADLESS=1 yarn run test:stubs - name: Run server tests with minio and redis if: contains(matrix.tests, ':server-') run: | export TEST_SPLITS=$(echo $TESTS | sed "s/.*:server-\([^:]*\).*/\1/") MOCHA_WEBDRIVER_HEADLESS=1 yarn run test:server env: TESTS: ${{ matrix.tests }} GRIST_DOCS_MINIO_ACCESS_KEY: administrator GRIST_DOCS_MINIO_SECRET_KEY: administrator TEST_REDIS_URL: "redis://localhost/11" GRIST_DOCS_MINIO_USE_SSL: 0 GRIST_DOCS_MINIO_ENDPOINT: localhost GRIST_DOCS_MINIO_PORT: 9000 GRIST_DOCS_MINIO_BUCKET: grist-docs-test - name: Run main tests without minio and redis if: contains(matrix.tests, ':nbrowser-') run: | mkdir -p $MOCHA_WEBDRIVER_LOGDIR export GREP_TESTS=$(echo $TESTS | sed "s/.*:nbrowser-\([^:]*\).*/\1/") MOCHA_WEBDRIVER_SKIP_CLEANUP=1 MOCHA_WEBDRIVER_HEADLESS=1 yarn run test:nbrowser --parallel --jobs 3 env: TESTS: ${{ matrix.tests }} MOCHA_WEBDRIVER_LOGDIR: ${{ runner.temp }}/test-logs/webdriver TESTDIR: ${{ runner.temp }}/test-logs - name: Prepare for saving artifact if: failure() run: | ARTIFACT_NAME=logs-$(echo $TESTS | sed 's/[^-a-zA-Z0-9]/_/g') echo "Artifact name is '$ARTIFACT_NAME'" echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> $GITHUB_ENV find $TESTDIR -iname "*.socket" -exec rm {} \; env: TESTS: ${{ matrix.tests }} TESTDIR: ${{ runner.temp }}/test-logs - name: Save artifacts on failure if: failure() uses: actions/upload-artifact@v3 with: name: ${{ env.ARTIFACT_NAME }} path: ${{ runner.temp }}/test-logs # only exists for webdriver tests services: # https://github.com/bitnami/bitnami-docker-minio/issues/16 minio: image: bitnami/minio:latest env: MINIO_DEFAULT_BUCKETS: "grist-docs-test:public" MINIO_ROOT_USER: administrator MINIO_ROOT_PASSWORD: administrator ports: - 9000:9000 options: >- --health-cmd "curl -f http://localhost:9000/minio/health/ready" --health-interval 10s --health-timeout 5s --health-retries 5 redis: image: redis ports: - 6379:6379 options: >- --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5 candidate: needs: build_and_test if: ${{ success() && github.event_name == 'push' }} runs-on: ubuntu-latest steps: - name: Fetch new candidate branch uses: actions/checkout@v3 - name: Update candidate branch uses: ad-m/github-push-action@8407731efefc0d8f72af254c74276b7a90be36e1 with: github_token: ${{ secrets.GITHUB_TOKEN }} branch: latest_candidate force: true