如何实现Bitbucket指定分支自动推送至GitHub?
实现Bitbucket到GitHub的分支自动同步
Bitbucket的Webhook确实只能指向URL,没法直接关联本地脚本,但你可以搭一个轻量HTTP服务来接收Bitbucket的Webhook触发请求,再在服务里执行同步脚本。整个流程是:Bitbucket指定分支有推送→触发Webhook发送请求到你的HTTP服务→服务执行同步脚本→将代码推送到GitHub。
具体步骤
1. 编写同步脚本
先写一个完成Bitbucket到GitHub同步的bash脚本,核心逻辑是拉取指定分支最新代码,再推送到GitHub对应分支。
示例脚本(保存为sync_repo.sh):
#!/bin/bash # 本地仓库路径,需提前拉取Bitbucket和GitHub仓库 REPO_DIR="/path/to/your/local/repo" TARGET_BRANCH="main" # 要同步的分支名称 GITHUB_REMOTE="github" # 提前添加的GitHub远程仓库别名(git remote add github <github-repo-url>) cd $REPO_DIR || exit 1 # 拉取Bitbucket分支最新代码 git pull origin $TARGET_BRANCH # 推送到GitHub对应分支 git push $GITHUB_REMOTE $TARGET_BRANCH
注意:提前在服务器上配置好SSH密钥(或HTTPS个人访问令牌),确保能免密拉取Bitbucket仓库、推送GitHub仓库。
2. 搭建HTTP服务接收Webhook
用Python Flask搭建轻量HTTP服务,用来接收Bitbucket的Webhook请求,验证合法性后执行同步脚本。
示例代码(保存为webhook_server.py):
from flask import Flask, request, abort import subprocess import hmac import hashlib app = Flask(__name__) # 与Bitbucket Webhook设置一致的密钥,用于验证请求来源 WEBHOOK_SECRET = "your-custom-secret-key" SYNC_SCRIPT_PATH = "/path/to/sync_repo.sh" def validate_bitbucket_request(request): signature_header = request.headers.get('X-Hub-Signature') if not signature_header: return False sha_type, signature = signature_header.split('=') if sha_type != 'sha256': return False # 计算请求体的签名并对比 computed_signature = hmac.new( WEBHOOK_SECRET.encode(), msg=request.data, digestmod=hashlib.sha256 ).hexdigest() return hmac.compare_digest(computed_signature, signature) @app.route('/bitbucket-sync', methods=['POST']) def handle_sync_trigger(): # 验证请求是否来自Bitbucket if not validate_bitbucket_request(request): abort(403) # 解析请求体,确认是目标分支的推送 payload = request.get_json() pushed_branch = payload['push']['changes'][0]['new']['name'] if pushed_branch != "main": # 替换为你的目标分支 return "Skip non-target branch sync", 200 # 执行同步脚本 run_result = subprocess.run( [SYNC_SCRIPT_PATH], capture_output=True, text=True ) if run_result.returncode == 0: return "Sync completed successfully", 200 else: return f"Sync failed: {run_result.stderr}", 500 if __name__ == '__main__': # 生产环境请用gunicorn等稳定服务器,不要用Flask自带调试服务器 app.run(host='0.0.0.0', port=5000)
3. 配置Bitbucket Webhook
- 打开Bitbucket仓库的「Settings」→「Webhooks」→「Create webhook」
- 填写「URL」:你的HTTP服务公网地址 + 路径(比如
http://your-server-ip:5000/bitbucket-sync) - 「Triggers」选择「Repository push」
- 「Branch selection」选择「Specific branches」,添加你要同步的分支
- 「Secret」设置为和脚本中
WEBHOOK_SECRET一致的密钥 - 保存后,可手动推送一次目标分支测试同步是否生效
额外注意事项
- 服务器需具备公网访问能力,确保Bitbucket能发送Webhook请求;无公网IP可使用内网穿透工具或云服务器
- 给同步脚本添加执行权限:
chmod +x sync_repo.sh - 生产环境建议用gunicorn、uWSGI等稳定HTTP服务器运行Flask服务
- 可在同步脚本中添加日志输出,方便排查同步失败问题
内容的提问来源于stack exchange,提问作者incnico
相关产品推荐
相关产品推荐

