天天看点

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

本节书摘来自华章计算机《devops实战:vmware管理员运维方法、工具及最佳实践》一书中的第3章,第3.4节,作者:小特雷弗 a. 罗伯茨(trevor a. roberts jr.)乔希·阿特韦尔(josh atwell)埃格勒·西格勒(egle sigler)著,更多章节内容可以访问云栖社区“华章计算机”公众号查看

源代码管理(scm,source code management)是devops环境中必不可少的元素。想象一下:如果你要把基础设施转换为代码,重要的是有一种回顾任何更改、在新更改引入问题(例如,在最好的情况下是定期出现不稳定的情况,在最糟糕的情况下引起停机)时回到文件不同版本的手段。有些人可能认为“容易”的方法是建立文件的多个拷贝,每个都使用唯一的名称(vagrantf?ile1、vagrantf?ile2、vagrantf?ile01012015等),但是接着当你想要使用这些文件并且试图记住所有文件的不同之处时,就会陷入文件重命名的麻烦之中。

开发组织中的不同团队很有可能已经使用某种scm系统管理他们的工作(例如,软件开发人员保存其源代码,qa团队管理测试脚本)。在你开始使用scm技术时,和其他小组讨论最佳实践是值得的。

scm解决方案包括svn、mercurial等。git是devops社区中较为流行的scm系统之一,所以,在本书中我们使用git。

使用git

git是一个分布式版本控制系统,这意味着建立中央存储库的一个本地拷贝,而不只是访问单独的文件。本地提交可以同步到中央服务器,保持环境中的一致性,用户总是可以从中央存储库获取最新的源代码版本。这种架构与传统的源代码管理系统不同,原来的系统中只有中央服务器有完整的存储库拷贝。

在实验本书中的例子时,建议使用免费的在线git存储库,如bitbucket、github和gitorious,作为存储代码的中心位置。每个站点都有自己的独特功能。例如,bitbucket允许无限制的免费私有存储库。github是本书作者用于自有代码的在线存储库系统。但是,完全可以使用任何符合你的需求的系统,因为获取代码(克隆/拉取)和存储代码(推送)的方法在任何git系统上都通用。

对于生产环境中的项目,考虑使用公共存储库站点之前请咨询法律部门。虽然许多站点都提供私有存储库功能,但是公司的领导可能更愿意使用内部中央git服务器。

创建第一个git存储库

如果你使用linux或者mac os x,可以打开一个终端窗口试验下面的例子。windows用户必须使用随git客户端安装的特殊shell。示例的语法基于liunx/mac,但是在windows平台上的命令应该等价。

在开始编写代码之前,必须设置两个全局变量,让git知道我们是谁。这不像存储库的本地拷贝那么重要,但是在向远程服务器推送代码时非常重要。这两个全局变量是你的电子邮件地址和用户名:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

事实上,如果尝试使用git,在第一次提交时没有设置这些变量,git将提示你设置它们之后才能继续。

如果你试验过前面的vagrant示例,就已经有了一个用于处理内容的目录。否则,创建一个新目录并在其中创建一个文本文件。从现在起,要在命令行提示符上确认处于该目录。

首先,初始化该目录以建立一个git存储库:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

如果用显示隐藏文件的选项列出目录(linux/mac上的ls-a,或者windows上的dir/a:h),就会看到一个隐藏目录.git。这个目录包含存储库的文件和特定设置。这些本地设置和我们前面设置的全局设置组合,使用如下命令可以确认:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

如果想要查看目录中文件的状态(文件是否已经加入存储库?最后一个命令之后有无更改?等等),可以输入git status,会看到类似程序清单3-5中展示的输出。

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

最后一行最重要,它告诉我们需要跟踪存储库的文件以进行管理。注意scm工具不会自动跟踪放入目录中的文件是很重要的。这一特性可以避免我们跟踪存储库中的垃圾文件,浪费空间。

我们告诉git跟踪vagrantf?ile:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

但是.vagrant/目录没有必要跟踪,因为它只包含vagrant用于设置vm的临时文件。可以创建一个.gitignore文件,明确地告诉git忽略这个目录。使用你所喜欢的文本编辑器,创建有一个条目的.gitigonore文件:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

