最近遇到这样一个需求,我们有一个共享仓库的代码所在用的空间非常大(超过 20 G),在每个产品构建时候都需要用到这个仓库的代码(从里面 copy 第三方库),假如每个人都要 git clone 这个第三方仓库,一是网络开销非常大,二是 git clone 时间长,三是占用大量的物理空间。
在不改变编译脚本的前提下,就是要将这个共享代码放到一个 Server 上做 NFS,并且通过 Jenkins 的定时任务或者是 hook 来不断升级代码。
首先,什么是 NFS?NFS(Network File System)即网络文件系统,是 FreeBSD 支持的文件系统中的一种,它允许网络中的计算机之间共享资源。在 NFS 的应用中,本地 NFS 的用户端应用可以透明地读写位于远端 NFS 服务器上的文件,就像访问本地文件一样,Windows 上俗称共享。
Jenkins 不必多说,用它主要是来做持续集成,通过 Jenkins 的定时任务或者是 hook 来自动升级,假如升级失败则发邮件通知管理者。
设置 NFS 及 启动命令# 例如在 Linux 上, 共享服务器的 ip 是 192.168.1.1sudo vi /etc/exports# 以下是我的 exports 文件的配置# 假设内网 ip 是这样的区间 192.168.1.1 ~ 192.168.1.250# ro 表示只读# all_squash 表示不论使用 NFS 的客户是谁,他的身份都会被限定成为一个指定的普通客户身份(nfsnobody)/agent/workspace/opensrc 192.168.1.*(ro,all_squash)# 启动 NFS 服务,需要启动portmap和nfs两个服务,并且portmap肯定要先于nfs启动;service portmap startservice nfs start# 查看 portmap 状态service portmap status# 查看 NFS 状态service nfs status# 中止 NFS 服务service nfs stop# 当改变/etc/exports配置文件后,不用重启 NFS 服务直接用这个 exportfs 就可sudo exportfs -rv
挂载到不同 UNIX 平台
不同平台的 NFS 操作命令略有不同# Linuxsudo mount -t nfs 192.168.1.1:/agent/workspace/opensrc /agent/workspace/opensrc# AIXsudo nfso -o nfs_use_reserved_ports=1 # should only first time mount need to run this commandsudo mount -F nfs 192.168.1.1:/agent/workspace/opensrc /agent/workspace/opensrc# HP-UXsudo mount -F nfs 192.168.1.1:/agent/workspace/opensrc /agent/workspace/opensrc# Solaris-SPARC# 假如你不能直接在命令行执行 mountsudo /usr/sbin/mount -F nfs 192.168.1.1:/agent/workspace/opensrc /agent/workspace/opensrc
最后就是 Jenkins pipelinepipeline { triggers { cron('H */4 * * 1-5') } agent { node { label 'agent' customWorkspace "/agent/workspace/update" } } options {buildDiscarder(logRotator(numToKeepStr:'10'))} stages { stage("Up to date") { steps { sh ''' if [ ! -d /agent/workspace/opensrc ] then cd /agent/workspace git clone --depth 1 -b master git@github.com:shenxianpeng/opensrc.git else cd /agent/workspace/opensrc git pull origin master fi ''' } post{ failure{ script { def email = load "vars/email.groovy" email.build(currentBuild.result, '') } } } } }}