DigitalConsumer.FixMyGlass/azure-pipelines-automated-testing.yml
maguire-arman 636ad2bbd0 Adds Docker cleanup step to pipeline
Adds a Docker cleanup script to the pipeline to remove stopped containers, dangling images, unused networks, and unused volumes. This helps to free up disk space and prevent potential resource exhaustion during automated testing.
2025-06-05 09:23:45 -04:00

213 lines
9.5 KiB
YAML

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 networks
echo "Removing unused networks..."
docker network 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 "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()