也可以使用简单的echo命令实现相同的功能。(windows用户需要使用包含在git安装中特殊的git shell二进制文件才能正常工作。)

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

如果再次运行git status命令,将会看到git显示关于.gitignore文件的信息。发生了什么情况?记住,必须告诉git如何处理存储库所能看到的任何文件或者目录,包括.gitignore文件。有两种方法可以处理.gitignore文件:将.gitignore文件本身加入需要忽略的文件及目录列表。

告诉git跟踪.gitignore文件。

我将使用第二种选项,以便让使用存储库的其他人都能忽略相应的文件:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

现在,如果再次检查存储库状态,会看到类似程序清单3-6中展示的输出。

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

目录中的所有文件都已经准备好提交或者添加到非必要文件及目录的.gitignore列表。剩下的工作就是提交存储库更改:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

这将自动打开一个文件编辑器,可以输入关于提交文件的细节。(默认使用vi。)参见程序清单3-7。

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

必须输入一条消息;否则,提交将被撤销。如果不熟悉vi,按下i,输入一些文本,按下esc键,然后输入:wq并按enter键。如果不想使用文本编辑器,可以使用git commit命令的简短形式,加上-m选项,在同一行输入提交消息:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

如果提交成功,应该看到如下输出:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

使用中央git服务器(远程服务器)

如果在github、bitbucker或者任何公共git存储库站点上开立了账户,就必须向站点提供计算机的ssh公钥,以便验证你的身份。每个站点完成这一操作的方法不同,查询文档找到对应的步骤。对于windows用户,通常可以安装站点的客户端软件自动处理。mac和linux用户必须使用ssh -keygen命令生成ssh公钥。

在远程服务器上正确配置ssh公钥之后,就可以在远程站点创建存储文件的存储库:这一过程称作推送(pushing)。在网站上创建远程存储库时,应该跳过readme文件的自动生成。在存储库创建之后,站点将提供一个链接,可以使用它告诉本地存储库远程服务器的位置,该链接的标签往往标记为origin。

在我的设置中,为存储库取了和本地存储库相同的名称。这是一个可选项,名称可以不同。可以使用git remote命令和github提供的链接更新本地存储库设置:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

使用git conf?ig -l命令,可以看到关于远程服务器位置的新数据:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

现在,可以从本地存储库向远程存储库推送文件:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

会看到类似程序清单3-8展示的输出。

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

图3-1展示了向远程服务器推送第一次提交的文件后github上的存储库。

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

如果有了想要使用的远程存储库(正如我们为本书提供的样本),可以使用基于cli或者gui的方法将存储库克隆到本地机器。远程存储库系统应该有类似于图3-1左下角的选项。

根据使用的站点,基于gui的方法有所不同。然而,在github上,如果使用mac或者windows客户端,可以使用clone in desktop按钮,或者使用download zip按钮——这是一个包含存储库所有源代码的简单zip文件。如果使用windows或mac平台,建议使用clone in desktop选项,因为它将自动创建指向远程存储库的git链接。

基于cli的方法包括取得ssh或者http克隆url和使用git clone命令,如:

《DevOps实战:VMware管理员运维方法、工具及最佳实践》——3.4 管理源代码

执行上述命令之后,git将以存储库名称(在本例中是git-test)创建一个目录,并将存储库的内容拷贝到这个目录中。你可以开始使用和更新代码,git远程链接将自动创建,正如前面提到的clone in desktop按钮那样。如果你有更改远程存储库的权限,可以执行git推送,将任何本地更改转发到远程存储库。请求更改其他人的存储库不在本书讨论的范围内,但是,如果对此感兴趣,可以研究存储库的分支和拉取请求。这些功能的实现在不同的公共存储库站点上各不相同,所以,必须查看所使用站点的对应文档。如果在设置远程存储库时有问题,替代的工作流如下。

1.?开始工作之前,在所选择的远程git站点(例如,github)上创建一个新的空存储库。

2.?用前面讨论的gui或者cli方法将空白的存储库克隆到本地机器。

3.?开始在克隆的目录中工作,并执行提交。之后,可以使用前面介绍的git push命令将源代码转发到远程存储库。