Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
## CHANGELOG
REPLACE_ME_WITH_CHANGELOG

## SUMMARY
REPLACE_ME_WITH_SUMMARY_OF_THE_CHANGES
Comment on lines +1 to +5

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟢 LOW

Problem: The top-level section is titled ## CHANGELOG, but the template body and PR description emphasize capturing both a changelog and a summary; using only "CHANGELOG" here may confuse authors about where to put a concise summary vs. detailed changelog entry.

Why: Ambiguous section naming can lead to inconsistent usage of the template, with some authors putting only a summary here and skipping the dedicated SUMMARY section, reducing the effectiveness of standardized metadata.

How to Fix: Rename the section to clearly indicate it is for the changelog entry (e.g., “Changelog Entry”) or add clarifying text so authors understand this is the line that will be copied into release notes.

Suggested change
## CHANGELOG
REPLACE_ME_WITH_CHANGELOG
## SUMMARY
REPLACE_ME_WITH_SUMMARY_OF_THE_CHANGES
## CHANGELOG ENTRY
REPLACE_ME_WITH_CHANGELOG
## SUMMARY
REPLACE_ME_WITH_SUMMARY_OF_THE_CHANGES


## FUNCTIONAL AUTOMATION CHANGES PR
- [ ] Yes
- If Yes, PR :
- [ ] No
- If No, Reason:
Comment on lines +7 to +11

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟢 LOW

Problem: The “FUNCTIONAL AUTOMATION CHANGES PR” section uses nested free-text prompts (“If Yes, PR:” / “If No, Reason:”) without a clear placeholder format, which can lead to inconsistent or incomplete entries.

Why: Inconsistent formatting makes it harder to parse this information manually or via tooling, and contributors may leave these lines blank or unclear, reducing the value of the metadata.

How to Fix: Add explicit placeholders (e.g., REPLACE_ME_WITH_LINK / REPLACE_ME_WITH_REASON) or example formats so authors know exactly what to provide.

Suggested change
## FUNCTIONAL AUTOMATION CHANGES PR
- [ ] Yes
- If Yes, PR :
- [ ] No
- If No, Reason:
## FUNCTIONAL AUTOMATION CHANGES PR
- [ ] Yes
- If Yes, PR: REPLACE_ME_WITH_FUNCTIONAL_AUTOMATION_PR_LINK
- [ ] No
- If No, Reason: REPLACE_ME_WITH_REASON_FOR_NO_FUNCTIONAL_AUTOMATION_CHANGES


## AUTOMATION TEST REPORT URL
REPLACE_ME_WITH_TEST_REPORT_URL
Comment on lines +13 to +14

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟢 LOW

Problem: The “AUTOMATION TEST REPORT URL” section requires a URL but does not indicate what to do when no report exists (e.g., for small changes or docs-only PRs).

Why: Lack of guidance can lead to inconsistent entries (left blank, “N/A”, or random text), which complicates automated checks or manual review expectations.

How to Fix: Update the placeholder to explicitly allow NA when no test report is applicable, aligning with the pattern used in other sections.

Suggested change
## AUTOMATION TEST REPORT URL
REPLACE_ME_WITH_TEST_REPORT_URL
## AUTOMATION TEST REPORT URL
REPLACE_ME_WITH_TEST_REPORT_URL_OR_NA


## AREAS OF IMPACT
REPLACE_ME_WITH_AREAS_OF_IMPACT_OR_NA
Comment on lines +16 to +17

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟢 LOW

Problem: The “AREAS OF IMPACT” placeholder suggests NA but does not encourage structured entries (e.g., components, services, or modules), which can lead to vague or low-signal responses.

Why: Unstructured impact descriptions reduce the usefulness of this field for reviewers trying to quickly understand blast radius and for any future automation that might parse this section.

How to Fix: Clarify the expected format (e.g., comma-separated components or example categories) in the placeholder text.

Suggested change
## AREAS OF IMPACT
REPLACE_ME_WITH_AREAS_OF_IMPACT_OR_NA
## AREAS OF IMPACT
REPLACE_ME_WITH_AREAS_OF_IMPACT_EG_BILLING_API_UI_DB_OR_NA


## TYPE OF CHANGE
- [ ] 🐞 Bugfix
- [ ] 🌟 Feature
- [ ] ✨ Enhancement
- [ ] 🧪 Unit Test Cases
- [ ] 📔 Documentation
- [ ] ⚙️ Chore - Build Related / Configuration / Others
Comment on lines +19 to +25

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟢 LOW

