Skip to content
Merged
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
2 changes: 1 addition & 1 deletion .github/workflows/release_process_backports.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,6 @@ jobs:
- name: Process Pending Backports
run: |
bazel run //tools/private/release -- \
process-backports --issue ${{ inputs.issue }}
process-backports --issue ${{ inputs.issue }} --remote origin
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2 changes: 1 addition & 1 deletion .github/workflows/release_promote_rc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@ jobs:
- name: Run Promote RC
run: |
bazel run //tools/private/release -- \
promote-rc ${{ inputs.version }}
promote-rc ${{ inputs.version }} --remote origin
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
34 changes: 19 additions & 15 deletions tests/tools/private/release/release_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,9 @@ def test_replace_version_next_excludes_bazel_dirs(self):
def test_valid_version(self):
# These should not raise an exception
releaser.create_parser().parse_args(["prepare", "0.28.0"])
releaser.create_parser().parse_args(["promote-rc", "1.0.0"])
releaser.create_parser().parse_args(
["promote-rc", "1.0.0", "--remote", "origin"]
)
releaser.create_parser().parse_args(
["create-release-issue", "--version", "1.2.3rc4"]
)
Expand Down Expand Up @@ -1112,7 +1114,7 @@ def setUp(self):

def test_promote_rc_success(self):
# Arrange
args = MagicMock(version="2.0.0", issue=123, dry_run=False)
args = MagicMock(version="2.0.0", issue=123, dry_run=False, remote="my-remote")
self.mock_git.get_remote_tags.return_value = ["2.0.0-rc0", "2.0.0-rc1"]
self.mock_git.get_commit_sha.return_value = "abcdef123456"
self.mock_git.tag_exists.return_value = False
Expand All @@ -1124,12 +1126,12 @@ def test_promote_rc_success(self):

# Assert
self.assertEqual(result, 0)
self.mock_git.fetch.assert_called_once_with("upstream", tags=True, force=True)
self.mock_git.fetch.assert_called_once_with("my-remote", tags=True, force=True)
self.mock_git.get_commit_sha.assert_called_once_with("2.0.0-rc1")
self.mock_git.checkout.assert_not_called()
self.mock_git.tag_exists.assert_called_once_with("2.0.0")
self.mock_git.tag.assert_called_once_with("2.0.0", "abcdef123456")
self.mock_git.push.assert_called_once_with("upstream", "2.0.0")
self.mock_git.push.assert_called_once_with("my-remote", "2.0.0")

# Verify issue update
self.mock_gh.get_issue_body.assert_called_once_with(123)
Expand All @@ -1148,7 +1150,7 @@ def test_promote_rc_success(self):

def test_promote_rc_resolve_issue_success(self):
# Arrange
args = MagicMock(version="2.0.0", issue=None, dry_run=False)
args = MagicMock(version="2.0.0", issue=None, dry_run=False, remote="my-remote")
self.mock_git.get_remote_tags.return_value = ["2.0.0-rc1"]
self.mock_git.tag_exists.return_value = False
self.mock_gh.get_release_tracking_issue.side_effect = None
Expand All @@ -1162,11 +1164,12 @@ def test_promote_rc_resolve_issue_success(self):

