Skip to content

Commit

Permalink
Map affected files to modules
Browse files Browse the repository at this point in the history
  • Loading branch information
chudilka1 committed Dec 9, 2024
1 parent 58194e2 commit e7a50e0
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 4 deletions.
41 changes: 41 additions & 0 deletions .github/scripts/map-affected-files-to-modules.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/bin/bash
set -e

# Get the list of changed files from the JSON payload
changed_files=$(echo "$1" | jq -r '.[]')
echo "Changed files: ${changed_files[@]}"

# Find all modules in the repository, strip the leading './' and remove duplicates
modules=$(find . -name 'go.mod' -exec dirname {} \; | sed 's|^./||' | uniq)
echo "Found modules: ${modules[@]}"

# An associative array to track unique modules (since bash v4)
declare -A unique_modules

# Loop through each changed file and determine its module
for path_to_file in $changed_files; do
echo "Resolving a module affected by a file: '$path_to_file'"
for module in $modules; do
echo "Checking against module: '$module'"
if [[ ! $path_to_file =~ \/ ]]; then # if no slash in the path it is the root (i.e. main.go vs .gitignore)
echo "File '$path_to_file' is a file in the root."
unique_modules["."]="."
break
# skip adding a dot to the affected_modules
# if the path to a file matches the path to a module,
# add it to affected_modules
elif [[ $module != "." && $path_to_file =~ ^$module* ]]; then
echo "File '$path_to_file' is in the module '$module'"
unique_modules["$module"]="$module"
break
fi
done
done

# Convert associative array keys to an indexed array
affected_modules=("${!unique_modules[@]}")
echo "Affected modules: ${affected_modules[@]}"

# Convert the array to a JSON array
json_array=$(printf '%s\n' "${affected_modules[@]}" | jq -R . | jq -s . | jq -c)
echo "module_names=$json_array" >> $GITHUB_OUTPUT
27 changes: 23 additions & 4 deletions .github/workflows/ci-core.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
permissions:
pull-requests: read
outputs:
affected-packages: ${{ steps.match-every.outputs.non-ignored_files }}
affected-packages: ${{ toJson(steps.resolved-modules.outputs.module_names) }}
deployment-changes: ${{ steps.match-some.outputs.deployment == 'true' }}
should-run-ci-core: ${{ steps.match-some.outputs.core-ci == 'true' || steps.match-every.outputs.non-ignored == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule' }}
should-run-golangci: ${{ steps.match-some.outputs.golang-ci == 'true' || steps.match-every.outputs.non-ignored == 'true' || github.event_name == 'workflow_dispatch' }}
Expand Down Expand Up @@ -96,14 +96,33 @@ jobs:
- '!nix-darwin-shell-hook.sh'
- '!LICENSE'
- '!.github/**'
- name: TEST
run: echo "${{ steps.match-every.outputs.non-ignored_files }}"
- name: Resolve affected files to modules
if: ${{ steps.match-every.outputs.non-ignored == 'true' }}
id: resolved-modules
shell: bash
run: |
bash ./.github/scripts/map-affected-files-to-modules.sh '${{ steps.match-every.outputs.non-ignored_files }}'
test-filter:
name: Test Filter
needs: [filter]
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/[email protected]
- name: Test Filter 1
shell: bash
run: echo "${{ needs.filter.outputs.affected-packages }}"
- name: Test Filter 2
shell: bash
run: echo "${{ fromJson(needs.filter.outputs.affected-packages) }}"

golangci:
name: lint
needs: [filter, run-frequency]
# We don't directly merge dependabot PRs, so let's not waste the resources.
if: ${{ (github.event_name == 'pull_request' || github.event_name == 'schedule') && github.actor != 'dependabot[bot]' && needs.filter.outputs.should-run-golangci == 'true' }}
needs: [filter, run-frequency]
permissions:
# To annotate code in the PR.
checks: write
Expand Down

0 comments on commit e7a50e0

Please sign in to comment.