利用 frp 为 jenkins 配置内网打包节点

为什么这么做:公司的 jenkins 是搭建在阿里云上的,处于外网,但是 jenkins 服务器本身配置较低,最开始只是为了服务端自动化构建搭建起来,后来配置 Android 打包后就一直处于性能不够的情况,频繁打包失败,甚至会导致服务器直接卡死,影响其他的项目构建,就这还是在服务器从 1 核 2G 升到了 1 核 4G 的条件下了。但是为了 Android 打包继续增加服务器的配置,明显是不划算的。正好公司的文件共享主机性能不错,4 核 16G,用来打包绰绰有余。一开始计划在内网机器上也配置 jenkins ,但这种方式 gitlab 的 webhook 貌似没办法调到位于内网的 jenkins ,即使做了内网穿透也无济于事,具体原因不明。后来在搜索中看到了这篇博文:远端GitLab+Jenkins(CentOS)+本地Mac 做CI自动打包iOS上传到蒲公英, 受到启发,也决定通过配置内网节点的方式来做。

有几个先决条件,但不是本次主讲点,在此列出来,请大家另行查询:

  1. 需要公网机器的 ssh 免密登录权限(pc 登录,用于配置 frp);
  2. 有配置公网机器安全组的权限或途径(需要配置 frp 使用的端口);

内网机器配置 frp

jenkins 和 gitlab 都是位于外网的,gitlab 要 hook 到 jenkins 是很简单的,但是 jenkins 把构建任务分配到内网节点,就必须要做内网穿透了。内网穿透的方式很多,这里我是使用 frp 。frp 是一个开源的可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。

使用 frp 需要一台拥有公网 ip 的服务器,如果有 jenkins, 那么使用这个服务器的 ip 也是可以的。

首先要下载 frp ,根据你内网机器的系统下载对应版本,我这里 jenkins 和 内网机器都是 linux(一台 mint linux,一台 ubuntu, 内网机器和外网机器都需要运行 frp ),因此下载 linux_amd64 版本,之后也都是在这两个系统的进行配置。

ssh 登录内网机器,解压 frp 文件夹,并 cd 到 frp 目录中;
配置 frpc.ini (client 端的配置文件):

1
2
3
4
5
6
7
8
9
[common]
server_addr = 47.101.58.183 //公网机器 ip
server_port = 7000 //默认绑定 端口

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22 //本地 ssh 端口
remote_port = 6000 //映射到外网的 ssh 端口

外网机器配置 frp

与内网机器相同,解压,进入目录下,配置 frps.ini :

1
2
3
4
[common]
bind_port = 7000 //默认绑定端口,与 client 保持一致
vhost_http_port = 8080 //http 访问端口,需要在安全组中设置允许通过
vhost_https_port = 443 //https 端口

frp 两端的基本配置就完了,首先运行位于 server 上的 frp:
./frps -c ./frps.ini

然后运行位于 client 上的 frp :
./frpc -c ./frpc.ini

如果一切顺利,并且先决条件已经满足,那么即使在外网,也能通过 ssh 登录到内网机器了:

1
2
3
4
5
6
7
# alpha @ gaoyanqangdeMBP in ~ [12:09:13]
$ ssh -oPort=6000 alpha@47.101.58.183
Welcome to Linux Mint 18.2 Sonya (GNU/Linux 4.10.0-33-generic x86_64)

* Documentation: https://www.linuxmint.com
Last login: Sat May 5 12:08:56 2018 from 127.0.0.1
alpha@kid17-drive ~ $

jenkins 创建本地节点

从左侧 Manage Jenkins -> Manage Nodes -> New Node 进入到创建 node 页面,输入 node name,并选择 Permanent Agent,点击 OK 进入到 node config 页面:
其中:

# of executors :表示并发线程数,可以同时执行的构建任务数量,超过需要排队,默认是 1
Remote root directory :必填,表示作为 jenkins 节点的工作目录,我的值是 /home/alpha/jenkins_home, 注意该目录需要设置 root 为 owner,并授予 777 的权限。
Launch method :选择 Launch slave agents via SSH
Host :公网服务器的 ip,比如我的就是 47.101.58.183
Credentials :创建能够登录 gitlab 的密钥(注意,这里可以选择 none,但是必须在你的 gitlab 个人 ssh keys 添加本地节点的 ssh 公钥并在对应仓库下的 depoly keys 中启用)

Host Key Verification Strategy :选择 Non verifying Verification Strategy
Port : 点击 高级/Advanced 可以看到该配置,填入之前在 frpc.ini 中配置的 6000 端口,否则就会连接到公网机器而不是内网节点了。

此外还需要在 Node Properties 中配置 JAVA_HOME:

当然你的实际 jdk 也得在这个目录下才行哟。

此时点击保存,进入到节点列表,点击 Launch agent 就会连接该 Node 了。如果连接成功就会显示 In sync 的状态:

接下里需要做的就是把 build task 分配给这个节点了:

注意点击待选后需要删除多余的空格,否则会报错。

保存后,点击项目的 Build Now 就会开始构建了。当然在此之前,你需要在内网机器上安装 Android SDK。具体的 Android SDK 安装步骤过了好几天也几乎忘记了,记得中间也遇到几次坑,不过还是请大家自行搜索安装咯。

在配置了内网本地节点之后,jenkins 服务器又降到了 1 核 2G 的配置,又给公司省钱了呢 ~