Problem: The “TYPE OF CHANGE” checklist uses emojis, which may not render consistently in all environments and can make automated parsing of change types more difficult.

Why: If future tooling needs to parse this section (e.g., for changelog generation or metrics), emojis mixed with labels can complicate reliable extraction of the selected type.

How to Fix: Keep the human-readable labels but move emojis to the end or remove them, ensuring the leading text is a clean, parseable category name.

Suggested change
## TYPE OF CHANGE
- [ ] 🐞 Bugfix
- [ ] 🌟 Feature
- [ ] Enhancement
- [ ] 🧪 Unit Test Cases
- [ ] 📔 Documentation
- [ ] ⚙️ Chore - Build Related / Configuration / Others
## TYPE OF CHANGE
- [ ] Bugfix 🐞
- [ ] Feature 🌟
- [ ] Enhancement
- [ ] Unit Test Cases 🧪
- [ ] Documentation 📔
- [ ] Chore - Build Related / Configuration / Others ⚙️



## DOCUMENTATION
REPLACE_ME_WITH_DOCUMENTATION_LINK_OR_NA
Comment on lines +28 to +29

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟢 LOW

Problem: The file currently has “No newline at end of file”, which is a minor formatting issue and can cause noisy diffs or warnings in some tools.

Why: POSIX and many linters expect text files to end with a newline; missing it can lead to inconsistent behavior across editors and minor friction in future diffs.

How to Fix: Add a trailing newline at the end of the file.

Suggested change
## DOCUMENTATION
REPLACE_ME_WITH_DOCUMENTATION_LINK_OR_NA
## DOCUMENTATION
REPLACE_ME_WITH_DOCUMENTATION_LINK_OR_NA

31 changes: 31 additions & 0 deletions .github/scripts/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Scripts

## Generate changelog

Lists PRs merged into a branch (excludes "Parent branch sync" and bot-authored PRs).

**Prerequisites:** `jq`, and GitHub credentials as env vars.

### Set credentials (once per terminal)

```bash
export GH_USERNAME=your-github-username
export GH_PAT=your-github-personal-access-token
```

### Commands

From repo root:

| What you want | Command |
|---------------|---------|
| PRs merged into **current branch** (last 30 days) | `./.github/scripts/generate-changelog.sh` |
| PRs merged into **master** (last 30 days) | `./.github/scripts/generate-changelog.sh master` |
| PRs merged into **master** since a date | `./.github/scripts/generate-changelog.sh master "merged:>=2025-01-01"` |

### Arguments

1. **Branch** (optional) — default: current branch
2. **Date filter** (optional) — default: last 30 days (e.g. `merged:>=2025-01-01`)

Output includes a GitHub search URL to verify results.
84 changes: 84 additions & 0 deletions .github/scripts/generate-changelog.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#!/bin/bash

set -e

# Check required environment variables
if [[ -z "$GH_USERNAME" ]]; then
echo "❌ Error: Environment variable GH_USERNAME not found"
exit 1
fi

if [[ -z "$GH_PAT" ]]; then
echo "❌ Error: Environment variable GH_PAT not found"
exit 1
fi

# Optional: Branch name (defaults to current branch if not provided)
SOURCE_BRANCH="${1:-$(git branch --show-current)}"
# Optional: Date filter (defaults to last 30 days if not provided)
DATE_FILTER="${2:-merged:>=$(date -u -v-30d +%Y-%m-%d 2>/dev/null || date -u -d '30 days ago' +%Y-%m-%d)}"

# Repo is set per-repo when this file is pushed (placeholder replaced by upload script)
REPO="chargebee/chargebee-ios"
Comment on lines +16 to +22

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟡 MEDIUM

Problem: The DATE_FILTER default uses a GNU/BSD-specific date expression inline in the query string (merged:$DATE_FILTER), which can produce an invalid GitHub search query if the date command fails or behaves differently across environments.

Why: This script is likely to be run in different shells/OSes (e.g., macOS with BSD date, Linux with GNU date), and subtle differences or failures in the date invocation will result in malformed merged: filters, causing the GitHub API call to fail or return unexpected results.

How to Fix: Compute the default date in a separate variable with explicit error handling, then build DATE_FILTER as a simple string (merged:>=YYYY-MM-DD), ensuring the query is always well-formed and easier to debug.

