Skip to content

Add Bitbucket Data Center automation event source#137

Merged
ak684 merged 1 commit into
mainfrom
alona/bitbucket-dc-source
May 23, 2026
Merged

Add Bitbucket Data Center automation event source#137
ak684 merged 1 commit into
mainfrom
alona/bitbucket-dc-source

Conversation

@ak684
Copy link
Copy Markdown
Contributor

@ak684 ak684 commented May 23, 2026

Summary

  • add a built-in bitbucket_data_center automation event parser keyed by Bitbucket DC eventKey
  • reserve bitbucket_data_center as a built-in source and wire it to the shared automation webhook secret
  • add parser, reserved-source, and event-router coverage for Bitbucket DC events

Test plan

  • Human tested the changes
  • env PYTHONPATH=. uv run ruff format --check openhands/automation/event_schemas/__init__.py openhands/automation/event_schemas/bitbucket_data_center.py openhands/automation/schemas.py openhands/automation/utils/webhook.py tests/test_event_router.py tests/test_event_schemas.py tests/test_webhook_router.py
  • env PYTHONPATH=. uv run ruff check openhands/automation/event_schemas/__init__.py openhands/automation/event_schemas/bitbucket_data_center.py openhands/automation/schemas.py openhands/automation/utils/webhook.py tests/test_event_router.py tests/test_event_schemas.py tests/test_webhook_router.py
  • env PYTHONPATH=. uv run pytest tests/test_event_schemas.py tests/test_webhook_router.py -q (84 passed)
  • R01 OHE E2E: created Bitbucket DC automations through the automation API, forwarded signed Bitbucket DC webhook events through OpenHands, and verified automation matching for pr:opened, repo:refs_changed, pr:comment:added, and pr:reviewer:approved.
  • R01 OHE completion E2E: pr:reviewer:approved created automation run ef186555-53b0-4830-a7b9-6f83a5b49087, dispatched sandbox 5oJ2T2breoJ4ZKZ15Q5Sb8, and completed successfully with no error.

Note: I did not run the DB-backed tests/test_event_router.py module locally because this environment does not have Docker/Testcontainers available; CI should cover it.

@github-actions
Copy link
Copy Markdown

🚀 Deploy Preview PR Created/Updated

A deploy preview has been created/updated for this PR.

Deploy PR: https://github.com/OpenHands/deploy/pull/4403
Automation SHA: 9842f9fc201bb01e4d681fcc0c0b57d4afb1ac75
Last updated: May 22, 2026, 08:16:43 PM ET

Once the deploy PR's CI passes, the automation service will be deployed to the feature environment.

@github-actions
Copy link
Copy Markdown

Coverage

Coverage Report
FileStmtsMissCoverMissing
__init__.py10100% 
app.py1518345%41, 44, 47, 53, 55, 58, 61–64, 67, 72–74, 76, 81–82, 84, 86–88, 90, 94, 96–97, 99–100, 103–109, 112–113, 116, 123–124, 127–128, 132, 140–141, 144, 151–152, 154, 157–158, 161, 166–174, 176–178, 284–286, 291–292, 294–295, 297, 300–302, 304–305, 307–308, 313–314, 318, 321, 323
auth.py147795%84, 112, 121, 158, 311, 319–320
config.py1580100% 
constants.py170100% 
db.py672956%60, 74–75, 78–80, 82, 89, 92–93, 96, 104, 111, 144, 147–148, 152–153, 161, 169, 174, 201, 204–210
dispatcher.py1864575%70, 82, 84–85, 137, 199–202, 237, 240, 255–256, 262–264, 281–282, 288–292, 295–297, 307, 373–374, 399–406, 426, 441–442, 456–457, 466–467, 469
event_router.py591967%83, 88, 119–121, 137–138, 156, 158, 160–161, 163, 173, 179–181, 184, 186, 188
exceptions.py40100% 
execution.py22013339%39–41, 76–79, 87–91, 93, 101–103, 108–112, 114, 128–131, 133, 135, 137–140, 142–147, 149, 151–158, 160–161, 163, 199–201, 207–209, 220–223, 229–231, 271–275, 284, 292, 296, 298–299, 304–305, 310, 388–389, 473–475, 477–483, 486–487, 489, 491–493, 496, 499, 502–505, 507, 510–511, 514–516, 520–521, 525–528, 530, 538–539, 543–545, 547–553, 557, 559, 568–570, 572–574
filter_eval.py50296%161–162
logger.py551769%37, 50–51, 53–59, 74, 77, 101, 103–106
models.py810100% 
preset_router.py1905670%143–145, 255–256, 261–268, 273, 276, 278–279, 291–294, 296–300, 305, 314, 386–388, 501–502, 507–514, 519, 522, 524–525, 537–540, 542–546, 551, 561
router.py1427745%92–93, 113, 115, 118, 120, 134, 147, 149–150, 152–153, 155–156, 159–161, 172–174, 194–196, 202–204, 208–209, 228–229, 231, 234, 259–262, 281, 284, 287, 294, 296, 330–332, 335–337, 341–342, 347, 351–354, 356, 364, 366–367, 372–373, 376, 378, 380–382, 385–388, 393, 395–396, 405, 426–428, 432
scheduler.py60985%134–135, 172–173, 188–189, 199–200, 202
schemas.py2701793%32, 166, 172–174, 233–235, 237, 342–343, 346, 351, 356, 500, 508, 515
trigger_matcher.py28389%72–74
uploads.py1075944%142–145, 153–155, 161–162, 165, 174–175, 178–179, 187–188, 190–193, 196–199, 201, 203–205, 207–210, 212–213, 215, 230, 236–237, 240, 243, 246, 249, 251, 264–265, 279, 282–284, 286–287, 289, 295–296, 309, 317–319, 323
watchdog.py984554%55–57, 69–70, 162–163, 204–205, 207, 209, 218, 220–222, 224, 231–233, 235–237, 239–240, 242, 257, 259, 264–267, 269–274, 276–282, 284
webhook_router.py804840%57, 82–83, 107–108, 110, 113–114, 116, 126, 128–132, 137, 139, 151, 154, 157, 164–165, 167, 180, 182–183, 188, 204, 206–207, 213–215, 217–218, 220, 235, 237–238, 243–244, 261, 263–264, 270–271, 273, 275
backends
   __init__.py130100% 
   base.py290100% 
   cloud.py1306252%43–45, 50–52, 103, 116–118, 131–135, 142–143, 145, 147, 159–160, 229–230, 232–233, 235–238, 240–245, 247–255, 257–258, 260, 267–269, 272–273, 275, 282–284, 289–293, 295
   local.py430100% 
