【转】在阿里,我们如何管理测试环境

前言

阿里的许多实践看似简单,背后却蕴涵着许多思考,譬如测试环境的管理。

互联网产品的服务通常是由Web应用、中间件、数据库和许多后台业务程序组成的,一套运行环境就是一个自成一体的小生态。最基本的运行环境是线上环境,部署产品的正式发布版本,为用户提供持续可靠的服务。

除此以外,还有许多不对外部用户开放的运行环境,用于产品团队日常的开发和验证,统称为测试环境。正式环境的稳定性,除去软件自身的质量因素,主要与运行的主机、网络等基础设施相关,而测试环境的稳定性则更多受到人为因素影响。由于频繁的版本变更,以及部署未经充分验证的代码,测试环境出故障的情况屡见不鲜。

良好的代码提交习惯、适当的变更前检查有助于减少故障的发生,但无法彻底杜绝后患。增加多套测试环境副本能够有效控制故障的影响范围,然而企业的资源终归有限,降低测试环境成本和提高测试环境稳定性成为了矛盾的两面。

在这个领域里,独具匠心的阿里研发效能团队设计了一种服务级复用的虚拟化技术,称为“特性环境”,其巧妙的思路令人赞叹。本文将围绕测试环境管理的话题,聊聊这种具有阿里特色的工作方式。 Continue reading "【转】在阿里,我们如何管理测试环境"

如何同步多个 git 远程仓库

在本地 git 仓库里找到这个文件  .git/config, 内容如下:

改为如下:

合并 2 个 remote 配置

Continue reading "如何同步多个 git 远程仓库"

git清理历史记录中的大文件

查看哪些历史提交过文件占用空间较大

使用以下命令可以查看占用空间最多的五个文件:

rev-list命令用来列出Git仓库中的提交,我们用它来列出所有提交中涉及的文件名及其ID。 该命令可以指定只显示某个引用(或分支)的上下游的提交。

--objects:列出该提交涉及的所有文件ID。

--all:所有分支的提交,相当于指定了位于/refs下的所有引用。

verify-pack命令用于显示已打包的内容。 Continue reading "git清理历史记录中的大文件"

Gitlab的server端hook简要使用说明

Gitlab的server端hook配置大体步骤是这样的:

1、在gitlab的server端要配置server端hook的项目目录下新建一个 custom_hooks 目录;

2、在custom_hooks目录下新建post-receive钩子文件,chmod该文件的权限为777;

3、在post-receive钩子文件中添加相应的逻辑;

补充说明:gitlab或者github的一个特性是, projectX.git如果是项目的repo地址,那么,与之对应的wiki项目也有一个git的repo地址, 遵循一个命名convention, 即如果项目的地址是projectX.git,那么wiki的项目地址就是projectX.wiki.git, 我们的server端hook的执行逻辑根据这一convention而来;

Continue reading "Gitlab的server端hook简要使用说明"

Git Hooks

和其它版本控制系统一样,Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。 你可以随心所欲地运用这些钩子。

安装一个钩子

钩子都被存储在 Git 目录下的 hooks 子目录中。 也即绝大部分项目中的 .git/hooks 。 当你用 git init 初始化一个新版本库时,Git 默认会在这个目录中放置一些示例脚本。这些脚本除了本身可以被调用外,它们还透露了被触发时所传入的参数。 所有的示例都是 shell 脚本,其中一些还混杂了 Perl 代码,不过,任何正确命名的可执行脚本都可以正常使用 —— 你可以用 Ruby 或 Python,或其它语言编写它们。 这些示例的名字都是以 .sample 结尾,如果你想启用它们,得先移除这个后缀。

把一个正确命名且可执行的文件放入 Git 目录下的 hooks 子目录中,即可激活该钩子脚本。 这样一来,它就能被 Git 调用。 接下来,我们会讲解常用的钩子脚本类型。

Continue reading "Git Hooks"

Git rebase

git rebase是对commit history的改写。当你要改写的commit history还没有被提交到远程repo的时候,也就是说,还没有与他人共享之前,commit history是你私人所有的,那么想怎么改写都可以。

而一旦被提交到远程后,这时如果再改写history,那么势必和他人的history长的就不一样了。 git push的时候,git会比较commit history,如果不一致,commit动作会被拒绝,唯一的办法就是带上 -f参数,强制要求commit,这时git会以committer的history覆写远程repo,从而完成代码的提交。虽然代码提交上去了,但是这样可能会造成别人工作成果的丢失,所以使用 -f参数要慎重。

楼主遇到的问题,就是改写了公有的commit history造成的。要解决这个问题,就要从提交流程上做规范。

Continue reading "Git rebase"

Mecurial(hg)学习要点(团队管理)