Suggested change
# Optional: Branch name (defaults to current branch if not provided)
SOURCE_BRANCH="${1:-$(git branch --show-current)}"
# Optional: Date filter (defaults to last 30 days if not provided)
DATE_FILTER="${2:-merged:>=$(date -u -v-30d +%Y-%m-%d 2>/dev/null || date -u -d '30 days ago' +%Y-%m-%d)}"
# Repo is set per-repo when this file is pushed (placeholder replaced by upload script)
REPO="chargebee/chargebee-ios"
# Optional: Branch name (defaults to current branch if not provided)
SOURCE_BRANCH="${1:-$(git branch --show-current)}"
# Optional: Date filter (defaults to last 30 days if not provided)
if [[ -z "$2" ]]; then
DEFAULT_DATE=$(date -u -v-30d +%Y-%m-%d 2>/dev/null || date -u -d '30 days ago' +%Y-%m-%d)
DATE_FILTER="merged:>=$DEFAULT_DATE"
else
DATE_FILTER="$2"
fi
# Repo is set per-repo when this file is pushed (placeholder replaced by upload script)
REPO="chargebee/chargebee-ios"


echo "🔍 Searching for PRs merged into $SOURCE_BRANCH..."

# GitHub API call with error handling
HTTP_STATUS=$(curl -s -w "%{http_code}" -G -u "$GH_USERNAME:$GH_PAT" \
"https://api.github.com/search/issues" \
--data-urlencode "q=NOT \"Parent branch sync\" in:title is:pr repo:$REPO is:merged base:$SOURCE_BRANCH merged:$DATE_FILTER -author:app/distributed-gitflow-app" \
-o /tmp/curl_output.json \
2>/tmp/curl_error.log)
Comment on lines +27 to +31

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟡 MEDIUM

Problem: The GitHub search query uses merged:$DATE_FILTER even though DATE_FILTER already includes the merged: prefix, resulting in a duplicated merged: segment (e.g., merged:merged:>=2024-02-10) when the default is used.

Why: A malformed merged: filter can cause the GitHub API to ignore the intended date constraint or return an error, leading to incorrect or empty changelog results.

How to Fix: Pass DATE_FILTER directly into the query without prepending merged:, and ensure DATE_FILTER is constructed as a complete filter string (e.g., merged:>=YYYY-MM-DD).

Suggested change
HTTP_STATUS=$(curl -s -w "%{http_code}" -G -u "$GH_USERNAME:$GH_PAT" \
"https://api.github.com/search/issues" \
--data-urlencode "q=NOT \"Parent branch sync\" in:title is:pr repo:$REPO is:merged base:$SOURCE_BRANCH merged:$DATE_FILTER -author:app/distributed-gitflow-app" \
-o /tmp/curl_output.json \
2>/tmp/curl_error.log)
HTTP_STATUS=$(curl -s -w "%{http_code}" -G -u "$GH_USERNAME:$GH_PAT" \
"https://api.github.com/search/issues" \
--data-urlencode "q=NOT \"Parent branch sync\" in:title is:pr repo:$REPO is:merged base:$SOURCE_BRANCH $DATE_FILTER -author:app/distributed-gitflow-app" \
-o /tmp/curl_output.json \
2>/tmp/curl_error.log)


CURL_EXIT_CODE=$?

echo "🌐 API call status: $HTTP_STATUS"

if [ $CURL_EXIT_CODE -ne 0 ]; then
echo "❌ Error: curl request failed with exit code $CURL_EXIT_CODE"
echo "Error details: $(cat /tmp/curl_error.log)"
exit 1
fi

if [ "$HTTP_STATUS" -ne 200 ]; then
echo "❌ Error: API returned HTTP status $HTTP_STATUS"
echo "Response: $(cat /tmp/curl_output.json)"
exit 1
fi

PR_LIST_RESPONSE=$(cat /tmp/curl_output.json)

# Clean invalid control characters from JSON response
if ! echo "$PR_LIST_RESPONSE" | jq . >/dev/null 2>&1; then
echo "⚠️ Invalid JSON detected — cleaning control characters..."
PR_LIST_RESPONSE=$(echo "$PR_LIST_RESPONSE" | tr -d '\000-\037')

if ! echo "$PR_LIST_RESPONSE" | jq . >/dev/null 2>&1; then
echo "$PR_LIST_RESPONSE" > /tmp/invalid_json_debug.json
echo "❌ Error: JSON is still invalid after cleaning control characters"
echo "💡 Use 'cat /tmp/invalid_json_debug.json' to inspect the JSON"
exit 1
fi
fi

