trigger: none schedules: - cron: 0 9 * * MON-FRI always: true displayName: Daily Test Automation Run for FMG-NextGen branches: include: - develop pool: "Default" variables: # - group: Digital-Infrastructure # - group: FMG-BuildBranches - name: dockerImageName value: "playwright-tests" - name: imageTag value: "$(Build.BuildId)" - name: totalShards value: 4 - name: IS_REGRESSION value: "true" - name: JIRA_BOARD_ID value: "845" - name: JIRA_EPIC_KEY value: "CASH-208" - name: JIRA_PROJECT_KEY value: "CASH" stages: - stage: TestPr displayName: Run Playwright Test jobs: - job: playwright_tests continueOnError: true strategy: matrix: shard1: shardNumber: 1 shard2: shardNumber: 2 shard3: shardNumber: 3 shard4: shardNumber: 4 steps: - script: | echo "Starting Docker cleanup to free space..." # Remove all stopped containers echo "Removing stopped containers..." docker container prune -f # Remove dangling images (untagged) echo "Removing dangling images..." docker image prune -f # Remove unused volumes echo "Removing unused volumes..." docker volume prune -f # Show disk usage after cleanup echo "Docker system usage after cleanup:" docker system df echo "Docker cleanup completed!" displayName: "Docker Cleanup" - task: Docker@2 displayName: "Build Docker Image" inputs: command: build dockerfile: Dockerfile.playwright repository: $(dockerImageName) tags: $(imageTag) arguments: "--no-cache --pull" - script: | # Create container and run tests container_id=$(docker create \ --ipc=host \ -e "CCIS_API_AUTH=$(CCIS_API_AUTH)" \ -e "SKIP_CONTENT_SITE=$(SKIP_CONTENT_SITE)" \ -e "BASE_URL=$(BASE_URL)" \ -e "CCIS_API_URL=$(CCIS_API_URL)" \ -e "ADMIN_SERVICE_API_URL=$(ADMIN_SERVICE_API_URL)" \ -e "SHARD=$(shardNumber)" \ -e CI=true \ -e "NODE_ENV=$(NODE_ENV)" \ $(dockerImageName):$(imageTag) \ npx concurrently -k -n "server,playwright"\ "sed -i \"s|^process\.env\.VUE_APP_CONSUMER_CF_DISTRO = .*|process\.env\.VUE_APP_CONSUMER_CF_DISTRO='https://digitalapi.test.safelite.io'|\" \"./vue.config.js\" && echo \"Updated config file to use TEST APIs\" && npm run serve -- --port=8080"\ "npx wait-on http://localhost:8080/fmg/ && npm run test:playwright -- --shard=$(shardNumber)/$(totalShards) --reporter=list,blob --grep \"@CASH|@Alert\"") # Start container and stream logs echo "Starting tests for shard $(shardNumber)..." docker start -a $container_id # Create directory for test results echo "Creating test results directory..." mkdir -p $(System.DefaultWorkingDirectory)/blob-reports/shard-$(shardNumber) # Copy test results from container echo "Copying test results..." docker cp $container_id:/app/blob-report/. $(System.DefaultWorkingDirectory)/blob-reports/shard-$(shardNumber)/ # Remove container echo "Cleaning up container..." docker rm $container_id # Check if tests failed if [ $? -ne 0 ]; then echo "Tests failed in shard $(shardNumber) or tests don't exist for this shard number!" exit 0 # Suppress error. It will be visible in report. fi displayName: "Run Playwright Tests - Shard $(shardNumber)" - task: PublishPipelineArtifact@1 displayName: "Publish Test Reports - Shard $(shardNumber)" condition: always() inputs: targetPath: "$(System.DefaultWorkingDirectory)/blob-reports/shard-$(shardNumber)" artifact: "playwright-report-shard-$(shardNumber)" publishLocation: "pipeline" - script: | docker rmi $(dockerImageName):$(imageTag) -f displayName: "Cleanup Docker Image" condition: always() - job: download_and_merge_reports dependsOn: playwright_tests timeoutInMinutes: 8 cancelTimeoutInMinutes: 10 steps: - task: DownloadPipelineArtifact@2 inputs: targetPath: "$(System.DefaultWorkingDirectory)/playwright-reports" - task: Docker@2 displayName: "Build Docker Image" inputs: command: build dockerfile: Dockerfile.playwright repository: $(dockerImageName) tags: $(imageTag) arguments: "--no-cache --pull" - bash: | # Create container for jira writeback container_id=$(docker create \ --ipc=host \ -e "JIRA_SERVER=$(JIRA_SERVER)" \ -e "JIRA_USERNAME=$(JIRA_USERNAME)" \ -e "JIRA_API_KEY=$(JIRA_API_KEY)" \ -e "IS_REGRESSION=$(IS_REGRESSION)" \ -e "JIRA_BOARD_ID=$(JIRA_BOARD_ID)" \ -e "JIRA_EPIC_KEY=$(JIRA_EPIC_KEY)" \ -e "JIRA_PROJECT_KEY=$(JIRA_PROJECT_KEY)" \ $(dockerImageName):$(imageTag) \ bash -c "echo \"Moving Playwright reports out of subfolders...\" && find ./playwright-reports/ -mindepth 2 -type f -exec mv {} ./playwright-reports/ \; && echo \"Merging reports...\" && PLAYWRIGHT_JUNIT_OUTPUT_DIR='/app/test-results' PLAYWRIGHT_JUNIT_OUTPUT_NAME='junit_results.xml' npx playwright merge-reports --reporter='playwright-tests/impl/reporter/JiraWritebackReporter.ts',junit ./playwright-reports echo \"Contents of ortoni-report:\" && ls ./ortoni-report && echo 'Current dir: ' && pwd echo 'Contents of current dir: ' && ls echo 'Contents of /app/test-results' && ls /app/test-results ") # Start container and stream logs echo "Starting merge" docker start -a $container_id # Create directory for test results echo "Creating test results directory..." mkdir -p $(System.DefaultWorkingDirectory)/ortoni-report mkdir -p $(System.DefaultWorkingDirectory)/test-results # Copy test results from container echo "Copying test results..." docker cp $container_id:/app/ortoni-report/. $(System.DefaultWorkingDirectory)/ortoni-report docker cp $container_id:/app/test-results/junit_results.xml $(System.DefaultWorkingDirectory)/test-results # Remove container echo "Cleaning up container..." docker rm $container_id env: JIRA_API_KEY: $(JIRA_API_KEY) displayName: merge_and_publish_results_to_jira - task: PublishTestResults@2 displayName: "Publish test results" inputs: searchFolder: "test-results" testResultsFormat: "JUnit" testResultsFiles: "junit_results.xml" mergeTestResults: true failTaskOnFailedTests: false testRunTitle: "Playwright Tests" condition: succeededOrFailed() - task: PublishPipelineArtifact@1 displayName: "Publish Merged Report" condition: always() inputs: targetPath: "$(System.DefaultWorkingDirectory)/ortoni-report" artifact: "playwright-merged-report" publishLocation: "pipeline" - script: | docker rmi $(dockerImageName):$(imageTag) -f displayName: "Cleanup Docker Image" condition: always()