前言

  最近动画组频繁出现服务器连接失败导致动画师无法使用工具的情况。
  我咨询了导师之后得到了相当让人沮丧的答案,服务器因为安全原因限制了人数登陆限制。
  直接导致使用的人多的话就无法连接的问题。

  我最初觉得搞服务器不太可行,否则导师也不用这么窘迫。
  于是想着利用 工蜂 git 来同步制作人员本地的代码仓库的。

  后来在找一个后端大佬聊天,了解内部Python的代码管理的时候。
  提到内部有 devcloud 开发机可以使用的。
  入职的时候我有看到,每个员工都可以申请一台个人的开发机,但是当时看到只有技术族可以申请,我直接无视了。

  后来经过后端大佬的提醒,我尝试了一下,没想到我设计族也可以申请到服务器,真的让我惊诧。
  于是我就有了新的想法,通过开发机的个人服务器来给动画组搭建一个全新的服务器。

服务器配置

  幸好之前为了弄网站后台,配置服务器可以通过 宝塔 面板实现可视化处理 O(∩_∩)O哈哈~
  瞬间就简单了很多,服务器和腾讯云的服务器相差无几,就是不可以在外网连接而已。
  还是常规操作,先去到宝塔面板的主页安装宝塔面板。
  然后在宝塔面板上初始化服务器的环境。
  下面就可以可视化操作服务器了

  接下来就需要实现服务器的文件共享到 windows 上了
  网上搜索了一下,果然是使用 samba ,这个东西我之前在华强有弄过。
  但是毕竟不是自己搭建的,因此还是得借助网上文章的帮忙。

  中间过程也看了一些不靠谱的文章,最后还是借助这篇文章搭建好了我想要的 samba 链接

samba共享搭建

安装 samba 服务

1
yum -y install samba samba-client 

启动和重启 samba 服务

1
2
3
4
# 启动服务
systemctl start smb nmb
# 重启服务
systemctl restart smb nmb

  后面修改配置的时候需要重启 samba 服务

开放 139 445 端口

alt

创建 linux 用户 | 配置 samba 访问用户密码

1
2
3
4
# 创建 linux 用户
useradd -s /sbin/nologin morefun
# 配置 samba 用户密码
smbpasswd -a morefun

创建共享的文件夹并开放权限

alt

修改 smb.conf 配置

  主要在配置文件的末尾添加共享文件夹的路径和权限即可

1
2
3
4
5
6
7
8
9
10
11
[Tools]
# 共享文件目录描述
comment = Shared Directories
# 共享文件目录
path = /data/smb/Tools/
# 是否允许guest访问
public = yes
# 是否浏览权限
browseable = yes
# 是否可写权限
writable = yes

windows 上连接服务器

  在windows上文件资源管理器上输入 \\ip地址 即可访问samba共享文件了
  访问之后会弹出用户名和密码输入框
  可以通过运行 cmd 命令来跳过输入步骤。

1
NET USE <\\IP地址> <密码> /USER:<账号>

Git 仓库配置

  其实我个人也只是会git常用的命令,复杂操作其实也不懂。

服务器端初始化 git 仓库

  首先要明确 仓库初始化有两种模式

1
2
git init
git --bare init

  没有 bare 就是普通的代码仓库,会在创建目录下常见 .git 目录
  添加 bare 命令之后会发现 .git 目录下的内容会直接创建到当前目录下。

  添加 bare 命令之后是无法通过文件夹看到仓库的内容的。
  这种仓库可以定义为远程仓库,类似于数据中心的概念。

  可以通过 git init 创建一个本地的仓库
  然后通过 git remote add 的方式将服务器的远程仓库路径连接上

  其实 remote add 的操作是在 .git/config 文件下添加了新的远程路径配置

  这样本地的 init 仓库就可以类似 github 的操作将代码 同步到 远程的 bare init 仓库上


  我之前都不知道,看到github上可以预览到文件,一直以为 github 上是 git init 的仓库
  因此我一直尝试将一个仓库的代码push到另一个仓库上,却始终不成功(:з」∠)
  还需要在另一个仓库上对push的文件进行操作处理才行,特别麻烦。
  后来看到 Stack Overflow 提到,原来 github 的仓库都是 bare 仓库,才明白我的操作是不对的。
  bare init 就不会有问题。

git 钩子配置

  网上大多数的钩子其实都是配置到服务器端的 hooks 文件下的 post-receive 文件下。
  这样只要 git push 完成服务端的代码同步之后就会触发 post-receive 钩子的shell代码。
  不过因为我这里的一些特殊原因,我还是将钩子配到了客户端的 pre-push 上了。

  钩子里面的代码最初还以为要自己写复制的。
  网上查了一下,其实可以通过 checkout 简单实现.

1
2
3
4
5
6
# 指定我的代码检出目录
DIR= <指定输出路径>
# 清理路径上的无关文件
git --work-tree=${DIR} clean -fd
# 直接强制检出
git --work-tree=${DIR} checkout --force

  通过上面的代码可以将仓库当前分支显示的代码直接复制到制定的目录上,完成代码的发布工作。

总结

  再次温习了一下服务器的使用方法,以及Git的一些内部使用逻辑和方法。
  感觉还是多去练习才明白这个东西内部的逻辑结构。


2020-1-2 更新

  使用 –work-tree 的方式 checkout 部署代码的确没问题,但是因为缺少git的追踪,每一次部署等于覆盖一次,仓库复杂的话还是要等挺长时间的。
  后来我还是换成了仓库钩子 post-receive 的方式。
  为了不对之前的仓库造成影响,我新建了一个新的 bare 仓库在我的服务器上。
  然后给本地origin remote 添加多新仓库的url地址
  这样 git push 的时候就会分别 push 到两个仓库上。

  后续就是通过 post-receive 的是方式给线上的 –work-tree 仓库执行pull命令即可
  这里直接 cd 路径然后 git pull 会报错 参考

  根据第二个回答添加 unset GIT_DIR 即可。


  后面我用 python 写脚本的时候,还发现在windows平台不支持 cd 到 UNC 路径(也就是\\ip地址)
  可以使用 –git-dir 来解决 链接

  可以参考我线上的脚本,通过 git 来读取更新的内容