diff --git a/.circleci/config.yml b/.circleci/config.yml index bc7053130..b44977138 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,10 +11,9 @@ defaults: &defaults RAILS_LOG_TO_STDOUT: false COVERAGE: true LOG_LEVEL: warn - parallelism: 4 jobs: - build: + setup: <<: *defaults steps: - checkout @@ -24,168 +23,98 @@ jobs: - node/install-packages: pkg-manager: pnpm override-ci-command: pnpm i - - run: node --version - - run: pnpm --version - run: - name: Add PostgreSQL repository and update + name: Install System Dependencies and Ruby command: | - sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' - wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - - sudo apt-get update -y - - - run: - name: Install System Dependencies - command: | - sudo apt-get update - DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \ - libpq-dev \ - redis-server \ - postgresql-common \ - postgresql-16 \ - postgresql-16-pgvector \ - build-essential \ - git \ - curl \ - libssl-dev \ - zlib1g-dev \ - libreadline-dev \ - libyaml-dev \ - openjdk-11-jdk \ - jq \ - software-properties-common \ - ca-certificates \ - imagemagick \ - libxml2-dev \ - libxslt1-dev \ - file \ - g++ \ - gcc \ - autoconf \ - gnupg2 \ - patch \ - ruby-dev \ - liblzma-dev \ - libgmp-dev \ - libncurses5-dev \ - libffi-dev \ - libgdbm6 \ - libgdbm-dev \ - libvips - - - run: - name: Install RVM and Ruby 3.3.3 - command: | - sudo apt-get install -y gpg - gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB - \curl -sSL https://get.rvm.io | bash -s stable - echo 'source ~/.rvm/scripts/rvm' >> $BASH_ENV + sudo apt-get update -y && sudo apt-get install -y \ + gpg libssl-dev zlib1g-dev libyaml-dev libreadline-dev libpq-dev libxml2-dev libxslt1-dev \ + imagemagick libvips redis-server postgresql-14 postgresql-14-pgextwlist build-essential openjdk-11-jdk + gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 + curl -sSL https://get.rvm.io | bash -s stable --ruby=3.3.3 source ~/.rvm/scripts/rvm - rvm install "3.3.3" - rvm use 3.3.3 --default gem install bundler -v 2.5.16 - - - run: - name: Install Application Dependencies - command: | - source ~/.rvm/scripts/rvm bundle install - # pnpm install - - - run: - name: Download cc-test-reporter - command: | - mkdir -p ~/tmp - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ~/tmp/cc-test-reporter - chmod +x ~/tmp/cc-test-reporter - - # Swagger verification - - run: - name: Verify swagger API specification - command: | - bundle exec rake swagger:build - if [[ `git status swagger/swagger.json --porcelain` ]] - then - echo "ERROR: The swagger.json file is not in sync with the yaml specification. Run 'rake swagger:build' and commit 'swagger/swagger.json'." - exit 1 - fi - curl -L https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/6.3.0/openapi-generator-cli-6.3.0.jar > ~/tmp/openapi-generator-cli-6.3.0.jar - java -jar ~/tmp/openapi-generator-cli-6.3.0.jar validate -i swagger/swagger.json - - # we remove the FRONTED_URL from the .env before running the tests - - run: - name: Database Setup and Configure Environment Variables - command: | - pg_pass=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 15 ; echo '') - sed -i "s/REPLACE_WITH_PASSWORD/${pg_pass}/g" ${PWD}/.circleci/setup_chatwoot.sql - chmod 644 ${PWD}/.circleci/setup_chatwoot.sql - mv ${PWD}/.circleci/setup_chatwoot.sql /tmp/ - sudo -i -u postgres psql -f /tmp/setup_chatwoot.sql - cp .env.example .env - sed -i '/^FRONTEND_URL/d' .env - sed -i -e '/REDIS_URL/ s/=.*/=redis:\/\/localhost:6379/' .env - sed -i -e '/POSTGRES_HOST/ s/=.*/=localhost/' .env - sed -i -e '/POSTGRES_USERNAME/ s/=.*/=chatwoot/' .env - sed -i -e "/POSTGRES_PASSWORD/ s/=.*/=$pg_pass/" .env - echo -en "\nINSTALLATION_ENV=circleci" >> ".env" - - # Database setup - - run: - name: Run DB migrations - command: bundle exec rails db:chatwoot_prepare - - # Bundle audit - - run: - name: Bundle audit - command: bundle exec bundle audit update && bundle exec bundle audit check -v - - # Rubocop linting - - run: - name: Rubocop - command: bundle exec rubocop - - # ESLint linting - - run: - name: eslint - command: pnpm run eslint - - - run: - name: Run frontend tests - command: | - mkdir -p ~/build/coverage/frontend - ~/tmp/cc-test-reporter before-build - pnpm run test:coverage - - - run: - name: Code Climate Test Coverage (Frontend) - command: | - ~/tmp/cc-test-reporter format-coverage -t lcov -o "~/build/coverage/frontend/codeclimate.frontend_$CIRCLE_NODE_INDEX.json" - - # Run backend tests - - run: - name: Run backend tests - command: | - mkdir -p ~/tmp/test-results/rspec - mkdir -p ~/tmp/test-artifacts - mkdir -p ~/build/coverage/backend - ~/tmp/cc-test-reporter before-build - TESTFILES=$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings) - bundle exec rspec --format progress \ - --format RspecJunitFormatter \ - --out ~/tmp/test-results/rspec.xml \ - -- ${TESTFILES} - no_output_timeout: 30m - - - run: - name: Code Climate Test Coverage (Backend) - command: | - ~/tmp/cc-test-reporter format-coverage -t simplecov -o "~/build/coverage/backend/codeclimate.$CIRCLE_NODE_INDEX.json" - - - run: - name: List coverage directory contents - command: | - ls -R ~/build/coverage - - persist_to_workspace: root: ~/build paths: - - coverage + - . + - ~/.rvm + - ~/.pnpm-store + + lint: + <<: *defaults + steps: + - attach_workspace: + at: ~/build + - run: + name: Linting & Swagger + command: | + source ~/.rvm/scripts/rvm + bundle exec rubocop + pnpm eslint . + bundle exec rake swagger:build + + security_audit: + <<: *defaults + steps: + - attach_workspace: + at: ~/build + - run: + name: Security audit + command: | + source ~/.rvm/scripts/rvm + bundle exec bundle audit update + bundle exec bundle audit check --verbose + + frontend_tests: + <<: *defaults + parallelism: 2 + steps: + - attach_workspace: + at: ~/build + - run: + name: Run frontend tests + command: | + pnpm test + + backend_tests: + <<: *defaults + parallelism: 4 + steps: + - attach_workspace: + at: ~/build + - run: + name: Setup and start services + command: | + sudo service postgresql start + sudo service redis-server start + - run: + name: Configure DB & Environment + command: | + source ~/.rvm/scripts/rvm + cp .circleci/setup_chatwoot.sql /tmp/ + sudo -u postgres psql < .circleci/setup_chatwoot.sql + bundle exec rails db:setup + - run: + name: Run backend tests + command: | + source ~/.rvm/scripts/rvm + TEST_FILES=$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings) + bundle exec rspec $TEST_FILES --format progress + +workflows: + build_and_test: + jobs: + - setup + - lint: + requires: + - setup + - frontend_tests: + requires: + - setup + - backend_tests: + requires: + - setup + - security_audit: + requires: + - setup