PR_MERGED_COUNT=$(echo "$PR_LIST_RESPONSE" | jq '.total_count')

# Color codes
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NOCOLOR='\033[0m'

echo "=============================================================================="
echo -e "Found ${GREEN}$PR_MERGED_COUNT${NOCOLOR} PR(s) merged into $SOURCE_BRANCH (filter: $DATE_FILTER)"
echo "=============================================================================="
echo -e "## ${GREEN}CHANGELOG${NOCOLOR}"
echo "$PR_LIST_RESPONSE" | jq -r '.items[] | (.title) + " (" + (.user.login) + ") [#" + (.number | tostring) + "]"' | sort
printf "\n"
Comment on lines +71 to +76

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟡 MEDIUM

Problem: The script pipes .items[] into jq without guarding against the case where .items is empty or missing, which will cause jq to exit with a non-zero status and terminate the script due to set -e.

Why: When no PRs match the search criteria, jq -r '.items[] | ...' fails with “Cannot iterate over null (null)” and, under set -e, the script will exit abruptly instead of gracefully reporting that no PRs were found.

How to Fix: Check PR_MERGED_COUNT before iterating, and only run the jq pipeline when the count is greater than zero; otherwise, print a friendly message and continue.

Suggested change
echo "=============================================================================="
echo -e "Found ${GREEN}$PR_MERGED_COUNT${NOCOLOR} PR(s) merged into $SOURCE_BRANCH (filter: $DATE_FILTER)"
echo "=============================================================================="
echo -e "## ${GREEN}CHANGELOG${NOCOLOR}"
echo "$PR_LIST_RESPONSE" | jq -r '.items[] | (.title) + " (" + (.user.login) + ") [#" + (.number | tostring) + "]"' | sort
printf "\n"
echo "=============================================================================="
echo -e "Found ${GREEN}$PR_MERGED_COUNT${NOCOLOR} PR(s) merged into $SOURCE_BRANCH (filter: $DATE_FILTER)"
echo "=============================================================================="
echo -e "## ${GREEN}CHANGELOG${NOCOLOR}"
if [ "$PR_MERGED_COUNT" -gt 0 ]; then
echo "$PR_LIST_RESPONSE" | jq -r '.items[] | (.title) + " (" + (.user.login) + ") [#" + (.number | tostring) + "]"' | sort
else
echo "No merged PRs found for the given branch and date filter."
fi
printf "\n"

echo "=============================================================================="
echo -e "${GREEN}GitHub Search URL (to verify, if required)${NOCOLOR}"
BRANCH_ENCODED=$(echo "$SOURCE_BRANCH" | sed 's/ /%20/g')
echo "https://github.com/$REPO/pulls?q=NOT+%22Parent+branch+sync%22+in%3Atitle+is%3Apr+is%3Amerged+base%3A$BRANCH_ENCODED+merged%3A$DATE_FILTER+-author%3Aapp%2Fdistributed-gitflow-app"
echo "=============================================================================="
Comment on lines +77 to +81

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟢 LOW

Problem: The manual URL construction only encodes spaces in SOURCE_BRANCH and leaves DATE_FILTER unencoded, which can break the verification URL if the filter contains characters that need URL encoding (e.g., : or >).

Why: While GitHub’s web UI is forgiving, unencoded special characters in query parameters can lead to incorrect parsing or require manual fixing by the user, reducing the reliability of the “verification URL” feature.

How to Fix: URL-encode both the branch and the full query string (or at least the dynamic parts) before interpolating them into the URL, using sed or python -c 'import urllib.parse; ...' to ensure proper encoding.

Suggested change
echo "=============================================================================="
echo -e "${GREEN}GitHub Search URL (to verify, if required)${NOCOLOR}"
BRANCH_ENCODED=$(echo "$SOURCE_BRANCH" | sed 's/ /%20/g')
echo "https://github.com/$REPO/pulls?q=NOT+%22Parent+branch+sync%22+in%3Atitle+is%3Apr+is%3Amerged+base%3A$BRANCH_ENCODED+merged%3A$DATE_FILTER+-author%3Aapp%2Fdistributed-gitflow-app"
echo "=============================================================================="
echo "=============================================================================="
echo -e "${GREEN}GitHub Search URL (to verify, if required)${NOCOLOR}"
BRANCH_ENCODED=$(echo "$SOURCE_BRANCH" | sed 's/ /%20/g')
DATE_FILTER_ENCODED=$(echo "$DATE_FILTER" | sed 's/:/%3A/g; s/>/%3E/g; s/ /+/g')
echo "https://github.com/$REPO/pulls?q=NOT+%22Parent+branch+sync%22+in%3Atitle+is%3Apr+is%3Amerged+base%3A$BRANCH_ENCODED+$DATE_FILTER_ENCODED+-author%3Aapp%2Fdistributed-gitflow-app"
echo "=============================================================================="


