--- name: Test Artifact(macOS) on: workflow_call: inputs: distro-slug: required: true type: string description: The OS slug to run tests against nox-session: required: true type: string description: The nox session to run testrun: required: true type: string description: JSON string containing information about what and how to run the test suite python-version: required: false type: string description: The python version to run tests with default: "3.11" salt-version: type: string required: true description: The Salt version to set prior to running tests. cache-prefix: required: true type: string description: Seed used to invalidate caches platform: required: true type: string description: The platform being tested arch: required: true type: string description: The platform arch being tested nox-version: required: true type: string description: The nox version to install package-name: required: false type: string description: The onedir package name to use default: salt skip-code-coverage: required: false type: boolean description: Skip code coverage default: false skip-junit-reports: required: false type: boolean description: Skip Publishing JUnit Reports default: false env: COLUMNS: 190 PIP_INDEX_URL: "https://pypi-proxy.saltstack.net/root/local/+simple/" PIP_EXTRA_INDEX_URL: "https://pypi.org/simple" jobs: generate-matrix: name: Test Matrix runs-on: ${{ github.event.repository.private && fromJSON('["self-hosted", "linux", "x86_64"]') || 'ubuntu-latest' }} outputs: matrix-include: ${{ steps.generate-matrix.outputs.matrix }} steps: - name: "Throttle Builds" shell: bash run: | t=$(shuf -i 1-30 -n 1); echo "Sleeping $t seconds"; sleep "$t" - name: Checkout Source Code uses: actions/checkout@v4 - name: Setup Python Tools Scripts uses: ./.github/actions/setup-python-tools-scripts - name: Generate Test Matrix id: generate-matrix run: | TEST_MATRIX=$(tools ci matrix ${{ inputs.distro-slug }}) echo "$TEST_MATRIX" echo "matrix=$TEST_MATRIX" >> "$GITHUB_OUTPUT" test: name: Test runs-on: ${{ inputs.distro-slug }} timeout-minutes: 360 # 6 Hours needs: - generate-matrix strategy: fail-fast: false matrix: include: ${{ fromJSON(needs.generate-matrix.outputs.matrix-include) }} env: SALT_TRANSPORT: ${{ matrix.transport }} steps: - name: Checkout Source Code uses: actions/checkout@v4 - name: Setup Salt Version run: | echo "${{ inputs.salt-version }}" > salt/_version.txt - name: Download Onedir Tarball as an Artifact uses: actions/download-artifact@v3 with: name: ${{ inputs.package-name }}-${{ inputs.salt-version }}-onedir-${{ inputs.platform }}-${{ inputs.arch }}.tar.xz path: artifacts/ - name: Decompress Onedir Tarball shell: bash run: | python3 -c "import os; os.makedirs('artifacts', exist_ok=True)" cd artifacts tar xvf ${{ inputs.package-name }}-${{ inputs.salt-version }}-onedir-${{ inputs.platform }}-${{ inputs.arch }}.tar.xz - name: Install System Dependencies run: | brew install tree - name: Download cached nox.${{ inputs.distro-slug }}.tar.* for session ${{ inputs.nox-session }} uses: actions/cache@v3 with: path: nox.${{ inputs.distro-slug }}.tar.* key: ${{ inputs.cache-prefix }}|testrun-deps|${{ inputs.arch }}|${{ inputs.distro-slug }}|${{ inputs.nox-session }}|${{ inputs.python-version }}|${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py') }} # If we get a cache miss here it means the dependencies step failed to save the cache fail-on-cache-miss: true - name: Set up Python ${{ inputs.python-version }} uses: actions/setup-python@v4 with: python-version: "${{ inputs.python-version }}" - name: Install Nox run: | python3 -m pip install 'nox==${{ inputs.nox-version }}' - name: Decompress .nox Directory run: | nox -e decompress-dependencies -- ${{ inputs.distro-slug }} - name: Download testrun-changed-files.txt if: ${{ fromJSON(inputs.testrun)['type'] != 'full' }} uses: actions/download-artifact@v3 with: name: testrun-changed-files.txt - name: Show System Info & Test Plan env: SKIP_REQUIREMENTS_INSTALL: "1" PRINT_TEST_SELECTION: "1" PRINT_TEST_PLAN_ONLY: "1" PRINT_SYSTEM_INFO: "1" GITHUB_ACTIONS_PIPELINE: "1" SKIP_INITIAL_GH_ACTIONS_FAILURES: "1" SKIP_CODE_COVERAGE: "1" run: | sudo -E nox -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }} -- -k "mac or darwin" - name: Run Fast/Changed Tests id: run-fast-changed-tests if: ${{ fromJSON(inputs.testrun)['type'] != 'full' && fromJSON(inputs.testrun)['selected_tests']['fast'] == false }} env: SKIP_REQUIREMENTS_INSTALL: "1" PRINT_TEST_SELECTION: "0" PRINT_TEST_PLAN_ONLY: "0" PRINT_SYSTEM_INFO: "0" RERUN_FAILURES: "1" GITHUB_ACTIONS_PIPELINE: "1" SKIP_INITIAL_GH_ACTIONS_FAILURES: "1" SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}" COVERAGE_CONTEXT: ${{ inputs.distro-slug }} run: | sudo -E nox -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }} -- \ -k "mac or darwin" --suppress-no-test-exit-code \ --from-filenames=testrun-changed-files.txt - name: Run Slow/Changed Tests id: run-slow-changed-tests if: ${{ fromJSON(inputs.testrun)['type'] != 'full' && fromJSON(inputs.testrun)['selected_tests']['slow'] == false }} env: SKIP_REQUIREMENTS_INSTALL: "1" PRINT_TEST_SELECTION: "0" PRINT_TEST_PLAN_ONLY: "0" PRINT_SYSTEM_INFO: "0" RERUN_FAILURES: "1" GITHUB_ACTIONS_PIPELINE: "1" SKIP_INITIAL_GH_ACTIONS_FAILURES: "1" SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}" COVERAGE_CONTEXT: ${{ inputs.distro-slug }} run: | sudo -E nox -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }} -- \ -k "mac or darwin" --suppress-no-test-exit-code --no-fast-tests --slow-tests \ --from-filenames=testrun-changed-files.txt - name: Run Core/Changed Tests id: run-core-changed-tests if: ${{ fromJSON(inputs.testrun)['type'] != 'full' && fromJSON(inputs.testrun)['selected_tests']['core'] == false }} env: SKIP_REQUIREMENTS_INSTALL: "1" PRINT_TEST_SELECTION: "0" PRINT_TEST_PLAN_ONLY: "0" PRINT_SYSTEM_INFO: "0" RERUN_FAILURES: "1" GITHUB_ACTIONS_PIPELINE: "1" SKIP_INITIAL_GH_ACTIONS_FAILURES: "1" SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}" COVERAGE_CONTEXT: ${{ inputs.distro-slug }} run: | sudo -E nox -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }} -- \ -k "mac or darwin" --suppress-no-test-exit-code --no-fast-tests --core-tests \ --from-filenames=testrun-changed-files.txt - name: Run Fast Tests id: run-fast-tests if: ${{ fromJSON(inputs.testrun)['type'] != 'full' && fromJSON(inputs.testrun)['selected_tests']['fast'] }} env: SKIP_REQUIREMENTS_INSTALL: "1" PRINT_TEST_SELECTION: "0" PRINT_TEST_PLAN_ONLY: "0" PRINT_SYSTEM_INFO: "0" RERUN_FAILURES: "1" GITHUB_ACTIONS_PIPELINE: "1" SKIP_INITIAL_GH_ACTIONS_FAILURES: "1" SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}" COVERAGE_CONTEXT: ${{ inputs.distro-slug }} run: | sudo -E nox -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }} -- \ -k "mac or darwin" --suppress-no-test-exit-code - name: Run Slow Tests id: run-slow-tests if: ${{ fromJSON(inputs.testrun)['type'] != 'full' && fromJSON(inputs.testrun)['selected_tests']['slow'] }} env: SKIP_REQUIREMENTS_INSTALL: "1" PRINT_TEST_SELECTION: "0" PRINT_TEST_PLAN_ONLY: "0" PRINT_SYSTEM_INFO: "0" RERUN_FAILURES: "1" GITHUB_ACTIONS_PIPELINE: "1" SKIP_INITIAL_GH_ACTIONS_FAILURES: "1" SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}" COVERAGE_CONTEXT: ${{ inputs.distro-slug }} run: | sudo -E nox -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }} -- \ -k "mac or darwin" --suppress-no-test-exit-code --no-fast-tests --slow-tests - name: Run Core Tests id: run-core-tests if: ${{ fromJSON(inputs.testrun)['type'] != 'full' && fromJSON(inputs.testrun)['selected_tests']['core'] }} env: SKIP_REQUIREMENTS_INSTALL: "1" PRINT_TEST_SELECTION: "0" PRINT_TEST_PLAN_ONLY: "0" PRINT_SYSTEM_INFO: "0" RERUN_FAILURES: "1" GITHUB_ACTIONS_PIPELINE: "1" SKIP_INITIAL_GH_ACTIONS_FAILURES: "1" SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}" COVERAGE_CONTEXT: ${{ inputs.distro-slug }} run: | sudo -E nox -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }} -- \ -k "mac or darwin" --suppress-no-test-exit-code --no-fast-tests --core-tests - name: Run Flaky Tests id: run-flaky-tests if: ${{ fromJSON(inputs.testrun)['selected_tests']['flaky'] }} env: SKIP_REQUIREMENTS_INSTALL: "1" PRINT_TEST_SELECTION: "0" PRINT_TEST_PLAN_ONLY: "0" PRINT_SYSTEM_INFO: "0" RERUN_FAILURES: "1" GITHUB_ACTIONS_PIPELINE: "1" SKIP_INITIAL_GH_ACTIONS_FAILURES: "1" SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}" COVERAGE_CONTEXT: ${{ inputs.distro-slug }} run: | sudo -E nox -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }} -- \ -k "mac or darwin" --suppress-no-test-exit-code --no-fast-tests --flaky-jail - name: Run Full Tests id: run-full-tests if: ${{ fromJSON(inputs.testrun)['type'] == 'full' }} env: SKIP_REQUIREMENTS_INSTALL: "1" PRINT_TEST_SELECTION: "0" PRINT_TEST_PLAN_ONLY: "0" PRINT_SYSTEM_INFO: "0" RERUN_FAILURES: "1" GITHUB_ACTIONS_PIPELINE: "1" SKIP_INITIAL_GH_ACTIONS_FAILURES: "1" SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}" COVERAGE_CONTEXT: ${{ inputs.distro-slug }} run: | sudo -E nox -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }} -- \ --slow-tests --core-tests -k "mac or darwin" - name: Fix file ownership run: | sudo chown -R "$(id -un)" . - name: Combine Coverage Reports if: always() && inputs.skip-code-coverage == false && job.status != 'cancelled' run: | nox -e combine-coverage - name: Create XML Coverage Reports if: always() && inputs.skip-code-coverage == false && job.status != 'cancelled' run: | nox -e create-xml-coverage-reports - name: Prepare Test Run Artifacts id: download-artifacts-from-vm if: always() && job.status != 'cancelled' run: | # Delete the salt onedir, we won't need it anymore and it will prevent # from it showing in the tree command below rm -rf artifacts/salt* tree -a artifacts if [ "${{ inputs.skip-code-coverage }}" != "true" ]; then mv artifacts/coverage/.coverage artifacts/coverage/.coverage.${{ inputs.distro-slug }}.${{ inputs.nox-session }}.${{ matrix.transport }}.${{ matrix.tests-chunk }} echo "COVERAGE_FILE=artifacts/coverage/.coverage.${{ inputs.distro-slug }}.${{ inputs.nox-session }}.${{ matrix.transport }}.${{ matrix.tests-chunk }}" >> GITHUB_ENV fi - name: Upload Code Coverage Test Run Artifacts if: always() && inputs.skip-code-coverage == false && steps.download-artifacts-from-vm.outcome == 'success' && job.status != 'cancelled' uses: actions/upload-artifact@v3 with: name: testrun-coverage-artifacts-${{ inputs.distro-slug }}-${{ inputs.nox-session }} path: | artifacts/coverage/ - name: Upload All Code Coverage Test Run Artifacts if: always() && inputs.skip-code-coverage == false && steps.download-artifacts-from-vm.outcome == 'success' && job.status != 'cancelled' uses: actions/upload-artifact@v3 with: name: all-testrun-coverage-artifacts path: | artifacts/coverage/ - name: Upload JUnit XML Test Run Artifacts if: always() && steps.download-artifacts-from-vm.outcome == 'success' && job.status != 'cancelled' uses: actions/upload-artifact@v3 with: name: testrun-junit-artifacts-${{ inputs.distro-slug }}-${{ inputs.nox-session }}-${{ matrix.transport }} path: | artifacts/xml-unittests-output/ - name: Upload Test Run Log Artifacts if: always() && steps.download-artifacts-from-vm.outcome == 'success' && job.status != 'cancelled' uses: actions/upload-artifact@v3 with: name: testrun-log-artifacts-${{ inputs.distro-slug }}-${{ inputs.nox-session }}-${{ matrix.transport }} path: | artifacts/logs - name: Publish Test Report uses: mikepenz/action-junit-report@v3 # always run even if the previous steps fails if: always() && inputs.skip-junit-reports == false with: check_name: Test Results(${{ inputs.distro-slug }}, transport=${{ matrix.transport }}, tests-chunk=${{ matrix.tests-chunk }}) report_paths: 'artifacts/xml-unittests-output/*.xml' annotate_only: true report: name: Test Reports if: always() && inputs.skip-code-coverage == false && needs.test.result != 'cancelled' && needs.test.result != 'skipped' runs-on: ${{ github.event.repository.private && fromJSON('["self-hosted", "linux", "x86_64"]') || 'ubuntu-latest' }} needs: - test steps: - name: Checkout Source Code uses: actions/checkout@v4 - name: Download Code Coverage Test Run Artifacts uses: actions/download-artifact@v3 if: ${{ inputs.skip-code-coverage == false }} id: download-coverage-artifacts with: name: testrun-coverage-artifacts-${{ inputs.distro-slug }}-${{ inputs.nox-session }} path: artifacts/coverage/ - name: Show Downloaded Test Run Artifacts run: | tree -a artifacts - name: Set up Python ${{ inputs.python-version }} uses: actions/setup-python@v4 with: python-version: "${{ inputs.python-version }}" - name: Install Nox run: | python3 -m pip install 'nox==${{ inputs.nox-version }}' - name: Combine Code Coverage if: ${{ inputs.skip-code-coverage == false }} continue-on-error: true run: | nox --force-color -e combine-coverage - name: Upload Code Coverage DB if: always() && inputs.skip-code-coverage == false && steps.download-coverage-artifacts.outcome == 'success' uses: actions/upload-artifact@v3 with: name: code-coverage path: artifacts/coverage - name: Report Salt Code Coverage if: always() && inputs.skip-code-coverage == false && steps.download-coverage-artifacts.outcome == 'success' continue-on-error: true run: | nox --force-color -e report-coverage -- salt - name: Report Tests Code Coverage if: always() && inputs.skip-code-coverage == false && steps.download-coverage-artifacts.outcome == 'success' continue-on-error: true run: | nox --force-color -e report-coverage -- tests - name: Report Combined Code Coverage if: always() && inputs.skip-code-coverage == false && steps.download-coverage-artifacts.outcome == 'success' continue-on-error: true run: | nox --force-color -e report-coverage