From 05aa9e96edc0651efed6a79a68f92dda09e8dc47 Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Mon, 24 Oct 2022 20:53:52 +0200 Subject: [PATCH] Implement basic change detection. --- action.yml | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/action.yml b/action.yml index 306810b..4bb7b83 100644 --- a/action.yml +++ b/action.yml @@ -45,6 +45,13 @@ inputs: default: auto pre-test-cmd: description: Extra command to invoke before ansible-test + pull-request-change-detection: + description: >- + Whether to use change detection for pull requests. If set to `true`, will + use change detection to determine changed files against the target + branch, and will not upload code coverage results. If the invocation is + not from a pull request, this option is ignored. + default: 'false' python-version: description: >- **(DEPRECATED)** Use `origin-python-version` instead. This is only kept @@ -191,6 +198,44 @@ runs: set +x shell: bash + - name: Log the next step action + run: echo ▷ Figuring out change detection and coverage + shell: bash + - name: Determine change detection and coverage + id: compute-change-detection-coverage + run: | + # Compute whether to use change detection and coverage + import os + import pathlib + import sys + + FILE_APPEND_MODE = 'a' + OUTPUTS_FILE_PATH = pathlib.Path(os.environ['GITHUB_OUTPUT']) + + def set_output(name, value): + with OUTPUTS_FILE_PATH.open(FILE_APPEND_MODE) as outputs_file: + outputs_file.writelines(f'{name}={value}{os.linesep}') + + # Input from GHA + pull_request_change_detection = '${{ + inputs.pull-request-change-detection + }}' + pull_request_branch = '${{ github.event.pull_request.base.ref || '' }}' + + # Compute coverage and change detection arguments + coverage_arg = '--coverage' + change_detection_arg = '' + if pull_request_branch and pull_request_change_detection == 'true': + coverage_arg = '' + change_detection_arg = ( + f'--changed --base-branch {pull_request_branch}' + ) + + # Set computed coverage-arg and change-detection-arg + set_output('coverage-arg', coverage_arg) + set_output('change-detection-arg', change_detection_arg) + shell: python + - name: Log the next step action if: >- !inputs.collection-src-directory @@ -205,6 +250,39 @@ runs: path: .tmp-ansible-collection-checkout persist-credentials: false ref: ${{ inputs.git-checkout-ref }} + fetch-depth: >- + ${{ + steps.compute-change-detection-coverage.outputs.change-detection-arg + && '0' || '1' + }} + + - name: Log the next step action + if: >- + !inputs.collection-src-directory + && steps.compute-change-detection-coverage.outputs.change-detection-arg + run: >- + echo ▷ Create branches for change detection + shell: bash + - name: Create branches for change detection + if: >- + !inputs.collection-src-directory + && steps.compute-change-detection-coverage.outputs.change-detection-arg + run: | + # Create a branch for the current HEAD, which happens to be a merge commit + git checkout -b __action_branch_name + + # Check out the target branch and name it + git checkout -b ${{ + github.event.pull_request.base.ref + }} --track origin/${{ + github.event.pull_request.base.ref + }} + + # Check out the merge commit + git checkout __action_branch_name + shell: bash + working-directory: >- + .tmp-ansible-collection-checkout - name: Log the next step action run: >- @@ -358,7 +436,8 @@ runs: ; ~/.local/bin/ansible-test ${{ inputs.testing-type }} -v --color - --coverage + ${{ steps.compute-change-detection-coverage.outputs.coverage-arg }} + ${{ steps.compute-change-detection-coverage.outputs.change-detection-arg }} ${{ inputs.testing-type == 'sanity' && '--junit' @@ -408,10 +487,12 @@ runs: working-directory: ${{ steps.collection-metadata.outputs.checkout-path }} - name: Log the next step action + if: steps.compute-change-detection-coverage.outputs.coverage-arg != '' run: >- echo ▷ Generating a coverage report... shell: bash - name: Generate coverage report + if: steps.compute-change-detection-coverage.outputs.coverage-arg != '' run: >- set -x ; @@ -425,6 +506,7 @@ runs: working-directory: ${{ steps.collection-metadata.outputs.checkout-path }} - name: Log the next step action + if: steps.compute-change-detection-coverage.outputs.coverage-arg != '' run: >- echo ▷ Sending the coverage data over to https://codecov.io/gh/${{ github.repository }}... @@ -432,6 +514,7 @@ runs: - name: >- Send the coverage data over to https://codecov.io/gh/${{ github.repository }} + if: steps.compute-change-detection-coverage.outputs.coverage-arg != '' uses: codecov/codecov-action@v3 with: files: >-