From 01f29987fa0c27b7df5d1d9120f95f3aebf0bcd6 Mon Sep 17 00:00:00 2001 From: Mohammed Mesaoudi Date: Wed, 12 Feb 2025 15:45:16 +0100 Subject: [PATCH] feat: Trigger warning for PRs likely requiring updates to management-plane-charts (#2219) * Add GH workflow for detecting changes under config directory * Enhance the workflow for checking manifests changes as well. * Splitted jobs and added the possibility to remove label if the manifests is fixed. * rename workflow name * changed into $GITHUB_OUTPUT instead of using env vars: $GITHUB_ENV * Refactoring * chenged Implementation * Include others in .github/ * Cosmetic changes --- .github/workflows/check-manifests-changes.yml | 123 ++++++++++++++++++ .github/workflows/check-pipeline-changes.yml | 87 +++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 .github/workflows/check-manifests-changes.yml create mode 100644 .github/workflows/check-pipeline-changes.yml diff --git a/.github/workflows/check-manifests-changes.yml b/.github/workflows/check-manifests-changes.yml new file mode 100644 index 0000000000..fa3ce6c236 --- /dev/null +++ b/.github/workflows/check-manifests-changes.yml @@ -0,0 +1,123 @@ +name: "Check If Manifests Change" + +env: + PR_CACHE_KEY: pr-manifests-${{ github.run_id }}-${{ github.run_attempt }} + MAIN_CACHE_KEY: main-manifests-${{ github.run_id }}-${{ github.run_attempt }} + +on: + pull_request: + +jobs: + create-pr-manifests: + runs-on: ubuntu-latest + steps: + - name: Checkout PR branch + uses: actions/checkout@v4 + + - name: Create manifests on PR branch + run: | + make dry-run-control-plane + mkdir -p ./cache/pr + mv ./dry-run/manifests.yaml ./cache/pr/manifests.yaml + + - name: Save PR manifests in cache + uses: actions/cache@v3 + with: + path: ./cache/pr/ + key: ${{ env.PR_CACHE_KEY }} + + create-main-manifests: + runs-on: ubuntu-latest + steps: + - name: Checkout main branch + uses: actions/checkout@v4 + with: + ref: main + + - name: Create manifests on main branch + run: | + make dry-run-control-plane + mkdir -p ./cache/main + mv ./dry-run/manifests.yaml ./cache/main/manifests.yaml + + - name: Save main manifests in cache + uses: actions/cache@v3 + with: + path: ./cache/main/ + key: ${{ env.MAIN_CACHE_KEY }} + + diff-manifests: + needs: + - create-pr-manifests + - create-main-manifests + runs-on: ubuntu-latest + steps: + - name: Restore PR manifests from cache + uses: actions/cache@v3 + with: + path: ./cache/pr/ + key: ${{ env.PR_CACHE_KEY }} + + - name: Restore main manifests from cache + uses: actions/cache@v3 + with: + path: ./cache/main/ + key: ${{ env.MAIN_CACHE_KEY }} + + - name: Compare Manifests + id: compare-manifests + run: | + set +e + DIFF_OUTPUT=$(diff ./cache/pr/manifests.yaml ./cache/main/manifests.yaml) + EXIT_CODE=$? + if [[ $EXIT_CODE != 0 ]]; then + echo "❌ Detected differences in manifest outputs!" + echo "$DIFF_OUTPUT" + echo "manifests_diff_detected=true" >> $GITHUB_OUTPUT + else + echo "✅ No differences in manifest outputs detected." + echo "manifests_diff_detected=false" >> $GITHUB_OUTPUT + fi + exit 0 + + - name: Add PR Comment if Manifest Differences Detected + if: steps.compare-manifests.outputs.manifests_diff_detected == 'true' + uses: actions/github-script@v7 + with: + script: | + github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + body: "❌ **Manifests created with 'make dry-run-control-plane' changed!** Please make sure to check if changes are needed in related repositories like management-plane-charts, runtime-watchter, etc.." + }); + github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + labels: ["manifests-diff"] + }); + + - name: Remove 'manifests-diff' Label if No Differences + if: steps.compare-manifests.outputs.manifests_diff_detected == 'false' + uses: actions/github-script@v7 + with: + script: | + const labelName = 'manifests-diff'; + const { data: labels } = await github.rest.issues.listLabelsOnIssue({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + }); + if (labels.some(label => label.name === labelName)) { + console.log(`Label "${labelName}" found, removing it.`); + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + name: labelName, + }); + } else { + console.log(`Label "${labelName}" not found, skipping removal.`); + } + diff --git a/.github/workflows/check-pipeline-changes.yml b/.github/workflows/check-pipeline-changes.yml new file mode 100644 index 0000000000..9f56e12f5d --- /dev/null +++ b/.github/workflows/check-pipeline-changes.yml @@ -0,0 +1,87 @@ +name: "Check Pipeline Changes" + +on: + pull_request: + +jobs: + check-pipeline-changes: + runs-on: ubuntu-latest + steps: + - name: Get list of changed files + id: changed-files + uses: actions/github-script@v7 + with: + script: | + const { data: files } = await github.rest.pulls.listFiles({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.payload.pull_request.number, + }); + // Define the pipeline-related paths to watch + const pathsToCheck = [ + ".github/actions", + ".github/workflows/test-e2e.yml", + ".github/workflows/test-e2e-with-modulereleasemeta.yml", + ".github/scripts", + "scripts/tests", + "versions.yaml" + ]; + + const pipelineFiles = files.filter(file => + pathsToCheck.some(path => file.filename === path || file.filename.startsWith(path + '/')) + ); + core.setOutput('pipelineFiles', pipelineFiles.map(file => file.filename).join(',')); + + - name: Evaluate Pipeline Changes + id: eval-changes + run: | + echo "Changed pipeline-related files:" + echo "${{ steps.changed-files.outputs.pipelineFiles }}" | tr ',' '\n' + if [ -n "${{ steps.changed-files.outputs.pipelineFiles }}" ]; then + echo "⚠️ Pipeline-related changes detected!" + echo "pipeline_changed=true" >> $GITHUB_OUTPUT + else + echo "✅ No pipeline-related changes detected." + echo "pipeline_changed=false" >> $GITHUB_OUTPUT + fi + + - name: Add PR Comment & Label if Pipeline Changes Detected + if: steps.eval-changes.outputs.pipeline_changed == 'true' + uses: actions/github-script@v7 + with: + script: | + github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + body: "⚠️ **Pipeline-related file changes detected!** Please review if related updates (e.g. manifest generation or workflow adjustments) are required." + }); + github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + labels: ["pipeline-changed"] + }); + + - name: Remove 'pipeline-changed' Label if No Changes Detected + if: steps.eval-changes.outputs.pipeline_changed == 'false' + uses: actions/github-script@v7 + with: + script: | + const labelName = 'pipeline-changed'; + const { data: labels } = await github.rest.issues.listLabelsOnIssue({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + }); + if (labels.some(label => label.name === labelName)) { + console.log(`Label "${labelName}" found, removing it.`); + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.payload.pull_request.number, + name: labelName, + }); + } else { + console.log(`Label "${labelName}" not found, skipping removal.`); + }