Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Jenkins 同步 Bitbucket 代码到 GitHub 中

Jenkins 同步 Bitbucket 代码到 GitHub 中

作者头像
Peter Shen
发布于 2020-06-12 07:44:43
发布于 2020-06-12 07:44:43
1.6K00
代码可运行
举报
文章被收录于专栏:持续集成持续集成
运行总次数:0
代码可运行

最近我们团队需要将一些示例和例子从内部的 Bitbucket 同步到 GitHub。我了解 GitHub 可以创建公共的或是私人的仓库,但我们需要保持以下两点

  • 只分享我们想给客户分享的内容
  • 不改变当前的工作流程,即继续使用 Bitbucket

因此我们需要在 GitHub 上创建相应的仓库,然后将内部 Bitbucket 仓库中对应的 master 分支定期的通过 CI Job 同步到 GitHub 对应仓库中,下图供参考。

分支策略

首先,需要对 Bitbucket 进行分支权限设置

  • master 分支只允许通过 Pull Request 进行修改
  • Pull Request 默认的 reviewer 至少需要一人,并且只有同意状态才允许合并

其次,为了方便产品、售后等人员使用,简化分支策略如下

  1. 从 master 分支上创建 feature 或是 bugfix 分支(取决于你的修改目的)
  2. 然后将你的更改提交到自己的 feature 或 bugfix 分支
  3. 在你自己的分支通过测试后,提交 Pull Request 到 master 分支
  4. 当 reviewer 同意状态,才能进行合并进入到 master 分支

Jenkins Pipeline

基于这样的工作不是特别的频繁,也为了方便维护 Jenkins Pipeline 的简单和易于维护,我没有在需要同步的每个仓库里添加 Jenkinsfile 或在 Bitbucket 里添加 webhooks,有以下几点好处:

  • 只创建一个 Jenkins Job,用一个 Jenkinsfile 满足所有仓库的同步
  • 减少了冗余的 Jenkinsfile 的代码,修改时只需更维护一个文件
  • 不需要在每个仓库里添加一个 Jenkinsfile,更纯粹的展示示例,避免给非 IT 人员造成困扰

不足之处,不能通过 SCM 来触发构建,如果想通过 webhooks 来触发,有的公司需要申请权限来添加 webhooks 比较麻烦;另外可能无法区分从哪个仓库发来的请求,实现指定仓库的同步。

因此如果不是特别频繁的需要同步,提供手动或是定时同步即可(代码太长了请滚动浏览)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 这个 Jenkinsfile 是用来将 Bitbucket 仓库的 master 分支同步到 GitHub 仓库的 master 分支
@Library('jenkins-shared-library@develop') _
def email = new org.cicd.email()
pipeline {
  agent {
    label "main-slave"
  }
  parameters {
    booleanParam(defaultValue: false, name: 'git-repo-win', description: 'Sync internal git-repo-win master branch with external git-repo-win on GitHub')
    booleanParam(defaultValue: true,  name: 'git-repo-lin', description: 'Sync internal git-repo-lin master branch with external git-repo-lin on GitHub')
    booleanParam(defaultValue: false, name: 'git-repo-aix', description: 'Sync internal git-repo-aix master branch with external git-repo-aix on GitHub')
    booleanParam(defaultValue: false, name: 'git-repo-sol', description: 'Sync internal git-repo-sol master branch with external git-repo-sol on GitHub')
  }
  options {
    timestamps()
    buildDiscarder(logRotator(numToKeepStr:'50'))
  }
  stages {
    stage("Synchronous master branch"){
      steps{
        script {
          try {
            params.each { key, value ->
              def repoName = "$key"
              if ( value == true) {
                echo "Start synchronizing $key Bitbucket repository."
                sh """
                rm -rf ${repoName}
                return_status=0
                git clone -b master ssh://git@git.your-company.com:7999/~xshen/${repoName}.git
                cd ${repoName}
                git config user.name "Sync Bot"
                git config user.email "bot@your-company.com"
                git remote add github git@github.com:shenxianpeng/${repoName}.git
                git push -u github master
                return_status="\$?"
                if [ \$return_status -eq 0 ] ; then
                  echo "Synchronize ${repoName} from Bitbucket to GitHub success."
                  cd ..
                  rm -rf ${repoName}
                  exit 0
                else
                  echo "Synchronize ${repoName} from Bitbucket to GitHub failed."
                  exit 1
                fi """
              } else {
                echo "${repoName} parameter value is $value, skip it."
              }
            }
            cleanWs()
          }
          catch (error) {
            echo "Some error occurs during synchronizing $key process."
          } finally {
            email.Send(currentBuild.currentResult, env.CHANGE_AUTHOR_EMAIL)
          }
        }
      }
    }
  }
}

