Skip to content

Commit 2dade0f

Browse files
committed
rulesets: implement bypass-app-ids
1 parent 5a0feb8 commit 2dade0f

13 files changed

Lines changed: 122 additions & 21 deletions

File tree

config.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,6 @@ members-without-zulip-id = [
8383
]
8484

8585
enable-rulesets-repos = [
86-
"rust-lang/bors"
86+
"rust-lang/bors",
87+
"rust-lang/crates.io",
8788
]

docs/toml-schema.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,19 @@ allowed-merge-teams = ["awesome-team"]
429429
# When "homu" is used, "bors" has to be in the `bots` array.
430430
# (optional)
431431
merge-bots = ["homu"]
432+
# Whether to enable a merge queue for this branch.
433+
# (optional - default `false`)
434+
merge-queue = false
435+
# GitHub App IDs that are allowed to bypass the branch protection rules.
436+
# The app ID can be found via the GitHub API (GET /orgs/{org}/installations).
437+
# (optional)
438+
bypass-app-ids = [2201425] # workflows-crates-io
439+
# Whether to prevent branch deletion.
440+
# (optional - default `false`)
441+
prevent-deletion = false
442+
# Whether to prevent force pushes to the branch.
443+
# (optional - default `false`)
444+
prevent-force-push = false
432445
```
433446

434447
### Repository environments

repos/rust-lang/bors.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ infra-bors-admins = "write"
1414
pattern = "main"
1515
ci-checks = ["Test", "Test Docker"]
1616
required-approvals = 0
17+
merge-queue = true
1718

1819
[environments.production]
1920
branches = ["main"]

repos/rust-lang/crates.io.toml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@ bots = ["renovate", "rustbot", "heroku-deploy-access"]
77
[access.teams]
88
crates-io = "write"
99

10+
[[branch-protections]]
11+
pattern = "main"
12+
ci-checks = [
13+
"Backend / Lint",
14+
"Backend / Test",
15+
"Backend / dependencies",
16+
"Frontend / Lint",
17+
"Frontend / Test",
18+
]
19+
required-approvals = 0
20+
merge-queue = false
21+
prevent-deletion = true
22+
prevent-force-push = true
23+
bypass-app-ids = [2201425] # workflows-crates-io
24+
1025
[environments.crates-io]
1126

1227
[environments.staging-crates-io]

rust_team_data/src/v1.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,13 @@ pub struct BranchProtection {
260260
pub mode: BranchProtectionMode,
261261
pub allowed_merge_teams: Vec<String>,
262262
pub merge_bots: Vec<MergeBot>,
263+
#[serde(default)]
264+
pub bypass_app_ids: Vec<i64>,
265+
pub merge_queue: bool,
266+
#[serde(default)]
267+
pub prevent_deletion: bool,
268+
#[serde(default)]
269+
pub prevent_force_push: bool,
263270
}
264271

265272
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]

src/schema.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,14 @@ pub(crate) struct BranchProtection {
879879
pub allowed_merge_teams: Vec<String>,
880880
#[serde(default)]
881881
pub merge_bots: Vec<MergeBot>,
882+
#[serde(default)]
883+
pub bypass_app_ids: Vec<i64>,
884+
#[serde(default)]
885+
pub merge_queue: bool,
886+
#[serde(default)]
887+
pub prevent_deletion: bool,
888+
#[serde(default)]
889+
pub prevent_force_push: bool,
882890
}
883891

884892
#[derive(serde_derive::Deserialize, Debug)]

src/static_api.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ impl<'a> Generator<'a> {
7171
MergeBot::Bors => v1::MergeBot::Bors,
7272
})
7373
.collect(),
74+
bypass_app_ids: b.bypass_app_ids.clone(),
75+
merge_queue: b.merge_queue,
76+
prevent_deletion: b.prevent_deletion,
77+
prevent_force_push: b.prevent_force_push,
7478
})
7579
.collect();
7680
let managed_by_bors = r.bots.contains(&Bot::Bors);

sync-team/src/github/api/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,12 +562,12 @@ pub(crate) struct RulesetBypassActor {
562562
}
563563

564564
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
565-
#[serde(rename_all = "snake_case")]
566565
pub(crate) enum RulesetActorType {
567566
Integration,
568567
OrganizationAdmin,
569568
RepositoryRole,
570569
Team,
570+
DeployKey,
571571
}
572572

573573
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]

sync-team/src/github/mod.rs

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,16 @@ pub fn construct_ruleset(branch_protection: &rust_team_data::v1::BranchProtectio
966966

967967
let mut rules: Vec<RulesetRule> = Vec::new();
968968

969+
// Add deletion protection if requested
970+
if branch_protection.prevent_deletion {
971+
rules.push(RulesetRule::Deletion);
972+
}
973+
974+
// Add non-fast-forward protection if requested
975+
if branch_protection.prevent_force_push {
976+
rules.push(RulesetRule::NonFastForward);
977+
}
978+
969979
// Add pull request rule if PRs are required
970980
if let BranchProtectionMode::PrRequired {
971981
required_approvals, ..
@@ -1003,29 +1013,39 @@ pub fn construct_ruleset(branch_protection: &rust_team_data::v1::BranchProtectio
10031013
});
10041014
}
10051015

1006-
// Enable merge queue with default settings
1007-
rules.push(RulesetRule::MergeQueue {
1008-
parameters: MergeQueueParameters {
1009-
check_response_timeout_minutes: 360,
1010-
grouping_strategy: MergeQueueGroupingStrategy::Allgreen,
1011-
max_entries_to_build: 5,
1012-
max_entries_to_merge: 5,
1013-
merge_method: MergeQueueMergeMethod::Merge,
1014-
min_entries_to_merge: 0,
1015-
min_entries_to_merge_wait_minutes: 0,
1016-
},
1017-
});
1016+
if branch_protection.merge_queue {
1017+
// Enable merge queue with default settings
1018+
rules.push(RulesetRule::MergeQueue {
1019+
parameters: MergeQueueParameters {
1020+
check_response_timeout_minutes: 360,
1021+
grouping_strategy: MergeQueueGroupingStrategy::Allgreen,
1022+
max_entries_to_build: 5,
1023+
max_entries_to_merge: 5,
1024+
merge_method: MergeQueueMergeMethod::Merge,
1025+
min_entries_to_merge: 0,
1026+
min_entries_to_merge_wait_minutes: 0,
1027+
},
1028+
});
1029+
}
10181030

1019-
// TODO: Add bypass actors based on allowed_merge_teams and merge_bots
1020-
// This would require fetching team IDs, which needs more integration
1031+
// Build bypass actors from app IDs
1032+
let bypass_actors: Vec<RulesetBypassActor> = branch_protection
1033+
.bypass_app_ids
1034+
.iter()
1035+
.map(|&app_id| RulesetBypassActor {
1036+
actor_id: app_id,
1037+
actor_type: RulesetActorType::Integration,
1038+
bypass_mode: RulesetBypassMode::Always,
1039+
})
1040+
.collect();
10211041

10221042
api::Ruleset {
10231043
id: None,
10241044
name: format!("Ruleset for {}", branch_protection.pattern),
10251045
target: RulesetTarget::Branch,
10261046
source_type: RulesetSourceType::Repository,
10271047
enforcement: RulesetEnforcement::Active,
1028-
bypass_actors: Some(vec![]),
1048+
bypass_actors: Some(bypass_actors),
10291049
conditions: RulesetConditions {
10301050
ref_name: RulesetRefNameCondition {
10311051
include: vec![convert_branch_pattern_to_ref_pattern(

sync-team/src/github/tests/test_utils.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,10 @@ pub struct BranchProtectionBuilder {
427427
pub mode: BranchProtectionMode,
428428
pub allowed_merge_teams: Vec<String>,
429429
pub merge_bots: Vec<MergeBot>,
430+
pub bypass_app_ids: Vec<i64>,
431+
pub merge_queue: bool,
432+
pub prevent_deletion: bool,
433+
pub prevent_force_push: bool,
430434
}
431435

432436
impl BranchProtectionBuilder {
@@ -451,13 +455,21 @@ impl BranchProtectionBuilder {
451455
mode,
452456
allowed_merge_teams,
453457
merge_bots,
458+
bypass_app_ids,
459+
merge_queue,
460+
prevent_deletion,
461+
prevent_force_push,
454462
} = self;
455463
v1::BranchProtection {
456464
pattern,
457465
dismiss_stale_review,
458466
mode,
459467
allowed_merge_teams,
460468
merge_bots,
469+
bypass_app_ids,
470+
merge_queue,
471+
prevent_deletion,
472+
prevent_force_push,
461473
}
462474
}
463475

@@ -468,6 +480,10 @@ impl BranchProtectionBuilder {
468480
dismiss_stale_review: false,
469481
allowed_merge_teams: vec![],
470482
merge_bots: vec![],
483+
bypass_app_ids: vec![],
484+
merge_queue: false,
485+
prevent_deletion: false,
486+
prevent_force_push: false,
471487
}
472488
}
473489
}

0 commit comments

Comments
 (0)