Skip to content
This repository has been archived by the owner on Jul 24, 2024. It is now read-only.

Appsmith CI run limited Tests Workflow with count #17

Appsmith CI run limited Tests Workflow with count

Appsmith CI run limited Tests Workflow with count #17

name: Appsmith CI run limited Tests Workflow with count
on:
# This line enables manual triggering of this workflow.
workflow_dispatch:
inputs:
pr:
description: "PR number"
required: false
type: number
default: 0
previous-workflow-run-id:
description: "Workflow ID (To Download cicontainer)"
required: false
type: number
default: 0
run_count:
description: "Number of runs"
required: false
type: number
default: 1
workflow_call:
inputs:
pr:
description: "This is the PR number in case the workflow is being called in a pull request"
required: false
type: number
previous-workflow-run-id:
description: "This is the PR number in case the workflow is being called in a pull request"
required: false
type: number
default: 0
run_count:
description: "Number of runs"
required: false
type: number
default: 1
jobs:
ci-test-limited:
runs-on: ubuntu-latest
#timeout-minutes: 50
if: |
github.event.pull_request.head.repo.full_name == github.repository ||
github.event_name == 'push' ||
github.event_name == 'workflow_dispatch' ||
github.event_name == 'repository_dispatch'
defaults:
run:
shell: bash
# Service containers to run with this job. Required for running tests
services:
# Label used to access the service container
redis:
# Docker Hub image for Redis
image: redis
ports:
# Opens tcp port 6379 on the host and service container
- 6379:6379
mongo:
image: mongo
ports:
- 27017:27017
steps:
- name: Set up Depot CLI
uses: depot/setup-action@v1
# - name: Login to DockerHub
# uses: docker/login-action@v3
# with:
# username: ${{ secrets.DOCKER_HUB_USERNAME }}
# password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
# Check out merge commit
# - name: Fork based /ok-to-test checkout
# if: inputs.pr != 0
# uses: actions/checkout@v4
# with:
# ref: "refs/pull/${{ inputs.pr }}/merge"
# # Checkout the code in the current branch in case the workflow is called because of a branch push event
# - name: Checkout the head commit of the branch
# if: inputs.pr == 0
# uses: actions/checkout@v4
# # Timestamp will be used to create cache key
# - id: timestamp
# run: echo "timestamp=$(date +'%Y-%m-%dT%H:%M:%S')" >> $GITHUB_OUTPUT
# # In case this is second attempt try restoring status of the prior attempt from cache
# - name: Restore the previous run result
# id: cache-appsmith
# uses: actions/cache/restore@v4
# with:
# path: |
# ~/run_result
# key: ${{ github.run_id }}-${{ github.job }}
# restore-keys: |
# ${{ github.run_id }}-${{ github.job }}
# - name: Get the previous run result
# if: steps.cache-appsmith.outputs.cache-hit == 'true'
# id: run_result
# run: |
# run_result_env=$(cat ~/run_result)
# echo "run_result=$run_result_env" >> $GITHUB_OUTPUT
# if [[ "$run_result_env" == "failedtest" ]]; then
# echo "rerun=true" >> $GITHUB_OUTPUT
# else
# echo "rerun=false" >> $GITHUB_OUTPUT
# fi
# Get specs to run
- name: Get specs to run
if: steps.run_result.outputs.run_result != 'success' && steps.run_result.outputs.run_result != 'failedtest'
run: |
specs_to_run=""
while IFS= read -r line
do
if [[ $line =~ ^#|^\/\/ ]]; then
continue
else
specs_to_run="$specs_to_run,$line"
fi
done < app/client/cypress/limited-tests.txt
specs_to_run=${specs_to_run#,}
echo "specs_to_run=$specs_to_run" >> $GITHUB_ENV
# # In case of run-id provided download the artifact from the previous run
# - name: Download Docker image artifact
# if: inputs.previous-workflow-run-id != 0
# uses: actions/cache@v4
# with:
# path: cicontainer.tar.gz
# key: docker-image-${{ inputs.previous-workflow-run-id }}
# # In case of run-id is 0 download the artifact from the current run
# - name: Download Docker image artifact
# if: inputs.previous-workflow-run-id == 0
# uses: actions/cache@v4
# with:
# path: cicontainer.tar.gz
# key: docker-image-${{github.run_id}}
# - name: Load Docker image from tar file
# run: |
# gunzip cicontainer.tar.gz
# docker load -i cicontainer.tar
# - name: Create folder
# if: steps.run_result.outputs.run_result != 'success'
# working-directory: "."
# run: |
# mkdir -p cicontainerlocal/stacks/configuration/
# - name: Run Appsmith & TED docker image
# if: steps.run_result.outputs.run_result != 'success'
# working-directory: "."
# run: |
# sudo /etc/init.d/ssh stop ;
# mkdir -p ~/git-server/keys
# docker run --name test-event-driver -d -p 22:22 -p 5001:5001 -p 3306:3306 \
# -p 5433:5432 -p 28017:27017 -p 25:25 -p 4200:4200 -p 5000:5000 -p 3001:3000 -p 6001:6001 -p 8001:8000 --privileged --pid=host --ipc=host --volume /:/host -v ~/git-server/keys:/git-server/keys \
# appsmith/test-event-driver:latest
# docker run --name cloud-services -d -p 8000:80 -p 8090:8090 \
# --privileged --pid=host --ipc=host --add-host=host.docker.internal:host-gateway\
# -e APPSMITH_CLOUD_SERVICES_MONGODB_URI=mongodb://host.docker.internal:27017 \
# -e APPSMITH_CLOUD_SERVICES_MONGODB_DATABASE=cs \
# -e APPSMITH_CLOUD_SERVICES_MONGODB_AUTH_DATABASE=admin \
# -e APPSMITH_REDIS_URL=redis://host.docker.internal:6379/ \
# -e APPSMITH_APPS_API_KEY=dummy-api-key \
# -e APPSMITH_REMOTE_API_KEY=dummy-api-key \
# -e APPSMITH_GITHUB_API_KEY=dummy-appsmith-gh-api-key \
# -e APPSMITH_JWT_SECRET=appsmith-cloud-services-jwt-secret-dummy-key \
# -e APPSMITH_ENCRYPTION_SALT=encryption-salt \
# -e APPSMITH_ENCRYPTION_PASSWORD=encryption-password \
# -e APPSMITH_CLOUD_SERVICES_URL=https://cs-dev.appsmith.com \
# -e APPSMITH_CUSTOMER_PORTAL_URL=https://dev.appsmith.com \
# -e APPSMITH_CLOUD_SERVICES_BASE_URL=https://cs-dev.appsmith.com \
# -e APPSMITH_CLOUD_SERVER_BASE_URL=https://release.app.appsmith.com \
# -e AUTH0_ISSUER_URL=https://login.release-customer.appsmith.com/ \
# -e AUTH0_CLIENT_ID=dummy-client-id \
# -e AUTH0_CLIENT_SECRET=dummy-secret-id \
# -e AUTH0_AUDIENCE_URL=https://login.local-customer.appsmith.com/ \
# -e CLOUDSERVICES_URL=cs-dev.appsmith.com \
# -e CUSTOMER_URL=dev.appsmith.com \
# -e [email protected] \
# -e ENTERPRISE_USER_PASSWORD=ent_user_password \
# -e [email protected] \
# -e ENTERPRISE_ADMIN_PASSWORD=ent_admin_password \
# -e LAUNCHDARKLY_BUSINESS_FLAGS_SERVER_KEY=$LAUNCHDARKLY_BUSINESS_FLAGS_SERVER_KEY \
# appsmith/cloud-services:release
# cd cicontainerlocal
# docker run -d --name appsmith -p 80:80 \
# -v "$PWD/stacks:/appsmith-stacks" \
# -e APPSMITH_DISABLE_TELEMETRY=true \
# -e APPSMITH_INTERCOM_APP_ID=DUMMY_VALUE \
# -e APPSMITH_CLOUD_SERVICES_BASE_URL=http://host.docker.internal:5001 \
# --add-host=host.docker.internal:host-gateway --add-host=api.segment.io:host-gateway --add-host=t.appsmith.com:host-gateway \
# cicontainer
# - name: Use Node.js
# uses: actions/setup-node@v4
# with:
# node-version-file: app/client/package.json
# # actions/setup-node@v4 doesn’t work properly with Yarn 3
# # when the project lives in a subdirectory: https://github.com/actions/setup-node/issues/488
# # Restoring the cache manually instead
# - name: Restore Yarn cache
# if: steps.run_result.outputs.run_result != 'success'
# uses: actions/cache@v4
# with:
# path: |
# app/client/.yarn/cache
# app/client/node_modules/.cache/webpack/
# key: v1-yarn3-${{ hashFiles('app/client/yarn.lock') }}
# # Install all the dependencies
# - name: Install dependencies
# working-directory: app/client
# run: |
# yarn install --immutable
# - name: Setting up the cypress tests
# if: steps.run_result.outputs.run_result != 'success'
# shell: bash
# run: |
# cd app/client
# chmod a+x ./cypress/setup-test-ci.sh
# ./cypress/setup-test-ci.sh
# - uses: browser-actions/setup-chrome@latest
# with:
# chrome-version: stable
# - run: |
# echo "BROWSER_PATH=$(which chrome)" >> $GITHUB_ENV
# - name: Save Git values
# # pass env variables from this step to other steps
# # using GitHub Actions environment file
# # https://docs.github.com/en/actions/learn-github-actions/workflow-commands-for-github-actions#environment-files
# run: |
# echo COMMIT_INFO_BRANCH=$(git rev-parse --abbrev-ref HEAD) >> $GITHUB_ENV
# echo COMMIT_INFO_MESSAGE=LimitedTests run on PR# ${{ inputs.pr }} >> $GITHUB_ENV
# echo COMMIT_INFO_EMAIL=$(git show -s --pretty=%ae) >> $GITHUB_ENV
# echo COMMIT_INFO_AUTHOR=$(git show -s --pretty=%an) >> $GITHUB_ENV
# echo COMMIT_INFO_SHA=$(git show -s --pretty=%H) >> $GITHUB_ENV
# echo COMMIT_INFO_TIMESTAMP=$(git show -s --pretty=%ct) >> $GITHUB_ENV
# echo COMMIT_INFO_REMOTE=$(git config --get remote.origin.url) >> $GITHUB_ENV
# # delete the .git folder afterwords to use the environment values
# rm -rf .git
# - name: Show Git values
# run: |
# echo Branch $COMMIT_INFO_BRANCH
# echo Message $COMMIT_INFO_MESSAGE
# echo Email $COMMIT_INFO_EMAIL
# echo Author $COMMIT_INFO_AUTHOR
# echo SHA $COMMIT_INFO_SHA
# echo Timestamp $COMMIT_INFO_TIMESTAMP
# echo Remote $COMMIT_INFO_REMOTE
# - name: Set Commit Message
# env:
# EVENT_COMMITS: ${{ toJson(github.event.commits[0].message) }}
# run: |
# if [[ ${{ inputs.pr }} -ne 0 && ${{github.event_name}} == 'repository_dispatch' ]]; then
# echo "COMMIT_INFO_MESSAGE=${{ env.COMMIT_INFO_MESSAGE }}" >> $GITHUB_ENV
# elif [[ ${{ inputs.pr }} -ne 0 && ${{github.event_name}} == 'workflow_dispatch' ]]; then
# echo "COMMIT_INFO_MESSAGE=Workflow run on PR# ${{ inputs.pr }}" >> $GITHUB_ENV
# else
# if [[ '${{env.EVENT_COMMITS}}' == 'null' ]]; then
# echo "COMMIT_INFO_MESSAGE=${{ github.event_name }} by ${{ env.COMMIT_INFO_AUTHOR }}" >> $GITHUB_ENV
# else
# echo "COMMIT_INFO_MESSAGE=$(echo \"${{ env.EVENT_COMMITS }}\" | awk -F '\\\\n' '{print $1}' | sed 's/^\"//')" >> $GITHUB_ENV
# fi
# fi
- name: Generate script to repeat Cypress tests
run: |
echo '#!/bin/bash' > repeat_cypress.sh
for ((i=1; i<=${{ github.event.inputs.run_count }}; i++)); do
echo "Running iteration \$i" >> run_count_log.txt
echo "echo Running Cypress test \$i" >> repeat_cypress.sh
echo "npx cypress run --config-file cypress_ci_custom.config.ts --spec ${{ env.specs_to_run }} --browser ${{ env.BROWSER_PATH }} --env NODE_ENV=development" || true >> repeat_cypress.sh
done
chmod +x repeat_cypress.sh
env:
browser: ${{ env.BROWSER_PATH }}
install: false
config-file: cypress_ci_custom.config.ts
spec: ${{ env.specs_to_run }}
working-directory: app/client
env: "NODE_ENV=development"
- name: Run the cypress test
run: |
./repeat_cypress.sh
echo "Run count: ${{ github.event.inputs.run_count }}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CYPRESS_USERNAME: ${{ secrets.CYPRESS_USERNAME }}
CYPRESS_PASSWORD: ${{ secrets.CYPRESS_PASSWORD }}
CYPRESS_TESTUSERNAME1: ${{ secrets.CYPRESS_TESTUSERNAME1 }}
CYPRESS_TESTPASSWORD1: ${{ secrets.CYPRESS_TESTPASSWORD1 }}
CYPRESS_TESTUSERNAME2: ${{ secrets.CYPRESS_TESTUSERNAME2 }}
CYPRESS_TESTPASSWORD2: ${{ secrets.CYPRESS_TESTPASSWORD1 }}
CYPRESS_TESTUSERNAME3: ${{ secrets.CYPRESS_TESTUSERNAME3 }}
CYPRESS_TESTPASSWORD3: ${{ secrets.CYPRESS_TESTPASSWORD3 }}
CYPRESS_TESTUSERNAME4: ${{ secrets.CYPRESS_TESTUSERNAME4 }}
CYPRESS_TESTPASSWORD4: ${{ secrets.CYPRESS_TESTPASSWORD4 }}
CYPRESS_S3_ACCESS_KEY: ${{ secrets.CYPRESS_S3_ACCESS_KEY }}
CYPRESS_S3_SECRET_KEY: ${{ secrets.CYPRESS_S3_SECRET_KEY }}
CYPRESS_AIRTABLE_BEARER: ${{ secrets.AIRTABLE_BEARER }}
CYPRESS_ORACLE_HOST: ${{ secrets.ORACLE_HOST }}
CYPRESS_ORACLE_SERVICE: ${{ secrets.ORACLE_SERVICE }}
CYPRESS_ORACLE_USERNAME: ${{ secrets.ORACLE_USERNAME }}
CYPRESS_ORACLE_PASSWORD: ${{ secrets.ORACLE_PASSWORD }}
CYPRESS_FIRESTORE_PRIVATE_KEY: ${{ secrets.FIRESTORE_PRIVATE_KEY }}
CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_ID }}
CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET }}
CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_ID }}
CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET }}
CYPRESS_OAUTH_SAML_EMAIL: ${{ secrets.CYPRESS_OAUTH_SAML_EMAIL }}
CYPRESS_OAUTH_SAML_ENTITY_ID: ${{ secrets.CYPRESS_OAUTH_SAML_ENTITY_ID }}
CYPRESS_OAUTH_SAML_METADATA_URL: ${{ secrets.CYPRESS_OAUTH_SAML_METADATA_URL }}
CYPRESS_OAUTH_SAML_METADATA_XML: ${{ secrets.CYPRESS_OAUTH_SAML_METADATA_XML }}
CYPRESS_OAUTH_SAML_PUB_CERT: ${{ secrets.CYPRESS_OAUTH_SAML_PUB_CERT }}
CYPRESS_OAUTH_SAML_SSO_URL: ${{ secrets.CYPRESS_OAUTH_SAML_SSO_URL }}
CYPRESS_OAUTH_SAML_REDIRECT_URL: ${{ secrets.CYPRESS_OAUTH_SAML_REDIRECT_URL }}
CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_ID }}
CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_SECRET }}
CYPRESS_APPSMITH_OAUTH2_OIDC_AUTH_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_AUTH_URL }}
CYPRESS_APPSMITH_OAUTH2_OIDC_TOKEN_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_TOKEN_URL }}
CYPRESS_APPSMITH_OAUTH2_OIDC_USER_INFO: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_USER_INFO }}
CYPRESS_APPSMITH_OAUTH2_OIDC_JWKS_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_JWKS_URL }}
CYPRESS_APPSMITH_OAUTH2_OIDC_OKTA_PASSWORD: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_OKTA_PASSWORD }}
CYPRESS_APPSMITH_OAUTH2_OIDC_DIRECT_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_DIRECT_URL }}
CYPRESS_EXCLUDE_TAGS: "airgap"
CYPRESS_AIRGAPPED: false
APPSMITH_DISABLE_TELEMETRY: true
APPSMITH_GOOGLE_MAPS_API_KEY: ${{ secrets.APPSMITH_GOOGLE_MAPS_API_KEY }}
POSTGRES_PASSWORD: postgres
CYPRESS_VERIFY_TIMEOUT: 100000
COMMIT_INFO_MESSAGE: ${{ env.COMMIT_INFO_MESSAGE }}
RUNID: ${{ github.run_id }}
ATTEMPT_NUMBER: ${{ github.run_attempt }}
REPOSITORY: ${{ github.repository }}
COMMITTER: ${{ env.COMMIT_INFO_AUTHOR }}
TAG: ${{ github.event_name }}
BRANCH: ${{ env.COMMIT_INFO_BRANCH }}
THIS_RUNNER: ${{ strategy.job-index }}
TOTAL_RUNNERS: ${{ strategy.job-total }}
CYPRESS_SPECS: ${{ env.specs_to_run }}
CYPRESS_RERUN: ${{steps.run_result.outputs.rerun}}
CYPRESS_DB_USER: ${{ secrets.CYPRESS_DB_USER }}
CYPRESS_DB_HOST: ${{ secrets.CYPRESS_DB_HOST }}
CYPRESS_DB_NAME: ${{ secrets.CYPRESS_DB_NAME }}
CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }}
CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }}
CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }}
CYPRESS_STATIC_ALLOCATION: true
continue-on-error: true
- name: Trim number of cypress log files
if: failure()
run: |
find ${{ github.workspace }}/app/client/cypress/cypress-logs -name '*.json' -type f | tail -n +11 | xargs -I {} rm -- {}
- name: Upload failed test cypress logs artifact
if: failure()
uses: actions/upload-artifact@v4
with:
name: cypress-console-logs
path: ${{ github.workspace }}/app/client/cypress/cypress-logs
overwrite: true
- name: Upload cypress snapshots
if: always()
uses: actions/upload-artifact@v4
with:
name: snapshots
path: ${{ github.workspace }}/app/client/cypress/snapshots
overwrite: true
- name: Collect CI container logs
if: failure()
working-directory: "."
run: |
mkdir -p ~/dockerlogs
docker logs appsmith 2>&1 > ~/dockerlogs/dockerlogs-log.txt
# Upload docker logs
- name: Upload failed test list artifact
if: failure()
uses: actions/upload-artifact@v4
with:
name: dockerlogs
path: ~/dockerlogs
overwrite: true
- name: Rename reports
if: failure()
run: |
mkdir -p ~/results
mv ${{ github.workspace }}/app/client/results ~/results
- name: Upload cypress report
if: failure()
uses: actions/upload-artifact@v4
with:
name: results-${{github.run_attempt}}
path: ~/results
overwrite: true
# Set status = failedtest
- name: Set fail if there are test failures
if: failure()
run: |
echo "failedtest" > ~/run_result
# Force store previous run result to cache
- name: Store the previous run result
if: failure()
uses: actions/cache/save@v4
with:
path: |
~/run_result
key: ${{ github.run_id }}-${{ github.job }}
# Upload the log artifact so that it can be used by the test & deploy job in the workflow
- name: Upload server logs bundle on failure
uses: actions/upload-artifact@v4
if: failure()
with:
name: server-logs
path: app/server/server-logs.log
overwrite: true
# Set status = success
- name: Save the status of the run
run: |
echo "run_result=success" >> $GITHUB_OUTPUT
echo "success" > ~/run_result