作为系统管理员,我经常需要为公司修改程序。
例子:
我们正在使用 Web 界面来管理我们的本地 DNS。
从互联网上下载并解压 tar.gz 文件后,我必须做一些更改:我添加了一个 LDAP 连接器,更改了一些模板文件,添加了一些自定义页脚/页眉,在数据库中添加了一个附加表等。
很多修改变得难以追踪。
- 有没有办法可以轻松处理如此多修改的软件更新?
- 如何在下一个软件版本发布时保留我的修改?
更多信息:
- 软件来源有多种(github、sourceforge 等)
- 我们不止一个系统管理员
- 欢迎使用版本控制系统
答案1
有没有办法可以轻松处理如此多修改的软件更新?
任何具有良好分支合并功能的 VCS。选择哪一个 - 取决于很多因素和习惯
如何在下一个软件版本发布时保留我的修改?
在 SVN 世界中,它被称为“供应商分支” - 你在一个分支中的更改,在另一个分支中的上游,你更新供应商分支并合并到你的(阅读 SVN 书籍或谷歌了解详细信息)
在 DVCS 世界中您可以使用不同的技术
- 分支,如 SVN
- 补丁和补丁管理
最简单的方法(为我,经过一些测试)是 mercurial + MQ:
- 我的变更是 MQ 队列中的一组 MQ 补丁,repo 是上游的纯克隆
- 每次与上游同步时,我都会从仓库中删除已应用的补丁,拉取源,重新应用补丁(如果需要,解决合并冲突,并保存已编辑的补丁),将提示导出到未版本集并复制到最终目标
答案2
使用版本控制。
如果当前已有一个可用于开发的版本控制系统,请使用该系统。
如果尚未安装,请考虑使用 git。
为什么选择 git?它的管理开销可以根据您的需要而定。您可以运行中央服务器,也可以不运行。这取决于您。SVN 是一个不错的选择(并且被广泛使用),但维护起来可能会更麻烦。
无论您的 VCS 是什么,您都应该构建一个如下的基本目录结构:
OPS
|
+ -- Systems
| |
| + -- Server2
| |
| + -- etc
| |
| + -- httpd
| |
| + httpd.conf
|
+ -- Services
|
+ -- httpd
|
+ -- mods
|
+ -- patches
我构建了类似的东西来跟踪我的所有 nagios 配置。它运行得很好。
这是 git 中的一个简单示例,假设您刚刚安装了一个 Web 服务器并想要备份配置。
cd /etc/httpd/
git init
git add .
git commit -a -m "Initial baseline"
现在,每次您更改文件时(每次更改文件时,无论更改多么微不足道)。运行以下命令:
git commit -a -m "Enabled mod_cgi and debugging for ticket 17789"
您现在在 /etc/httpd 目录中保存了多个版本的 /etc/httpd 文件(具体来说是 /etc/http/.git 目录中)。如果超过 10 个 git repos,这可能会失控,因此我会考虑启动一个 git 服务器。
作为(设置服务器的)额外好处,现在可以从任何位置推送和拉取配置更改。您不再需要通过 ssh 进入计算机来手动编辑配置文件,并且可以轻松地从任何地方运行 diff。如果您在大型团队中工作,您还可以跟踪和合并更改。
以下是一些帮助您开始使用 git 的文章:
答案3
您唯一需要的是一个可重复的构建过程,该过程从上游获取源代码并按顺序应用补丁,直到获得所需的结果。(当然,这意味着您需要以补丁的形式跟踪自己的更改。)
这可以是运行正确命令的简单 shell 脚本,或者您可以更深入地使用它并构建一个本机 .rpm/.deb/whatever 包来为您处理这些步骤。我通常采用第二种方式,因为我喜欢利用打包的许多其他好处。
我建议逐步创建 .patch 文件,并保持文件较小并与特定功能相关,以减少上游发布新版本时合并冲突的影响。如果您尝试使用一个包含您对软件所做的所有更改的巨型教父补丁来执行此操作,则它永远不会干净地应用。
除此之外,还需要勤奋和注意无效的合并。为你接触的任何东西编写自己的回归测试不会有什么坏处,但这由你自行决定。