#!/usr/bin/env bash # # Set and display project path # UNITY_PROJECT_PATH="$GITHUB_WORKSPACE/$PROJECT_PATH" echo "Using project path \"$UNITY_PROJECT_PATH\"." # # Set and display the artifacts path # echo "Using artifacts path \"$ARTIFACTS_PATH\" to save test results." FULL_ARTIFACTS_PATH=$GITHUB_WORKSPACE/$ARTIFACTS_PATH # # Set and display the coverage results path # echo "Using coverage results path \"$COVERAGE_RESULTS_PATH\" to save test coverage results." FULL_COVERAGE_RESULTS_PATH=$GITHUB_WORKSPACE/$COVERAGE_RESULTS_PATH # # Display custom parameters # echo "Using custom parameters $CUSTOM_PARAMETERS." # The following tests are 2019 mode (requires Unity 2019.2.11f1 or later) # Reference: https://docs.unity3d.com/2019.3/Documentation/Manual/CommandLineArguments.html # # Display the unity version # echo "Using Unity version \"$UNITY_VERSION\" to test." # # Setup token for private package registry. # if [ -n "$PRIVATE_REGISTRY_TOKEN" ]; then echo "Private registry token detected, creating .upmconfig.toml" UPM_CONFIG_TOML_PATH="$HOME/.upmconfig.toml" echo "Creating toml at path: $UPM_CONFIG_TOML_PATH" touch $UPM_CONFIG_TOML_PATH cat > "$UPM_CONFIG_TOML_PATH" < /dev/null then echo "jq could not be found. This is required for package mode, and is likely the result of using a custom Docker image. Please use the default image or install jq to your custom image." exit 1 fi echo "" echo "###########################" echo "# Package Folder #" echo "###########################" echo "" ls -la "$UNITY_PROJECT_PATH" echo "" echo "Creating an empty Unity project to add the package $PACKAGE_NAME to." TEMP_PROJECT_PATH="./TempProject" unity-editor \ -batchmode \ -createProject "$TEMP_PROJECT_PATH" \ -quit # use jq to add the package to the temp project through manually modifying Packages/manifest.json echo "Adding package to the temporary project's dependencies and testables..." echo "" PACKAGE_MANIFEST_PATH="$TEMP_PROJECT_PATH/Packages/manifest.json" if [ ! -f "$PACKAGE_MANIFEST_PATH" ]; then echo "Packages/mainfest.json was not created properly. This indicates a problem with the Action, not with your package. Logging directories and aborting..." echo "" echo "###########################" echo "# Temp Project Folder #" echo "###########################" echo "" ls -a "$TEMP_PROJECT_PATH" echo "" echo "################################" echo "# Temp Project Packages Folder #" echo "################################" echo "" ls -a "$TEMP_PROJECT_PATH/Packages" exit 1 fi PACKAGE_MANIFEST_JSON=$(cat "$PACKAGE_MANIFEST_PATH") if [ -z "$SCOPED_REGISTRY_URL" ] || [ -z "$REGISTRY_SCOPES" ]; then echo "$PACKAGE_MANIFEST_JSON" | \ jq \ --arg packageName "$PACKAGE_NAME" \ --arg projectPath "$UNITY_PROJECT_PATH" \ '.dependencies += {"com.unity.testtools.codecoverage": "1.1.1"} | .dependencies += {"\($packageName)": "file:\($projectPath)"} | . += {testables: ["\($packageName)"]}' \ > "$PACKAGE_MANIFEST_PATH" else echo "$PACKAGE_MANIFEST_JSON" | \ jq \ --arg packageName "$PACKAGE_NAME" \ --arg projectPath "$UNITY_PROJECT_PATH" \ --arg scopedRegistryUrl "$SCOPED_REGISTRY_URL" \ --argjson registryScopes "$(echo "[\"$REGISTRY_SCOPES\"]" | sed 's/,/","/g')" \ '.dependencies += {"com.unity.testtools.codecoverage": "1.1.1"} | .dependencies += {"\($packageName)": "file:\($projectPath)"} | . += {testables: ["\($packageName)"]} | . += {scopedRegistries: [{"name":"dependency", "url":"\($scopedRegistryUrl)", scopes: $registryScopes}] }' \ > "$PACKAGE_MANIFEST_PATH" fi UNITY_PROJECT_PATH="$TEMP_PROJECT_PATH" fi # # Overall info # echo "" echo "###########################" echo "# Artifacts folder #" echo "###########################" echo "" echo "Creating \"$FULL_ARTIFACTS_PATH\" if it does not exist." mkdir -p $FULL_ARTIFACTS_PATH echo "" echo "###########################" echo "# Project directory #" echo "###########################" echo "" ls -alh "$UNITY_PROJECT_PATH" # # Testing for each platform # for platform in ${TEST_PLATFORMS//;/ }; do if [[ "$platform" == "standalone" ]]; then echo "" echo "###########################" echo "# Building Standalone #" echo "###########################" echo "" # Create directories if they do not exist mkdir -p "$UNITY_PROJECT_PATH/Assets/Editor/" mkdir -p "$UNITY_PROJECT_PATH/Assets/Player/" # Copy the scripts cp -R "$ACTION_FOLDER/UnityStandaloneScripts/Assets/Editor/" "$UNITY_PROJECT_PATH/Assets/Editor/" cp -R "$ACTION_FOLDER/UnityStandaloneScripts/Assets/Player/" "$UNITY_PROJECT_PATH/Assets/Player/" # Verify recursive paths ls -Ralph "$UNITY_PROJECT_PATH/Assets/Editor/" ls -Ralph "$UNITY_PROJECT_PATH/Assets/Player/" runTests="-runTests -testPlatform StandaloneLinux64 -builtTestRunnerPath $UNITY_PROJECT_PATH/Build/UnityTestRunner-Standalone" else echo "" echo "###########################" echo "# Testing in $platform #" echo "###########################" echo "" if [[ "$platform" != "COMBINE_RESULTS" ]]; then runTests="-runTests -testPlatform $platform -testResults $FULL_ARTIFACTS_PATH/$platform-results.xml" else runTests="-quit" fi fi unity-editor \ -batchmode \ -logFile "$FULL_ARTIFACTS_PATH/$platform.log" \ -projectPath "$UNITY_PROJECT_PATH" \ -coverageResultsPath "$FULL_COVERAGE_RESULTS_PATH" \ $runTests \ -enableCodeCoverage \ -debugCodeOptimization \ -coverageOptions "$COVERAGE_OPTIONS" \ $CUSTOM_PARAMETERS # Catch exit code TEST_EXIT_CODE=$? # Print unity log output cat "$FULL_ARTIFACTS_PATH/$platform.log" if [[ $TEST_EXIT_CODE -eq 0 && "$platform" == "standalone" ]]; then echo "" echo "###########################" echo "# Testing Standalone #" echo "###########################" echo "" # Code Coverage currently only supports code ran in the Editor and not in Standalone/Player. # https://docs.unity3d.com/Packages/com.unity.testtools.codecoverage@1.2/manual/TechnicalDetails.html#how-it-works xvfb-run -a -e /dev/stdout "$UNITY_PROJECT_PATH/Build/UnityTestRunner-Standalone" \ -batchmode \ -nographics \ -logFile "$FULL_ARTIFACTS_PATH/$platform-player.log" \ -testResults "$FULL_ARTIFACTS_PATH/$platform-results.xml" # Catch exit code TEST_EXIT_CODE=$? # Print player log output cat "$FULL_ARTIFACTS_PATH/$platform-player.log" fi # Display results if [ $TEST_EXIT_CODE -eq 0 ]; then echo "Run succeeded, no failures occurred"; elif [ $TEST_EXIT_CODE -eq 2 ]; then echo "Run succeeded, some tests failed"; elif [ $TEST_EXIT_CODE -eq 3 ]; then echo "Run failure (other failure)"; else echo "Unexpected exit code $TEST_EXIT_CODE"; fi if [ $TEST_EXIT_CODE -ne 0 ]; then TEST_RUNNER_EXIT_CODE=$TEST_EXIT_CODE fi echo "" echo "###########################" echo "# $platform Results #" echo "###########################" echo "" if [[ "$platform" != "COMBINE_RESULTS" ]]; then cat "$FULL_ARTIFACTS_PATH/$platform-results.xml" cat "$FULL_ARTIFACTS_PATH/$platform-results.xml" | grep test-run | grep Passed fi done # # Permissions # # Make a given user owner of all artifacts if [[ -n "$CHOWN_FILES_TO" ]]; then chown -R "$CHOWN_FILES_TO" "$UNITY_PROJECT_PATH" chown -R "$CHOWN_FILES_TO" "$FULL_ARTIFACTS_PATH" chown -R "$CHOWN_FILES_TO" "$FULL_COVERAGE_RESULTS_PATH" fi # Add read permissions for everyone to all artifacts chmod -R a+r "$UNITY_PROJECT_PATH" chmod -R a+r "$FULL_ARTIFACTS_PATH" # Check if coverage results directory exists if [ -d "$FULL_COVERAGE_RESULTS_PATH" ]; then chmod -R a+r "$FULL_COVERAGE_RESULTS_PATH" else echo "Coverage results directory does not exist. If you are expecting coverage results, please make sure the Code Coverage package is installed in your unity project and that it is set up correctly." fi