以上的 Jenkinsfile 的主要关键点是这句 params.each{key,value->},可以通过对构建时选择参数的进行判断,如果构建时参数已勾选,则会执行同步脚本;否则跳过同步脚本,循环到下一个参数进行判断,这样就实现了可以对指定仓库进行同步。


不瞒你说,为了找一张不那么随意的、有关同步的封面花了我几个小时,比写这篇文章内容花的时间都长…如果你觉得还不错的话,求在看,求转发,你的支持就是我更新的最大动力。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps攻城狮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
史诗级整理 Jenkins 流水线详解
jenkins 有 2 种流水线分为声明式流水线与脚本化流水线,脚本化流水线是 jenkins 旧版本使用的流水线脚本,新版本 Jenkins 推荐使用声明式流水线。文档只介绍声明流水线。
我的小碗汤
2023/03/19
8K0
史诗级整理 Jenkins 流水线详解
打造企业级自动化运维平台系列(六):Jenkins Pipeline 入门及使用详解
作为一种流行的持续集成和交付工具,Jenkins有多种方式来实现交付流水线。其中,Jenkins Pipeline是一种比较流行的方式,它提供了一个DSL(Domain Specific Language 的缩写,中文翻译为:领域特定语言)来描述交付流水线。
民工哥
2024/01/18
2.5K0
打造企业级自动化运维平台系列(六):Jenkins Pipeline 入门及使用详解
基于Kubernetes构建Jenkins微服务发布平台
软件环境:Jenkins + Kubernetes + Gitlab + Harbor+helm
yuezhimi
2020/09/30
2.1K0
基于Kubernetes构建Jenkins微服务发布平台
通过 Jenkins 定期自动给老板提供 Git 仓库的多维度代码分析报告
在上一篇里 GitStats - Git 历史统计信息工具,我已经给老板提供了他想看的所有仓库的 Git 提交历史分析报告了,并且把报告都部署到了一台虚拟机的 tomcat 上了,老板可以通过网址访问直接查看每个仓库的分析报告了,看看谁的贡献大,谁活跃,谁偷懒了,谁周末写代码了(这里不鼓励 996)。
Peter Shen
2020/06/12
8060
通过 Jenkins 定期自动给老板提供 Git 仓库的多维度代码分析报告
Jenkins(八)
Jenkins pipeline中定义参数使用parameters指令,只允许放在pipeline块下
zx钟
2019/07/18
1.6K0
Jenkins(八)
Jenkins_流水线语法_002
parameters 指令提供了一个用户在触发流水线时应该提供的参数列表。这些用户指定参数的值可通过 params 对象提供给流水线步骤, 了解更多请参考示例。
Cyylog
2020/08/19
1.8K0
9.UI自动化测试框架搭建-使用Jenkinsfile管理测试流程
自动化测试需要与CICD流程进行串联才能体现其价值,无论是作为线上巡检,还是发版前的自动检查。
zx钟
2022/03/29
5040
使用Jenkins Git参数实现分支标签动态选择
我们为什么要使用 git参数呢?每个项目代码库都会有不同的分支,(如果你没有用多分支流水线的情况下)对于普通的流水线项目我们可以 让一条流水线来支持多个分支的发布,其实有时候你会发现每个分支的集成步骤都是差不多的。如果出现差异步骤我们也可以在jenkinsfile中根据不同的分支执行不同的stage。
DevOps云学堂
2022/04/06
2.3K0
使用Jenkins Git参数实现分支标签动态选择
使用 Jenkins 实现 CI/CD 多分支流水线
Jenkins 是一个持续集成服务器,用于从版本控制系统(VCS)中获取最新代码,然后对其进行构建、测试并将结果通知给开发人员。除了作为一个持续集成(CI)服务器之外,Jenkins 还可以做很多其它的事情。最初它被称为 Hudson,是川口耕介(Kohsuke Kawaguchi)基于 Java 编写的一个开源项目,因此,在安装和运行 Jenkins 之前,首先需要安装 Java 8。
LinuxSuRen
2020/02/14
3.3K0
使用 Jenkins 实现 CI/CD 多分支流水线
基于 Jenkins、Gitlab、Harbor、Helm 和 Kubernetes 的 CI/CD
我们利用 Kubernetes 来动态运行 Jenkins 的 Slave 节点,可以和好的来解决传统的 Jenkins Slave 浪费大量资源的缺点。之前的示例中我们是将项目放置在 Github 仓库上的,将 Docker 镜像推送到了 Docker Hub,这节课我们来结合我们前面学习的知识点来综合运用下,使用 Jenkins、Gitlab、Harbor、Helm、Kubernetes 来实现一个完整的持续集成和持续部署的流水线作业。
jwangkun
2021/12/23
2.6K0
基于 Jenkins、Gitlab、Harbor、Helm 和 Kubernetes 的 CI/CD
『Jenkins』在Jenkins中实现多分支Pipeline构建
在现代软件开发中,持续集成(CI)和持续交付(CD)是实现敏捷开发的重要实践。Jenkins作为最受欢迎的自动化工具之一,广泛应用于CI/CD流程中,帮助团队在代码提交后自动化构建、测试、部署等任务。Jenkins的流水线功能(Pipeline)为开发者提供了一个灵活、可扩展的自动化工作流工具。
数字扫地僧
2025/01/15
3090
2.Jenkins进阶之流水线pipeline语法入门学习
Q: 什么是 Groovy 语言 答: Groovy 是 Apache 旗下的一门基于 JVM 平台的动态/敏捷编程语言,在语言的设计上它吸纳了 Python、Ruby 和 Smalltalk 语言的优秀特性,语法非常简练和优美,开发效率也非常高(编程语言的开发效率和性能是相互矛盾的,越高级的编程语言性能越差,因为意味着更多底层的封装,不过开发效率会更高,需结合使用场景做取舍)
全栈工程师修炼指南
2022/09/29
18K0
2.Jenkins进阶之流水线pipeline语法入门学习
kubernetes 基于jenkins spinnaker的ci/cd实践一增加制品镜像扫描
早期jenkins承担了kubernetes中的ci/cd全部功能Jenkins Pipeline演进,这里准备将cd持续集成拆分出来到spinnaker!
对你无可奈何
2021/11/20
1.1K0
Jenkins打造多分支流水线指南
Jenkins pipeline-as-code 使您可以在项目/应用程序源代码存储库中维护CI / CD工作流逻辑,而无需在Jenkins中为每个分支维护其配置。用于构建/测试/部署的流水线代码始终和你的项目/应用程序源代码同步。在仓库中我们用jenkinsfile对流水线代码进行描述。关于jenkinsfile,其简介及语法可参考官方文档
东溪陈姓少年
2020/08/06
3.5K0
使用 Jenkins 构建 CI/CD 之多分支流水线指北
由于公司的 Jenkins 配置没有部署成功的通知,在我学了几天的 Jenkins 后终于是对公司的 Jenkins 配置下手了,结果我刚装完 dingtalk 插件自动重启后,发现之前主管配置的构建项目数据都丢失了,正好给了我练手的机会,于是就有了以下从0到1的辛酸历程。
DevOps时代
2021/04/20
2.3K0
使用 Jenkins 构建 CI/CD 之多分支流水线指北
程序员自我修养之 Git 提交信息和分支创建规范
古话说,没有规矩不成方圆。在团队协作开发时,每个人提交代码时都会写 commit message,但如果没有规范,每个人都会有自己的书写风格,因此在翻看 git log 时经常看到的是五花八门,十分不利于阅读和维护。
Peter Shen
2020/09/24
2.6K0
程序员自我修养之 Git 提交信息和分支创建规范
Jenkins声明式Declarative Pipeline
指定整个Pipeline或特定阶段是在Jenkins Master节点还是Jenkins Slave节点上运行。可在顶级pipeline块和每个stage块中使用(在顶层pipeline{}中是必须定义的 ,但在阶段Stage中是可选的)
YP小站
2021/12/06
3.6K0
Jenkins 与 Bitbucket webhook 的配置和使用
在做 Jenkins 与 Bitbucket 的集成时,需要安装插件:Bitbucket Branch Source,可以通过该插件在 Jenkins 里进行 webhook 的配置。这种方式对于没有 Bitbucket 仓库的管理权限,CI/CD 暂且处于变更比较频繁的阶段,不想麻烦的去申请添加 webhook 的同学来说是非常友好的。即可以不用通过管理员在 Bitbucket 设置里添加 webhook 也可以实现创建 PR 后触发 Jenkins 构建。
Peter Shen
2020/06/12
4.4K0
Jenkins 与 Bitbucket webhook 的配置和使用
Gitlab+Jenkins+k8s+Helm 的自动化部署实践
本文从实践角度介绍如何结合我们常用的 Gitlab 与 Jenkins,通过 K8s 来实现项目的自动化部署,示例将包括基于 SpringBoot 的服务端项目与基于 Vue.js 的 Web 项目。
kubernetes中文社区
2021/11/12
3.8K0
Jenkins+GitLab+Docker+SpringCloud+Kubernetes实现可持续自动化微服务
  现有混合云平台的场景下,即有线下和线上的环境,又有测试与正式的场景,而且结合了Docker,导致打包内容有所区分,且服务的发布流程复杂起来,手工打包需要在编译阶段就要根据环境到处更改配置,因此纯手工发布增加了实施的难度,需要一个统一的适应各种环境部署的方案。
欢醉
2020/06/19
2.2K0
推荐阅读
相关推荐
史诗级整理 Jenkins 流水线详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验