Bitbucket 触发内网 Jenkins Build
为了保证安全性多数的持续集成系统都会部署在公司内部的局域网中,这样如果代码部署在 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的更多相关文章
- 内网jenkins如何配置gitlab自动拉取代码打包
在全局工具配置中添加git安装目录的配置 http://10.2.1.92:8080/jenkins/configureTools/git1.8.3.1/usr/bin/git 打开系统设置配置git ...
- Ubuntu中实现Docker内安装jenkins+jenkins远程触发
前面做了在ubuntu中安装jenkins+docker实现自动部署,但是得安装jdk8+tomcat8环境,比较麻烦,因此本文记录如何将jenkins直接装在dockers内并且实现远程触发功能. ...
- 怎样用Jenkins触发还有一个Jenkins---Global build solution
由于上次发的帖子太受欢迎,导致有非常多人问也有很多其它的人想知道.2个不同地域位置的Jenkins怎样自己主动触发相互的Job.当今非常多公司做的产品仅仅是全球化工作的一部分.须要这部分做好以后去做另 ...
- 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则
负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...
- 端口被占用通过域名的处理 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则
负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...
- 内网公告牌获取天气信息解决方案(C# WebForm)
需求:内网公告牌能够正确显示未来三天的天气信息 本文关键字:C#/WebForm/Web定时任务/Ajax跨域 规划: 1.天定时读取百度接口获取天气信息并存储至Txt文档: 2.示牌开启时请求Web ...
- 在centos下部署docker内网私服
Docker内网私服:docker-registry with nginx & ssl on centos docker-registry既然也是软件应用,自然最简单的方法就是使用官方提供的已 ...
- 得到内网域管理员的5种常见方法<转>
1.Netbios and LLMNR Name Poisoning 这个方法在WIN工作组下渗透很有用,WIN的请求查询顺序是下面三个步骤:本地hosts文件(%windir%\System32\d ...
- SpringBoot之解决云服务器VPS在所处云端集群的内网不能解析域名的问题:java.net.UnknownHostException:abc.cn: Temporary failure in name resolution
一.起因与原因分析过程 前端小伙伴儿告诉我,说服务器崩了. 请求数据接口,接口有响应,但报的json提示指向:数据库异常错误. 遂登陆云主机查看日志,核心记录显示如下: 2018-11-09 22:1 ...
随机推荐
- NSThread创建线程的三种方法
- (IBAction)NSThreadBtnClick:(id)sender { [self threadObjectMethod]; [self threadClassMethod]; [self ...
- php面试题汇总三(基础篇附答案)
问题 1. 如何访问会话变量(session)? A.通过$_GET B.通过$_POST C.通过$_REQUEST D.通过全局变量 E.以上都不对 2. 哪个函数能让服务器输出如下 header ...
- Ngnix+tomcat负载均衡
系统环境 Centos6.5 nginx1.4.7 https://nginx.org/download/nginx-1.4.7.tar.gz tomcat7.0.79 http://apache. ...
- python自动化运维五:pexpect
p { margin-bottom: 0.25cm; line-height: 120% } a:link { } pexpect是expect的封装,可以实现ssh,ftp,passwd,telne ...
- Java中Lock,tryLock,lockInterruptibly的区别
转载自:https://www.zhihu.com/question/36771163/answer/68974735 ReentrantLock 锁有好几种,除了常用的lock ,tryLock , ...
- 【学习笔记】深入理解超时调用(setTimeout)和间歇调用(setInterval)
超时调用(setTimeout):在指定的毫秒数后调用函数或计算表达式. setTimeout(func, 1000); // func执行的函数,1000毫秒 间歇调用(setInterval):按 ...
- java中Object转String
Object转为String的几种形式 在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toStri ...
- 【Centos】yum安装MySQL
安装步骤 1. 点击此处下载MySQL的YUM源 -- [ MySQL RPM] 选择适合你平台的rpm,我的是centos7 2. 安装MySQL的yum源,即RPM sudo yum locali ...
- C# 实例练习——字符串处理(第三天)
1. 编写程序将IP地址分解后输出(将IP地址中的点(.)去掉,替换成空格符),如:132.123.4替换后为132 123 4. Console.WriteLine("请输入您电脑 ...
- 优秀的PE工具收藏
优秀的PE工具收藏... ----------------------- ------------------------------------------<排名不分先后..自己喜欢的就是最好 ...