# Assert
self.assertEqual(result, 0)
self.mock_git.fetch.assert_called_once_with("my-remote", tags=True, force=True)
self.mock_gh.get_release_tracking_issue.assert_called_once_with("2.0.0")
self.mock_git.get_commit_sha.assert_called_once_with("2.0.0-rc1")
self.mock_git.checkout.assert_not_called()
self.mock_git.tag.assert_called_once_with("2.0.0", "abcdef123456")
self.mock_git.push.assert_called_once_with("upstream", "2.0.0")
self.mock_git.push.assert_called_once_with("my-remote", "2.0.0")
self.mock_gh.get_issue_body.assert_called_once_with(123)
expected_updated_body = (
"- [x] Tag Final | status=done tag=2.0.0 commit=abcdef12"
Expand All @@ -1183,7 +1186,7 @@ def test_promote_rc_resolve_issue_success(self):

def test_promote_rc_defaults_to_determine_next_version(self):
# Arrange
args = MagicMock(version=None, issue=123, dry_run=False)
args = MagicMock(version=None, issue=123, dry_run=False, remote="my-remote")
self.mock_git.get_current_branch.return_value = "release/2.0"
self.mock_git.get_tags.return_value = ["2.0.0"]
self.mock_git.get_remote_tags.return_value = ["2.0.1-rc0"]
Expand All @@ -1197,14 +1200,15 @@ def test_promote_rc_defaults_to_determine_next_version(self):

# Assert
self.assertEqual(result, 0)
self.mock_git.fetch.assert_called_once_with("my-remote", tags=True, force=True)
self.mock_git.get_current_branch.assert_called_once()
self.mock_git.get_tags.assert_called_once()
self.mock_git.get_remote_tags.assert_called_once_with("upstream")
self.mock_git.get_remote_tags.assert_called_once_with("my-remote")

self.mock_git.checkout.assert_not_called()
self.mock_git.get_commit_sha.assert_called_once_with("2.0.1-rc0")
self.mock_git.tag.assert_called_once_with("2.0.1", "12345678")
self.mock_git.push.assert_called_once_with("upstream", "2.0.1")
self.mock_git.push.assert_called_once_with("my-remote", "2.0.1")

expected_updated_body = (
"- [x] Tag Final | status=done tag=2.0.1 commit=12345678"
Expand All @@ -1221,7 +1225,7 @@ def test_promote_rc_defaults_to_determine_next_version(self):

def test_promote_rc_dry_run_success(self):
# Arrange
args = MagicMock(version="2.0.0", issue=123, dry_run=True)
args = MagicMock(version="2.0.0", issue=123, dry_run=True, remote="my-remote")
self.mock_git.get_remote_tags.return_value = ["2.0.0-rc0", "2.0.0-rc1"]
self.mock_git.get_commit_sha.return_value = "abcdef123456"
self.mock_git.tag_exists.return_value = False
Expand All @@ -1233,7 +1237,7 @@ def test_promote_rc_dry_run_success(self):

# Assert
self.assertEqual(result, 0)
self.mock_git.fetch.assert_called_once_with("upstream", tags=True, force=True)
self.mock_git.fetch.assert_called_once_with("my-remote", tags=True, force=True)
self.mock_git.get_commit_sha.assert_called_once_with("2.0.0-rc1")
self.mock_git.tag_exists.assert_called_once_with("2.0.0")

Expand All @@ -1245,7 +1249,7 @@ def test_promote_rc_dry_run_success(self):

def test_promote_rc_tag_already_exists(self):
# Arrange
args = MagicMock(version="2.0.0", issue=123)
args = MagicMock(version="2.0.0", issue=123, remote="my-remote")
self.mock_git.get_remote_tags.return_value = ["2.0.0-rc1"]
self.mock_git.tag_exists.return_value = True

Expand All @@ -1262,7 +1266,7 @@ def test_promote_rc_tag_already_exists(self):

def test_promote_rc_issue_not_found(self):
# Arrange
args = MagicMock(version="2.0.0", issue=None)
args = MagicMock(version="2.0.0", issue=None, remote="my-remote")
self.mock_git.get_remote_tags.return_value = ["2.0.0-rc1"]
self.mock_git.tag_exists.return_value = False
self.mock_gh.get_release_tracking_issue.side_effect = NoTrackingIssueError(
Expand All @@ -1282,7 +1286,7 @@ def test_promote_rc_issue_not_found(self):

def test_promote_rc_issue_malformed(self):
# Arrange
args = MagicMock(version="2.0.0", issue=123)
args = MagicMock(version="2.0.0", issue=123, remote="my-remote")
self.mock_git.get_remote_tags.return_value = ["2.0.0-rc1"]
self.mock_git.tag_exists.return_value = False
self.mock_git.get_commit_sha.return_value = "abcdef123456"
Expand All @@ -1302,7 +1306,7 @@ def test_promote_rc_issue_malformed(self):

def test_promote_rc_no_rc_found(self):
# Arrange
args = MagicMock(version="2.0.0", issue=123)
args = MagicMock(version="2.0.0", issue=123, remote="my-remote")
self.mock_git.get_remote_tags.return_value = []

# Act
Expand Down
16 changes: 11 additions & 5 deletions tools/private/release/promote_rc.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,14 @@ def __init__(self, args, git: Git, gh: GitHub):
def run(self) -> int:
"""Executes the promote-rc subcommand (Phase 3)."""
args = self.args
# Fetch from upstream to ensure we have the latest tags
self.git.fetch("upstream", tags=True, force=True)
# Fetch from remote to ensure we have the latest tags
self.git.fetch(args.remote, tags=True, force=True)

version = args.version
if version is None:
version = determine_next_version()

latest_rc = get_latest_rc_tag(version, remote="upstream")
latest_rc = get_latest_rc_tag(version, remote=args.remote)
if not latest_rc:
print(f"Error: No release candidate tags found matching {version}-rc*")
return 1
Expand Down Expand Up @@ -86,9 +86,9 @@ def run(self) -> int:
f" {commit_sha[:8]}) using tracking issue #{issue_num}..."
)

# Tag the specific commit without checkout, and push to upstream
# Tag the specific commit without checkout, and push to remote
self.git.tag(version, commit_sha)
self.git.push("upstream", version)
self.git.push(args.remote, version)
Comment thread
rickeylev marked this conversation as resolved.

print(f"Updating tracking issue #{issue_num} checklist...")
self.gh.update_issue_body(issue_num, updated_body)
Expand Down Expand Up @@ -127,6 +127,12 @@ def add_parser(cls, subparsers):
type=int,
help="The tracking issue number (optional).",
)
parser.add_argument(
"--remote",
type=str,
required=True,
help="The git remote to push the final tag to (required).",
)
Comment thread
rickeylev marked this conversation as resolved.
parser.add_argument(
"--dry-run",
action=argparse.BooleanOptionalAction,
Expand Down