From 6b13ad69ccc727b2dafcdb6d73b57e6c3007af80 Mon Sep 17 00:00:00 2001 From: Pavel Dvorkin Date: Mon, 25 Aug 2025 15:16:40 -0400 Subject: [PATCH 1/3] INFRA-2867-Fix workflow inputs to allow branch name Signed-off-by: Pavel Dvorkin --- .github/scripts/create-platform-release-pr.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/scripts/create-platform-release-pr.sh b/.github/scripts/create-platform-release-pr.sh index 1a2ad16d..81327aa6 100755 --- a/.github/scripts/create-platform-release-pr.sh +++ b/.github/scripts/create-platform-release-pr.sh @@ -306,6 +306,16 @@ create_changelog_pr() { # Need to run from .github-tools context to inherit it's dependencies/environment echo "Current Directory: $(pwd)" PROJECT_GIT_DIR=$(pwd) + + # Resolve previous_version when it's a branch name: fetch and use origin/ + DIFF_BASE="${previous_version}" + if git ls-remote --heads origin "${previous_version}" | grep -qE "\srefs/heads/${previous_version}$"; then + echo "Detected remote branch for previous version: ${previous_version}" + git fetch origin "${previous_version}" + DIFF_BASE="origin/${previous_version}" + fi + + # Switch to github-tools directory cd ./github-tools/ ls -ltra corepack prepare yarn@4.5.1 --activate @@ -313,8 +323,8 @@ create_changelog_pr() { yarn --cwd install echo "Generating test plan csv.." - yarn run gen:commits "${platform}" "${previous_version}" "${release_branch_name}" "${PROJECT_GIT_DIR}" - + yarn run gen:commits "${platform}" "${DIFF_BASE}" "${release_branch_name}" "${PROJECT_GIT_DIR}" + # Skipping Google Sheets update since there is no need for it anymore # TODO: Remove this once the current post-main validation approach is stable # if [[ "${TEST_ONLY:-false}" == 'false' ]]; then From 3dcd328fb44994e0a944df299ef6d65a005bbfd1 Mon Sep 17 00:00:00 2001 From: Pavel Dvorkin Date: Tue, 26 Aug 2025 09:41:38 -0400 Subject: [PATCH 2/3] INFRA-2867-Updated branch variable names to make it clearer Signed-off-by: Pavel Dvorkin --- .github/scripts/create-platform-release-pr.sh | 34 ++++++++++--------- .github/scripts/generate-rc-commits.mjs | 18 +++++----- .github/workflows/create-release-pr.yml | 8 ++--- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/.github/scripts/create-platform-release-pr.sh b/.github/scripts/create-platform-release-pr.sh index 81327aa6..98dcaf7f 100755 --- a/.github/scripts/create-platform-release-pr.sh +++ b/.github/scripts/create-platform-release-pr.sh @@ -8,15 +8,15 @@ # 3. A version bump PR for the main branch # # Usage: -# create-platform-release-pr.sh [new_version_number] [git_user_name] [git_user_email] +# create-platform-release-pr.sh [new_version_number] [git_user_name] [git_user_email] # # Parameters: -# platform - 'mobile' or 'extension' -# previous_version - Previous release version tag (e.g., v7.7.0) -# new_version - New semantic version (e.g., 7.8.0) -# new_version_number - Build version for mobile platform (optional, required for mobile) -# git_user_name - Git user name for commits (optional, defaults to 'metamaskbot') -# git_user_email - Git user email for commits (optional, defaults to 'metamaskbot@users.noreply.github.com') +# platform - 'mobile' or 'extension' +# previous_version_ref - Previous release version tag or branch name (e.g., v7.7.0) +# new_version - New semantic version (e.g., 7.8.0) +# new_version_number - Build version for mobile platform (optional, required for mobile) +# git_user_name - Git user name for commits (optional, defaults to 'metamaskbot') +# git_user_email - Git user email for commits (optional, defaults to 'metamaskbot@users.noreply.github.com') set -e set -u @@ -24,7 +24,7 @@ set -o pipefail # Input validation PLATFORM="${1}" -PREVIOUS_VERSION="${2}" +PREVIOUS_VERSION_REF="${2}" NEW_VERSION="${3}" NEW_VERSION_NUMBER="${4:-}" GIT_USER_NAME="${5:-metamaskbot}" @@ -292,7 +292,7 @@ create_release_pr() { create_changelog_pr() { local platform="$1" local new_version="$2" - local previous_version="$3" + local previous_version_ref="$3" local release_branch_name="$4" local changelog_branch_name="$5" @@ -307,12 +307,14 @@ create_changelog_pr() { echo "Current Directory: $(pwd)" PROJECT_GIT_DIR=$(pwd) - # Resolve previous_version when it's a branch name: fetch and use origin/ - DIFF_BASE="${previous_version}" - if git ls-remote --heads origin "${previous_version}" | grep -qE "\srefs/heads/${previous_version}$"; then - echo "Detected remote branch for previous version: ${previous_version}" - git fetch origin "${previous_version}" - DIFF_BASE="origin/${previous_version}" + # Resolve previous_version_ref when it's a branch name: fetch and use origin/. This enables branch names to be used as previous version references. + DIFF_BASE="${previous_version_ref}" + if git ls-remote --heads origin "${previous_version_ref}" | grep -qE "\srefs/heads/${previous_version_ref}$"; then + echo "Detected remote branch for previous version: ${previous_version_ref}" + git fetch origin "${previous_version_ref}" + DIFF_BASE="origin/${previous_version_ref}" + else + echo "No remote branch detected for previous version: ${previous_version_ref}" fi # Switch to github-tools directory @@ -445,7 +447,7 @@ main() { if [ "$TEST_ONLY" == "true" ]; then echo "Skipping changelog generation in test mode" else - create_changelog_pr "$PLATFORM" "$NEW_VERSION" "$PREVIOUS_VERSION" "$release_branch_name" "$changelog_branch_name" + create_changelog_pr "$PLATFORM" "$NEW_VERSION" "$PREVIOUS_VERSION_REF" "$release_branch_name" "$changelog_branch_name" fi # Step 3: Create version bump PR for main branch diff --git a/.github/scripts/generate-rc-commits.mjs b/.github/scripts/generate-rc-commits.mjs index 0be37e28..850ed814 100644 --- a/.github/scripts/generate-rc-commits.mjs +++ b/.github/scripts/generate-rc-commits.mjs @@ -59,7 +59,7 @@ async function getTeam(repository, prNumber) { } // Function to filter commits based on unique commit messages and group by teams -async function filterCommitsByTeam(platform, branchA, branchB) { +async function filterCommitsByTeam(platform, refA, refB) { const MAX_COMMITS = 500; // Limit the number of commits to process console.log('Filtering commits by team...'); @@ -81,8 +81,8 @@ async function filterCommitsByTeam(platform, branchA, branchB) { const git = simpleGit(); const logOptions = { - from: branchB, - to: branchA, + from: refB, + to: refA, format: { hash: '%H', author: '%an', @@ -92,7 +92,7 @@ async function filterCommitsByTeam(platform, branchA, branchB) { const log = await git.log(logOptions); - console.log(`Total commits between ${branchA} and ${branchB}: ${log.total}`); + console.log(`Total commits between ${refA} and ${refB}: ${log.total}`); console.log(`Processing up to ${Math.min(log.all.length, MAX_COMMITS)} commits...`); const commitsByTeam = {}; @@ -204,15 +204,15 @@ async function main() { if (args.length !== 4) { console.error( - 'Usage: node generate-rc-commits.mjs platform branchA branchB', + 'Usage: node generate-rc-commits.mjs platform refA refB', ); console.error('Received:', args, ' with length:', args.length); process.exit(1); } const platform = args[0]; - const branchA = args[1]; - const branchB = args[2]; + const refA = args[1]; + const refB = args[2]; const gitDir = args[3]; // Change the working directory to the git repository path @@ -220,10 +220,10 @@ async function main() { process.chdir(gitDir); console.log( - `Generating CSV file for commits between ${branchA} and ${branchB} on ${platform} platform...`, + `Generating CSV file for commits between ${refA} and ${refB} on ${platform} platform...`, ); - const commitsByTeam = await filterCommitsByTeam(platform, branchA, branchB); + const commitsByTeam = await filterCommitsByTeam(platform, refA, refB); if (Object.keys(commitsByTeam).length === 0) { console.log('No commits found.'); diff --git a/.github/workflows/create-release-pr.yml b/.github/workflows/create-release-pr.yml index 795ac9d7..8254624f 100644 --- a/.github/workflows/create-release-pr.yml +++ b/.github/workflows/create-release-pr.yml @@ -19,10 +19,10 @@ on: required: false type: string description: 'The build version for the mobile platform.' - previous-version-tag: + previous-version-ref: required: true type: string - description: 'Previous release version tag. eg: v7.7.0' + description: 'Previous release version tag or branch name. eg: v7.7.0' # Flag to indicate if the release is a test release for development purposes only mobile-template-sheet-id: required: false @@ -108,7 +108,7 @@ jobs: echo "Checkout Base Branch: ${{ inputs.checkout-base-branch }}" echo "Release PR Base Branch: ${{ inputs.release-pr-base-branch }}" echo "Semver Version: ${{ inputs.semver-version }}" - echo "Previous Version Tag: ${{ inputs.previous-version-tag }}" + echo "Previous Version Reference: ${{ inputs.previous-version-ref }}" echo "Test Only Mode: ${{ inputs.test-only }}" if [[ "${{ inputs.platform }}" == "mobile" ]]; then echo "Mobile Build Version: ${{ inputs.mobile-build-version }}" @@ -140,7 +140,7 @@ jobs: # Execute the script from github-tools ./github-tools/.github/scripts/create-platform-release-pr.sh \ ${{ inputs.platform }} \ - ${{ inputs.previous-version-tag }} \ + ${{ inputs.previous-version-ref }} \ ${{ inputs.semver-version }} \ ${{ inputs.mobile-build-version }} \ ${{ inputs.git-user-name }} \ From d036fbf427c56d487ef9ec7d1a4e0185bca85cdf Mon Sep 17 00:00:00 2001 From: Pavel Dvorkin Date: Tue, 26 Aug 2025 11:03:38 -0400 Subject: [PATCH 3/3] INFRA-2867: Updated comments set previous branch regex Signed-off-by: Pavel Dvorkin --- .github/scripts/create-platform-release-pr.sh | 27 ++++++++++++++----- .github/scripts/generate-rc-commits.mjs | 1 + .github/workflows/create-release-pr.yml | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.github/scripts/create-platform-release-pr.sh b/.github/scripts/create-platform-release-pr.sh index 98dcaf7f..05e93872 100755 --- a/.github/scripts/create-platform-release-pr.sh +++ b/.github/scripts/create-platform-release-pr.sh @@ -12,7 +12,7 @@ # # Parameters: # platform - 'mobile' or 'extension' -# previous_version_ref - Previous release version tag or branch name (e.g., v7.7.0) +# previous_version_ref - Previous release version branch name, tag or commit hash (e.g., release/7.7.0, v7.7.0, or 76fbc500034db9779e9ff7ce637ac5be1da0493d) # new_version - New semantic version (e.g., 7.8.0) # new_version_number - Build version for mobile platform (optional, required for mobile) # git_user_name - Git user name for commits (optional, defaults to 'metamaskbot') @@ -307,14 +307,27 @@ create_changelog_pr() { echo "Current Directory: $(pwd)" PROJECT_GIT_DIR=$(pwd) - # Resolve previous_version_ref when it's a branch name: fetch and use origin/. This enables branch names to be used as previous version references. + # By default, DIFF_BASE is set to the provided `previous_version_ref` (which can be a branch name, tag, or commit hash). + # If `previous_version_ref` matches a remote branch on origin, we fetch it and update DIFF_BASE to the fully qualified remote ref (`origin/`). + # This is required for the `generate-rc-commits.mjs` script to resolve the branch and successfully run the `git log` command. + # Otherwise, DIFF_BASE remains unchanged. DIFF_BASE="${previous_version_ref}" - if git ls-remote --heads origin "${previous_version_ref}" | grep -qE "\srefs/heads/${previous_version_ref}$"; then - echo "Detected remote branch for previous version: ${previous_version_ref}" - git fetch origin "${previous_version_ref}" - DIFF_BASE="origin/${previous_version_ref}" + + # Only consider known release branch patterns to avoid regex pitfalls: + # - Extension: Version-vx.y.z + # - Mobile: release/x.y.z + if [[ "${previous_version_ref}" =~ ^Version-v[0-9]+\.[0-9]+\.[0-9]+$ || "${previous_version_ref}" =~ ^release/[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Previous version looks like a release branch: ${previous_version_ref}" + # Check if the exact branch exists on origin without interpolating into a regex + if git ls-remote --heads origin "${previous_version_ref}" | grep -q "."; then + echo "Detected remote branch for previous version: ${previous_version_ref}" + git fetch origin "${previous_version_ref}" + DIFF_BASE="origin/${previous_version_ref}" + else + echo "Remote branch not found on origin: ${previous_version_ref}. Will use as-is." + fi else - echo "No remote branch detected for previous version: ${previous_version_ref}" + echo "Previous version is not a recognized release branch pattern. Treating as tag or SHA: ${previous_version_ref}" fi # Switch to github-tools directory diff --git a/.github/scripts/generate-rc-commits.mjs b/.github/scripts/generate-rc-commits.mjs index 850ed814..4c4069b0 100644 --- a/.github/scripts/generate-rc-commits.mjs +++ b/.github/scripts/generate-rc-commits.mjs @@ -59,6 +59,7 @@ async function getTeam(repository, prNumber) { } // Function to filter commits based on unique commit messages and group by teams +// Input parameters refA and refB can be a branch name, a tag or a commit hash (e.g., release/7.7.0, v7.7.0, or 76fbc500034db9779e9ff7ce637ac5be1da0493d) async function filterCommitsByTeam(platform, refA, refB) { const MAX_COMMITS = 500; // Limit the number of commits to process diff --git a/.github/workflows/create-release-pr.yml b/.github/workflows/create-release-pr.yml index 8254624f..bdd85329 100644 --- a/.github/workflows/create-release-pr.yml +++ b/.github/workflows/create-release-pr.yml @@ -22,7 +22,7 @@ on: previous-version-ref: required: true type: string - description: 'Previous release version tag or branch name. eg: v7.7.0' + description: 'Previous release version branch name, tag or commit hash (e.g., release/7.7.0, v7.7.0, or 76fbc500034db9779e9ff7ce637ac5be1da0493d)' # Flag to indicate if the release is a test release for development purposes only mobile-template-sheet-id: required: false