# Clean up temporary files
rm -f /tmp/curl_output.json /tmp/curl_error.log
13 changes: 13 additions & 0 deletions .github/workflows/pr-lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
name: Common PR Lint

on:
pull_request:
branches: [master, main,staging, dev,develop]
types: [ready_for_review, reopened, review_requested, review_request_removed, opened, edited]
Comment on lines +3 to +6

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟡 MEDIUM

Problem: The branches list in the pull_request trigger is missing spaces after some commas (main,staging, dev,develop), which is inconsistent and can reduce readability/maintainability of the workflow configuration.

Why: While GitHub Actions accepts this syntax, inconsistent formatting makes the workflow harder to scan and increases the chance of subtle mistakes when branches are added/edited later.

How to Fix: Add spaces after all commas in the branches array to keep the list consistently formatted and easier to maintain.

Suggested change
on:
pull_request:
branches: [master, main,staging, dev,develop]
types: [ready_for_review, reopened, review_requested, review_request_removed, opened, edited]
on:
pull_request:
branches: [master, main, staging, dev, develop]
types: [ready_for_review, reopened, review_requested, review_request_removed, opened, edited]


jobs:
pr-lint:
name: Common PR Lint Checks
if: github.base_ref == 'main' || github.base_ref == 'master'
uses: chargebee/cb-cicd-pipelines/.github/workflows/pr-lint.yml@main
Comment on lines +8 to +12

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟢 LOW

Problem: The if condition restricts the job to run only when the base branch is main or master, even though the workflow is triggered for PRs targeting staging, dev, and develop as well.

Why: This mismatch between the trigger branches and the conditional execution can be confusing for maintainers and may lead to incorrect assumptions that lint checks run on all configured branches when they actually do not.

How to Fix: Either narrow the pull_request.branches list to only main and master, or expand the if condition to include the additional branches you intend to support (e.g., staging, dev, develop), depending on the desired behavior.

Suggested change
jobs:
pr-lint:
name: Common PR Lint Checks
if: github.base_ref == 'main' || github.base_ref == 'master'
uses: chargebee/cb-cicd-pipelines/.github/workflows/pr-lint.yml@main
jobs:
pr-lint:
name: Common PR Lint Checks
if: github.base_ref == 'main' || github.base_ref == 'master' || github.base_ref == 'staging' || github.base_ref == 'dev' || startsWith(github.base_ref, 'develop')
uses: chargebee/cb-cicd-pipelines/.github/workflows/pr-lint.yml@main

