name: CI Server on: push: branches: - main pull_request: concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true env: SERVER_SETUP_CACHE_KEY: server-setup jobs: changed-files-check: uses: ./.github/workflows/changed-files.yaml with: files: | package.json packages/twenty-server/** packages/twenty-emails/** packages/twenty-shared/** server-setup: needs: changed-files-check if: needs.changed-files-check.outputs.any_changed == 'true' timeout-minutes: 30 runs-on: depot-ubuntu-24.04-8 env: NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 services: postgres: image: twentycrm/twenty-postgres-spilo env: PGUSER_SUPERUSER: postgres PGPASSWORD_SUPERUSER: postgres ALLOW_NOSSL: 'true' SPILO_PROVIDER: 'local' ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 redis: image: redis ports: - 6379:6379 steps: - name: Fetch custom Github Actions and base branch history uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install dependencies uses: ./.github/workflows/actions/yarn-install - name: Restore server setup id: restore-server-setup-cache uses: ./.github/workflows/actions/restore-cache with: key: ${{ env.SERVER_SETUP_CACHE_KEY }} - name: Build twenty-shared run: npx nx build twenty-shared - name: Server / Run lint & typecheck uses: ./.github/workflows/actions/nx-affected with: tag: scope:backend tasks: lint,typecheck - name: Server / Build run: npx nx build twenty-server - name: Server / Write .env run: npx nx reset:env twenty-server - name: Server / Create DB run: | PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d postgres -c 'CREATE DATABASE "default";' PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d postgres -c 'CREATE DATABASE "test";' npx nx run twenty-server:database:init:prod npx nx run twenty-server:database:migrate:prod - name: Worker / Run run: | timeout 30s npx nx run twenty-server:worker || exit_code=$? if [ $exit_code -eq 124 ]; then # If timeout was reached (exit code 124), consider it a success exit 0 elif [ $exit_code -ne 0 ]; then # If worker failed for other reasons, fail the build exit $exit_code fi - name: Server / Check for Pending Migrations run: | METADATA_MIGRATION_OUTPUT=$(npx nx run twenty-server:typeorm migration:generate metadata-migration-check -d src/database/typeorm/metadata/metadata.datasource.ts || true) CORE_MIGRATION_OUTPUT=$(npx nx run twenty-server:typeorm migration:generate core-migration-check -d src/database/typeorm/core/core.datasource.ts || true) METADATA_MIGRATION_FILE=$(ls packages/twenty-server/*metadata-migration-check.ts 2>/dev/null || echo "") CORE_MIGRATION_FILE=$(ls packages/twenty-server/*core-migration-check.ts 2>/dev/null || echo "") if [ -n "$METADATA_MIGRATION_FILE" ] || [ -n "$CORE_MIGRATION_FILE" ]; then echo "::error::Unexpected migration files were generated. Please create a proper migration manually." echo "$METADATA_MIGRATION_OUTPUT" echo "$CORE_MIGRATION_OUTPUT" rm -f packages/twenty-server/*metadata-migration-check.ts packages/twenty-server/*core-migration-check.ts exit 1 fi - name: GraphQL / Check for Pending Generation if: steps.changed-files.outputs.any_changed == 'true' run: | GRAPHQL_GENERATE_OUTPUT=$(npx nx run twenty-front:graphql:generate || true) GRAPHQL_METADATA_OUTPUT=$(npx nx run twenty-front:graphql:generate --configuration=metadata || true) if [[ $GRAPHQL_GENERATE_OUTPUT == *"No changes detected"* && $GRAPHQL_METADATA_OUTPUT == *"No changes detected"* ]]; then echo "GraphQL generation check passed." else echo "::error::Unexpected GraphQL changes detected. Please run the required commands and commit the changes." echo "$GRAPHQL_GENERATE_OUTPUT" echo "$GRAPHQL_METADATA_OUTPUT" exit 1 fi - name: Save server setup uses: ./.github/workflows/actions/save-cache with: key: ${{ steps.restore-server-setup-cache.outputs.cache-primary-key }} server-test: timeout-minutes: 30 runs-on: depot-ubuntu-24.04-8 needs: server-setup env: NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 steps: - name: Fetch custom Github Actions and base branch history uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install dependencies uses: ./.github/workflows/actions/yarn-install - name: Restore server setup uses: ./.github/workflows/actions/restore-cache with: key: ${{ env.SERVER_SETUP_CACHE_KEY }} - name: Server / Run Tests uses: ./.github/workflows/actions/nx-affected with: tag: scope:backend tasks: test server-integration-test: timeout-minutes: 30 runs-on: depot-ubuntu-24.04-8 needs: server-setup services: postgres: image: twentycrm/twenty-postgres-spilo env: PGUSER_SUPERUSER: postgres PGPASSWORD_SUPERUSER: postgres ALLOW_NOSSL: 'true' SPILO_PROVIDER: 'local' ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 redis: image: redis ports: - 6379:6379 env: NX_REJECT_UNKNOWN_LOCAL_CACHE: 0 steps: - name: Fetch custom Github Actions and base branch history uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install dependencies uses: ./.github/workflows/actions/yarn-install - name: Update .env.test for billing run: | echo "IS_BILLING_ENABLED=true" >> .env.test echo "BILLING_STRIPE_API_KEY=test-api-key" >> .env.test echo "BILLING_STRIPE_BASE_PLAN_PRODUCT_ID=test-base-plan-product-id" >> .env.test echo "BILLING_STRIPE_WEBHOOK_SECRET=test-webhook-secret" >> .env.test - name: Restore server setup uses: ./.github/workflows/actions/restore-cache with: key: ${{ env.SERVER_SETUP_CACHE_KEY }} - name: Server / Build run: npx nx build twenty-server - name: Build dependencies run: | npx nx build twenty-shared npx nx build twenty-emails - name: Server / Create Test DB env: NODE_ENV: test run: | PGPASSWORD=postgres psql -h localhost -p 5432 -U postgres -d postgres -c 'CREATE DATABASE "test";' - name: Server / Run Integration Tests uses: ./.github/workflows/actions/nx-affected with: tag: scope:backend tasks: 'test:integration:with-db-reset' - name: Server / Upload reset-logs file if: always() uses: actions/upload-artifact@v4 with: name: reset-logs path: reset-logs.log ci-server-status-check: if: always() && !cancelled() timeout-minutes: 1 runs-on: depot-ubuntu-24.04-8 needs: [changed-files-check, server-setup, server-test, server-integration-test] steps: - name: Fail job if any needs failed if: contains(needs.*.result, 'failure') run: exit 1