Mecurial的基本介绍可以查看百度百科,以下知识是个人对Mecurial经验的简要说明。
Mecurial(hg)是一款分布式版本控制软件,可以称之为轻量级的git,比git和svn都要简单易学,但是在版本控制的理念上与svn有所区别。

分布式版本控制的核心理念是“分支”和“合并”,每个开发者在本地拥有很多开发分支,最常见的一个分支可以是一个功能的开发或者一个BUG的修改,每个分支有一个独立的名称,相互之间相互独立、互不影响。当分支代码开发完成之后,需要将该分支的代码“合并”到主分支,该主分支即是软件最终的分支。需要发布的功能都需要合并到该主分支,不发布的功能或修改不用合并。

Mecurial在Linux开发环境下一般使用命令行完成版本控制操作,在Windows环境下可以使用命令行或者图形界面,图形界面的话会隐藏所有的命令细节。

Continue reading "Mecurial(hg)学习要点(团队管理)"

Git学习要点(团队管理)

一、Git介绍

Git的基本介绍可以查看百度百科,以下知识是个人对Git经验的简要说明,以方便帮助大家快速学习。

分布式版本控制的核心理念是“分支”和“合并”,每个开发者在本地拥有很多开发分支,最常见的一个分支可以是一个功能的开发或者一个BUG的修改,每个分支有一个独立的名称,相互之间相互独立、互不影响。当分支代码开发完成之后,需要将该分支的代码“合并”到主分支,该主分支即是软件最终的分支。需要发布的功能都需要合并到该主分支,不发布的功能或修改不用合并。

Git在Linux开发环境下一般使用命令行完成版本控制操作,在Windows环境下可以使用命令行或者图形界面(TotoiseGit)。
图形界面的话会隐藏所有的命令细节,所以建议大家学习的时候以命令为主,这样知其然并知其所以然。

二、Git配置

• (Linux) /etc/gitconfig文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件
• (Linux) ~/.gitconfig文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件
• 当前项目的 git 目录中的配置文件(也就是工作目录中的 .git/config 文件): 这里的配置仅仅针对当前项目有效,每一个级别的配置都会覆盖上层的相同配置,所以.git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量

用户信息设置(必须)

文本编辑器(可选,默认是vim)

差异分析工具(可选,默认是vim)

输入一次后保存用户名和密码

查看已有的配置信息

Continue reading "Git学习要点(团队管理)"

Git笔记

git配置
• /etc/gitconfig文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件

• ~/.gitconfig文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件

• 当前项目的 git 目录中的配置文件(也就是工作目录中的 .git/config 文件):
这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量

用户信息
git config --global user.name "John"
git config --global user.email john@johng.cn

文本编辑器
git config --global core.editor gedit

差异分析工具
git config --global merge.tool meld

查看配置信息要检查已有的配置信息
git config --list

输入一次后保存用户名和密码
git config --global credential.helper store

Continue reading "Git笔记"

公司SVN版本提交钩子post-commit.bat

  1. SET REPOS=%1  
  2. SET REV=%2  
  3. SET SVN_HOME_BIN=C:\svnServer\bin\  
  4. SET SVNUpdatePath=E:\svnupdate\gamebto\update\gamebto_new  
  5. SET VERPath=E:\svnupdate\gamebto\version\%date:~0,4%-%date:~5,2%-%date:~8,2%  
  6. SET WEBPath=E:\web\gamebto  
  7. SET WEBPath2=\\192.168.14.16\web\gamebto  
  8. SET WEBPath3=\\192.168.14.78\web\gamebto  
  9. SET WEBPath4=\\192.168.14.80\web\gamebto  
  10. SET ChangeList=E:\svnupdate\gamebto\logs\%date:~0,4%.%date:~5,2%.%date:~8,2%_%REV%.txt  
  11. %SVN_HOME_BIN%svnlook changed %REPOS% > %ChangeList%  
  12. %SVN_HOME_BIN%svn update %SVNUpdatePath%  
  13. E:  
  14. FOR /F "eol=; tokens=1 delims=" %%a in (%ChangeList%) do (FOR /f "tokens=1,2,* delims= "  %%i in ("%%a"do IF %%i==D (DEL %VERPath%%%~pnxj|DEL %WEBPath%%%~pnxj|DEL %WEBPath2%%%~pnxj) ELSE (echo f| xcopy %SVNUpdatePath%%%~pnxj %VERPath%%%~pnxj /R /Y /C|echo f| xcopy %SVNUpdatePath%%%~pnxj %WEBPath%%%~pnxj /R /Y /C|echo f| xcopy %SVNUpdatePath%%%~pnxj %WEBPath2%%%~pnxj /R /Y /C|echo f| xcopy %SVNUpdatePath%%%~pnxj %WEBPath3%%%~pnxj /R /Y /C|echo f| xcopy %SVNUpdatePath%%%~pnxj %WEBPath4%%%~pnxj /R /Y /C));