secrets: inherit
60 changes: 60 additions & 0 deletions .github/workflows/pr-size-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: PR Size Check
on:
pull_request:
types: [ reopened, opened, synchronize, edited, labeled, unlabeled ]
branches:
- develop/**
- dev


jobs:
pre-approval-comment:
name: Announce pending bypass approval
if: ${{ github.event.pull_request.user.login != 'distributed-gitflow-app[bot]' &&
!startsWith(github.head_ref, 'revert-') &&
!startsWith(github.head_ref, 'parent-branch-sync/') &&
contains(github.event.pull_request.labels.*.name, 'pr-size-exception') }}
runs-on: graviton-small-runner
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
const issue_number = context.payload.pull_request.number;

const marker = '<!-- pr-size-bypass-pending -->';
const pending = `${marker}
🛑 The \`pr-size-exception\` label is present. This workflow is **waiting for approvals** from the **[cb-Billing-CAB-reviewers](https://github.com/orgs/chargebee/teams/cb-billing-cab-approvers)**.`;

// create a new comment when the workflow runs
await github.rest.issues.createComment({ owner, repo, issue_number, body: pending });
Comment on lines +21 to +35

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟡 MEDIUM

Problem: The pre-approval-comment job posts a new “pending bypass approval” comment on every run when the label is present, leading to duplicate comments and potential noise on the PR.

Why: Repeated identical comments can clutter the PR discussion, make it harder for reviewers to find relevant information, and may annoy contributors; this is especially likely because the workflow triggers on multiple PR events (synchronize, edited, labeled, unlabeled).

How to Fix: Before creating a new comment, query existing comments on the PR and only post if a comment containing the marker (<!-- pr-size-bypass-pending -->) does not already exist.

Suggested change
steps:
- uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
const issue_number = context.payload.pull_request.number;
const marker = '<!-- pr-size-bypass-pending -->';
const pending = `${marker}
🛑 The \`pr-size-exception\` label is present. This workflow is **waiting for approvals** from the **[cb-Billing-CAB-reviewers](https://github.com/orgs/chargebee/teams/cb-billing-cab-approvers)**.`;
// create a new comment when the workflow runs
await github.rest.issues.createComment({ owner, repo, issue_number, body: pending });
steps:
- uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
const issue_number = context.payload.pull_request.number;
const marker = '<!-- pr-size-bypass-pending -->';
const pending = `${marker}
🛑 The \`pr-size-exception\` label is present. This workflow is **waiting for approvals** from the **[cb-Billing-CAB-reviewers](https://github.com/orgs/chargebee/teams/cb-billing-cab-approvers)**.`;
// Avoid posting duplicate comments with the same marker
const { data: comments } = await github.rest.issues.listComments({
owner,
repo,
issue_number,
per_page: 100,
});
const alreadyPosted = comments.some(comment => comment.body && comment.body.includes(marker));
if (!alreadyPosted) {
await github.rest.issues.createComment({ owner, repo, issue_number, body: pending });
}

pr-size-check:
name: Check PR size
if: ${{ (github.base_ref == 'dev' || startsWith(github.base_ref, 'develop/')) && github.event.pull_request.user.login != 'distributed-gitflow-app[bot]' && !startsWith(github.head_ref, 'revert-') && !startsWith(github.head_ref, 'parent-branch-sync/') }}
runs-on: graviton-small-runner
permissions:
contents: read
pull-requests: write
env:
BYPASS_LABEL: pr-size-exception
environment: ${{ contains(github.event.pull_request.labels.*.name, 'pr-size-exception') && 'cb-billing-reviewers' || '' }}
steps:
- uses: chargebee/cb-cicd-pipelines/.github/actions/pr-size-check@v4.20.3
Comment on lines +43 to +47

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟠 HIGH

Problem: The environment value is conditionally set to an empty string when the bypass label is absent, which is not a valid environment name and can cause the workflow/job to fail or behave unpredictably.

Why: GitHub Actions expects environment to be either omitted or set to a valid environment name; providing an empty string may result in runtime errors or misconfiguration of environment protection rules, undermining the intended approval gating behavior.

How to Fix: Only set the environment field when the pr-size-exception label is present by using a conditional expression that returns null instead of an empty string, which GitHub Actions treats as “not set.”

Suggested change
env:
BYPASS_LABEL: pr-size-exception
environment: ${{ contains(github.event.pull_request.labels.*.name, 'pr-size-exception') && 'cb-billing-reviewers' || '' }}
steps:
- uses: chargebee/cb-cicd-pipelines/.github/actions/pr-size-check@v4.20.3
env:
BYPASS_LABEL: pr-size-exception
environment: ${{ contains(github.event.pull_request.labels.*.name, 'pr-size-exception') && 'cb-billing-reviewers' || null }}
steps:
- uses: chargebee/cb-cicd-pipelines/.github/actions/pr-size-check@v4.20.3

if: ${{ !contains(github.event.pull_request.labels.*.name, env.BYPASS_LABEL) }}
with:
githubToken: ${{ secrets.GITHUB_TOKEN }}
errorSize: 250
warningSize: 200
excludePaths: |
.github/**
.cursor/**


- name: Ensure required check passes when bypassed
Comment on lines +53 to +58

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Priority: 🟢 LOW

Problem: There are two trailing blank lines within the excludePaths block, which are unnecessary and slightly reduce readability of the workflow file.

Why: While this does not affect functionality, extra blank lines inside YAML blocks can make the configuration look untidy and may confuse future editors about whether additional values are intended.

How to Fix: Remove the redundant blank lines so that the excludePaths list ends cleanly after the last intended path.

Suggested change
excludePaths: |
.github/**
.cursor/**
- name: Ensure required check passes when bypassed
excludePaths: |
.github/**
.cursor/**
- name: Ensure required check passes when bypassed

if: ${{ contains(github.event.pull_request.labels.*.name, env.BYPASS_LABEL) }}
run: echo "Bypass active — marking job successful."
Loading