event_schemas
   __init__.py33196%53
   bitbucket_data_center.py160100% 
   custom.py33584%52–53, 64–66
   detection.py320100% 
   github.py125496%306, 311, 456, 483
   jira_dc.py160100% 
presets
   __init__.py00100% 
storage
   __init__.py60100% 
   factory.py15193%36
   file_store.py22577%21, 30, 35, 40, 64
   google_cloud.py721184%49, 97–102, 136–137, 190, 192
   local.py680100% 
   s3.py1121586%56, 100, 102–103, 107, 109, 190, 213–215, 269–270, 275, 337–338
utils
   __init__.py50100% 
   agent_server.py530100% 
   api_key.py322425%40–41, 46–48, 50, 55, 60, 62–65, 67–68, 70–71, 73, 79, 81–82, 89, 91–92, 98
   cron.py45686%39, 45, 74, 80, 123, 140
   log_context.py100100% 
   model_profiles.py110100% 
   run.py841483%74–76, 183–184, 200–202, 207–209, 256, 262–263
   sandbox.py716114%49–50, 55–58, 60–62, 64–70, 80–81, 86–92, 115–116, 118–122, 124–128, 159–160, 162, 164–167, 172–173, 176, 180–181, 187–189, 194–196, 201–202, 210–212, 214
   tarball_validation.py480100% 
   time.py30100% 
   webhook.py57984%49, 54, 122, 132–134, 140, 203–204
TOTAL335586774% 

Copy link
Copy Markdown

@all-hands-bot all-hands-bot left a comment

Choose a reason for hiding this comment

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

🟢 Good taste - Clean, well-tested implementation that follows established patterns.

This PR adds Bitbucket Data Center webhook support by:

  • Implementing event parsing that mirrors the Jira DC pattern exactly
  • Registering it as a reserved built-in source alongside GitHub and Jira DC
  • Providing comprehensive test coverage (unit, integration, and E2E)

The implementation is simple, focused, and well-tested. The PR description includes solid E2E validation evidence with specific run IDs and sandbox IDs.

[RISK ASSESSMENT]

  • [Overall PR] ⚠️ Risk Assessment: 🟢 LOW

Changes are isolated to a new event source, follow established patterns exactly (Jira DC template), have comprehensive test coverage, no breaking changes, and were E2E validated with real Bitbucket DC webhooks.

VERDICT:
Worth merging: Solid implementation ready to ship.

KEY INSIGHT:
Exemplary use of the template method pattern - reuses WebhookEvent infrastructure while cleanly isolating Bitbucket DC-specific event key extraction.


Was this automated review useful? React with 👍 or 👎 to this review to help us measure review quality.
Workflow run: https://github.com/OpenHands/automation/actions/runs/26318094470

@ak684 ak684 merged commit d3e7fac into main May 23, 2026
6 checks passed
@ak684 ak684 deleted the alona/bitbucket-dc-source branch May 23, 2026 00:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants