为了保证安全性多数的持续集成系统都会部署在公司内部的局域网中,这样如果代码部署在 Bitbucket 等环境中就只能通过轮询的方式来触发 Build。那么有没有办法通过 Bitbucket 的 Webhooks 功能在开发人员提交代码时触发 Build 呢?答案是肯定的,并且有很多种实现方式。
本文笔者将介绍一种比较简单的实现方式来实现由 Bitbucket 的 Webhooks 触发内网 Jenkins 中的 Build。其结构如下:

实现本方案的条件是需要在外网有一台可以访问的主机,通过 SSH 的端口转发技术(准确的说是"远程端口转发")把外网主机监听到的请求转发给内网中的 Jenkins 服务器。下面我们一起来看看详细的实现步骤。

添加用来触发 Build 的用户

一般情况下我们会添加一个用户专门用来控制自动触发 Build。在 Manage Jenkins -> Manage Users 界面中点击 "Create User":

输入用户信息并创建用户,笔者创建的用户名称为 autobuilder。

配置用户的权限

对于刚才创建的 autobuilder 用户,只有先赋予一定的权限,它才能够系统中的 Build。
进入 Manage Jenkins -> Configure Global Security 配置界面,在 Authorization 的配置项中选择 "Matrix-based security",然后把 autobuilder 用户添进来:

并赋予 Overall - Read,Job - Build,Job - Read,Job - Workspace 四种权限。
当然我们可能会使用不同的 Authorization 方式,其实只要保证赋予 autobuilder 用户合适的权限就可以了。

打开 Build 的 job trigger 配置

必须在 Project 中进行配置才能开启远程触发 Build 的功能。进入 Project 的配置界面,在 "Build Triggers" 下面选中 "Trigger builds remotely":

如上图所示,你必须输入一个 Authentication Token。这主要是为了唯一的标识当前的 Project 并保证一定的安全性。你可以从 https://randomkeygen.com/ 轻松的生成一个合格的 Authentication Token。

获得触发 Build 的 URL

万事具备,接下来让我们构建可以在远程触发 Build 的 URL。
在前面的截图中,第二个红框中的内容就是一个可以触发 Build 的 URL 模板。接下来我们用 Jenkins 服务器地址替换模板中的 JENKINS_URL,用实际的 Authentication Token 替换模板中的 TOKEN_NAME。得到的 URL 为:

http://localhost:8080/jenkins/job/elephant/build?token=QTfICY6LwGvgG5jhy8EzMD6C9dEdk8fS

现在在这个 URL 还不能触发 Build,因为还缺少认证信息。

使用 autobuilder 用户登录到 jenkins 服务器中,点击右上角的用户名称进入用户信息界面,然后点击 "Configure" 进入配置界面。点击 API Token 小节中的 "Show API Token" 按钮:

获得上面的认证信息后就可以拼出完整的 URL 了。

http://autobuilder:52f4dec5458db692ba0d97a4079ae186@localhost:8080/jenkins/job/elephant/build?token=QTfICY6LwGvgG5jhy8EzMD6C9dEdk8fS

通过 curl 在 Jenkins 服务器运行的主机上触发 Build 试试:

$ curl http://autobuilder:52f4dec5458db692ba0d97a4079ae186@localhost:8080/job/elephant/build?token=QTfICY6LwGvgG5jhy8EzMD6C9dEdk8fS

接下来用我们准备的外网主机域名替换本地的主机名,笔者准备的外网主机域名为 xxxengine.eastasia.cloudapp.azure.com,端口号为 10055。所以用 xxxengine.eastasia.cloudapp.azure.com:10055 替换 localhost:8080,最终的 URL 为:

http://autobuilder:52f4dec5458db692ba0d97a4079ae186@xxxengine.eastasia.cloudapp.azure.com:10055/job/elephant/build?token=QTfICY6LwGvgG5jhy8EzMD6C9dEdk8fS

配置远程端口转发

远程端口转发是 SSH 端口转发的一种,如果你还不熟悉 SSH 端口转发技术,请先移步《SSH 端口转发》。
假设我们在 Azure 上有一台运行 Ubuntu 16.04 Server 的虚拟主机,主机的域名为 xxxengine.eastasia.cloudapp.azure.com,允许外部访问的端口为 22 和 10055:

其中 22 端口是 SSH 服务器用来建立 SSH 连接用的,10055 端口用来监听外部触发 Jenkins Build 的请求。
先登录主机 xxxengine.eastasia.cloudapp.azure.com, 在 SSH 服务器的配置文件 /etc/ssh/sshd_config 中添加一行:

GatewayPorts yes

保存并重启 SSH 服务器。

下面我们建立一条从内网中 Jenkins 服务器到外网 xxxengine.eastasia.cloudapp.azure.com 主机的隧道。在内网中运行 Jenkins 服务器的主机上执行下面的命令:

$ ssh -fN -R :localhost: nick@xxxengine.eastasia.cloudapp.azure.com

R 选项指明端口转发的方式为远程端口转发,10055 为主机 xxxengine.eastasia.cloudapp.azure.com 需要监听的端口号。localhost:8080 是 Jenkins 服务器监听的本机端口。nick@xxxengine.eastasia.cloudapp.azure.com 表示通过用户 nick 建立到主机 xxxengine.eastasia.cloudapp.azure.com 的 SSH 连接。选项 fN 则让该远程转发以后台方式运行。
建立好端口转发后让我们再次登录到主机 xxxengine.eastasia.cloudapp.azure.com 上,执行 ss -tunl 命令查看端口的监听情况:

看,主机已经能够监听任何来源发送到 10055 端口的请求了。

配置 Bitbucket Webhooks

在 Bitbucket 中打开你的项目,选择 "Settings -> Webhooks" 进入 Webhooks 的配置界面。添加一个新的 webhook 配置,并且把我们在前面创建的最终版的 URL 设置其 URL:

直接保存就可以了!

检查结果

向 Bitbucket 代码库中提交代码,Bitbucket 在收到代码推送后会使用我们在 webhook 中设置的 URL 发送 http 请求。结果内网中的 Jenkins 服务器收到请求触发一个新的 Build。

整个过程中的数据流向为:

Bitbucket 向 xxxengine.eastasia.cloudapp.azure.com 的  端口发送请求;
SSH 服务器监听 端口并且把接收到的请求通过 SSH 隧道发送到内网中 Jenkins 服务器上 localhost 的 端口;
Jenkins 服务器监听 localhsot 的 端口,并且处理收到的请求。

总结

我们在没有对现有系统做太多改变的情况下,仅仅使用 SSH 在内网与外网之间建立了一条隧道,就实现了外网对内容 Jenkins 的访问。
其实日常工作中还有很多类似的用例,都可以通过 SSH 建立隧道的方式简单便捷的解决。

Bitbucket 触发内网 Jenkins Build的更多相关文章

  1. 内网jenkins如何配置gitlab自动拉取代码打包

    在全局工具配置中添加git安装目录的配置 http://10.2.1.92:8080/jenkins/configureTools/git1.8.3.1/usr/bin/git 打开系统设置配置git ...

  2. Ubuntu中实现Docker内安装jenkins+jenkins远程触发

    前面做了在ubuntu中安装jenkins+docker实现自动部署,但是得安装jdk8+tomcat8环境,比较麻烦,因此本文记录如何将jenkins直接装在dockers内并且实现远程触发功能. ...

  3. 怎样用Jenkins触发还有一个Jenkins---Global build solution

    由于上次发的帖子太受欢迎,导致有非常多人问也有很多其它的人想知道.2个不同地域位置的Jenkins怎样自己主动触发相互的Job.当今非常多公司做的产品仅仅是全球化工作的一部分.须要这部分做好以后去做另 ...

  4. 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则

    负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...

  5. 端口被占用通过域名的处理 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则

    负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...

  6. 内网公告牌获取天气信息解决方案(C# WebForm)

    需求:内网公告牌能够正确显示未来三天的天气信息 本文关键字:C#/WebForm/Web定时任务/Ajax跨域 规划: 1.天定时读取百度接口获取天气信息并存储至Txt文档: 2.示牌开启时请求Web ...

  7. 在centos下部署docker内网私服

    Docker内网私服:docker-registry with nginx & ssl on centos docker-registry既然也是软件应用,自然最简单的方法就是使用官方提供的已 ...

  8. 得到内网域管理员的5种常见方法<转>

    1.Netbios and LLMNR Name Poisoning 这个方法在WIN工作组下渗透很有用,WIN的请求查询顺序是下面三个步骤:本地hosts文件(%windir%\System32\d ...

  9. SpringBoot之解决云服务器VPS在所处云端集群的内网不能解析域名的问题:java.net.UnknownHostException:abc.cn: Temporary failure in name resolution

    一.起因与原因分析过程 前端小伙伴儿告诉我,说服务器崩了. 请求数据接口,接口有响应,但报的json提示指向:数据库异常错误. 遂登陆云主机查看日志,核心记录显示如下: 2018-11-09 22:1 ...

随机推荐

  1. 设计模式之建造者模式Builder(创建型)

    1. 概述 在软件开发的过程中,当遇到一个“复杂的对象”的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定 ...

  2. 利用Python实现kNN算法

    邻近算法(k-NearestNeighbor) 是机器学习中的一种分类(classification)算法,也是机器学习中最简单的算法之一了.虽然很简单,但在解决特定问题时却能发挥很好的效果.因此,学 ...

  3. Run Performance Testing Which Was Distributed To Multiple Test Agents

    How to solve the VS installed machine cannot run performance testing by .testsettings file, which wi ...

  4. dnf命令 (常用总结)

    DNF是新一代的rpm软件包管理器.他首先出现在 Fedora 18 这个发行版中.而最近,它取代了yum,正式成为 Fedora 22 的包管理器. DNF包管理器克服了YUM包管理器的一些瓶颈,提 ...

  5. 转载:细说Cookie

    细说Cookie 转载:http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html 阅读目录 开始 Cookie 概述 Cookie的 ...

  6. VMware Workstation 12 Pro 之安装林耐斯-LinuxMint-系统

    VMware Workstation 12 Pro 之安装林耐斯-LinuxMint-系统... ---------------------- ---------------------------- ...

  7. spring boot整合Thymeleaf的那些坑(spring boot 学习笔记之四)

    这里简单记录一下Thymeleaf配置和使用的步骤 1.修改pom文件,添加依赖 <dependency> <groupId>org.springframework.boot& ...

  8. 一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

    我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分. 1 ...

  9. summernote使用心得

    今日因项目需要所以使用了很有名气的富文本编辑器summernote,分享使用方法如下!填了一点坑,提供给需要的朋友借鉴! 直接转入我的前端网 地址: http://www.qdfuns.com/not ...

  10. [2012-06-21]结合find的awk

    源起:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3754423&page=1&extra=#pid221729 ...