diff --git a/.github/scripts/check_skip_ci.sh b/.github/scripts/check_skip_ci.sh new file mode 100755 index 0000000000..64ef618267 --- /dev/null +++ b/.github/scripts/check_skip_ci.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: MPL-2.0 + +set -euo pipefail + +# Get the list of changed files +# Using `git merge-base` ensures that we're always comparing against the correct branch point. +#For example, given the commits: +# +# A---B---C---D---W---X---Y---Z # origin/main +# \---E---F # feature/branch +# +# ... `git merge-base origin/$SKIP_CHECK_BRANCH HEAD` would return commit `D` +# `...HEAD` specifies from the common ancestor to the latest commit on the current branch (HEAD).. +files_to_check=$(git diff --name-only "$(git merge-base origin/$SKIP_CHECK_BRANCH HEAD~)"...HEAD) + +# Define the directories to check +skipped_directories=("assets" ".changelog/") + +# Loop through the changed files and find directories/files outside the skipped ones +files_to_check_array=($files_to_check) +for file_to_check in "${files_to_check_array[@]}"; do + file_is_skipped=false + echo "checking file: $file_to_check" + + # Allow changes to: + # - This script + # - Files in the skipped directories + # - Markdown files + for dir in "${skipped_directories[@]}"; do + if [[ "$file_to_check" == */check_skip_ci.sh ]] || + [[ "$file_to_check" == "$dir"* ]] || + [[ "$file_to_check" == *.md ]]; then + file_is_skipped=true + break + fi + done + + if [ "$file_is_skipped" != "true" ]; then + echo -e "non-skippable file changed: $file_to_check" + SKIP_CI=false + echo "Changes detected in non-documentation files - will not skip tests and build" + echo "skip-ci=false" >> "$GITHUB_OUTPUT" + exit 0 ## if file is outside of the skipped_directory exit script + fi +done + +echo "Changes detected in only documentation files - skipping tests and build" +echo "skip-ci=true" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 99038bef56..8df906c4c6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,10 +17,19 @@ env: PKG_NAME: "consul-k8s" jobs: + conditional-skip: + uses: ./.github/workflows/reusable-conditional-skip.yml + get-go-version: + # Cascades down to test jobs + needs: [ conditional-skip ] + if: needs.conditional-skip.outputs.skip-ci != 'true' uses: ./.github/workflows/reusable-get-go-version.yml get-product-version: + # Cascades down to test jobs + needs: [ conditional-skip ] + if: needs.conditional-skip.outputs.skip-ci != 'true' runs-on: ubuntu-latest outputs: product-version: ${{ steps.get-product-version.outputs.product-version }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 5b2540cb7d..736c1ad0f0 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -10,8 +10,13 @@ env: SHA: ${{ github.event.pull_request.head.sha || github.sha }} jobs: + conditional-skip: + uses: ./.github/workflows/reusable-conditional-skip.yml + test: name: test + needs: [ conditional-skip ] + if: needs.conditional-skip.outputs.skip-ci != 'true' runs-on: ubuntu-latest steps: - uses: benc-uk/workflow-dispatch@25b02cc069be46d637e8fe2f1e8484008e9e9609 # v1.2.3 diff --git a/.github/workflows/reusable-conditional-skip.yml b/.github/workflows/reusable-conditional-skip.yml new file mode 100644 index 0000000000..ef469ee9aa --- /dev/null +++ b/.github/workflows/reusable-conditional-skip.yml @@ -0,0 +1,24 @@ +name: conditional-skip + +on: + workflow_call: + outputs: + skip-ci: + description: "Whether we should skip build and test jobs" + value: ${{ jobs.check-skip.outputs.skip-ci }} + +jobs: + check-skip: + runs-on: ubuntu-latest + name: Check whether to skip build and tests + outputs: + skip-ci: ${{ steps.check-changed-files.outputs.skip-ci }} + env: + SKIP_CHECK_BRANCH: ${{ github.head_ref || github.ref_name }} + steps: + - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4 + with: + fetch-depth: 0 + - name: Check changed files + id: check-changed-files + run: ./.github/scripts/check_skip_ci.sh \ No newline at end of file diff --git a/.github/workflows/security-scan.yml b/.github/workflows/security-scan.yml index 9f1d3f4af9..120b564301 100644 --- a/.github/workflows/security-scan.yml +++ b/.github/workflows/security-scan.yml @@ -16,7 +16,13 @@ concurrency: cancel-in-progress: true jobs: + conditional-skip: + uses: ./.github/workflows/reusable-conditional-skip.yml + get-go-version: + # Cascades down to test jobs + needs: [ conditional-skip ] + if: needs.conditional-skip.outputs.skip-ci != 'true' uses: ./.github/workflows/reusable-get-go-version.yml scan: