<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DevOps技术分享 &#187; Git</title>
	<atom:link href="http://www.showerlee.com/archives/category/ci-cd/git/feed" rel="self" type="application/rss+xml" />
	<link>http://www.showerlee.com</link>
	<description>与你共同学习运维开发</description>
	<lastBuildDate>Mon, 19 Oct 2020 05:51:41 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6</generator>
		<item>
		<title>Jenkins+Ansible+Gitlab自动化部署三剑客</title>
		<link>http://www.showerlee.com/archives/1880</link>
		<comments>http://www.showerlee.com/archives/1880#comments</comments>
		<pubDate>Fri, 11 Mar 2016 05:00:47 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Ansible]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[gitlab]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1880</guid>
		<description><![CDATA[最近一直在学习Ansible的一些playbook的写法, 所以一直没有怎么更新, 想到目前大家对诸如salt [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	
</p>
<p>
	最近一直在学习<a href="http://www.showerlee.com/archives/tag/ansible" title="查看Ansible中的全部文章" class="tag_link">Ansible</a>的一些playbook的写法, 所以一直没有怎么更新, 想到目前大家对诸如saltstack, docker, <a href="http://www.showerlee.com/archives/tag/ansible" title="查看Ansible中的全部文章" class="tag_link">Ansible</a>等自动化部署相关的工具很感兴趣, 但又苦于没有可学习的中文实例, 这里我就把我这几个月所接触到目前国外比较流行的部署经验给大家分享一下.
</p>
<p>
	<span style="line-height:1.5;">首先给大家介绍的是<a href="http://www.showerlee.com/archives/tag/ansible" title="查看Ansible中的全部文章" class="tag_link">Ansible</a>, 恩, 重要的问题说三遍, 不是Saltstack, Ansible作为一个python写的自动化部署工具, 确实较之前我所接触的Chef, saltstack, puppet更有自己的一些优势, 首先就是agentless, 无需在Linux client安装任何服务即可无缝连接Linux default ssh端口进行部署(windows需要安装winrm 开启ssh服务), 这点其实我觉得非常重要, 可以想象很多公司本身是对network管理非常严格的, 在部署一个产品的同时你需要考虑很多时间成本, 使用其他部署工具本身非常棘手的问题就是去申请开端口, client量少的话, 我们可以去等, 多的话本身你去request, waiting, unblock port等等long long process.... 最后会耗费很长时间. 这个对很多产品本身就是很致命的. 不推荐Saltstack的原因也是因为其需要在每台agent逐一去安装client service并测试, 这本身就会耗费一些时间成本.</span>
</p>
<p>
	<span style="line-height:1.5;">其他呢? 其实我觉得就是容易上手, 语法简单, 有现成模板让你去学习, 加之是我们非常喜爱的python语法, why not?</span>
</p>
<p>
	<span style="line-height:1.5;">Jenkins不用我多说, 估计懂行的人都在用它, 开源, 轻量级, 兼容性和扩展性强, 直观的GUI管理这都是它的优势, 配合Ansible我觉得用起来会非常easy going.</span>
</p>
<p>
	<span style="line-height:1.5;">最后提一下Gitlab, 为什么要用Gitlab? 他作为一个代码版本控制系统和部署有什么关系呢? 其实这里就涉及一个我们Ansible playbook管理问题, 试想我们需要维护一个公司庞大的server集群, 我们所有需要部署的机器或者产品会对应我们相对的部署脚本, 我们使用的Ansible playbook如果只是保存在Ansible Server的具体某个目录, 这本身就不便于我们进行编写维护更新(想想每次都跑到远程去编写playbook或者每次在本地编写好后再upload到远程我都会脑补数以万计的草泥马从我眼前呼啸而来).</span>
</p>
<p>
	<span style="line-height:1.5;">这里Gitlab就给我们提供一个非常方便以及直观的Playbook management. 我们需要做的其实就是在Gitlab去建立一个对应产品或者server的playbook仓库, 然后我们在本地写好后直接commit到这个仓库, 最后在部署的时候, 去让Jenkins pull这个playbook到其workspace, 并作为一个Job去run这个playbook, 这样是不是很规范, 而且便于管理?</span>
</p>
<p>
	<span style="line-height:1.5;">当然Ansible本身企业版Tower也会提供一个类似管理并维护playbook以及监控ansible本身running process的GUI管理系统, 用起来也很不错, 但作为收费版本, 我们在这里就不做过多阐述了.</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">这里我推荐Jenkins和Ansible可以安装到同一个环境作为部署server, Gitlab作为版本控制系统可单独部署在另一台server.</span>
</p>
<p>
	<span style="color:#E53333;">总结:</span>
</p>
<p>
	<span style="color:#E53333;">Jenkins首先从Gitlab去抓取我们写好的具体产品的playbook, 并使用virtualenv下的Ansible相关命令, 保证我们在一个clean的环境下使用stable version去批量部署我们的产品到远程client.</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;font-size:16px;">Let's go.....</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">一. 安装环境</span>
</p>
<p>
	System: CentOS 6.7 x64 (deploy.example.com)
</p>
<p>
	Jenkins:&nbsp;Jenkins ver. 1.650
</p>
<p>
	Ansible: Ansible 2.1.0
</p>
<p>
	Gitlab:&nbsp;GitLab 7.14.3
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">二. Jenkins配置</span>
</p>
<p>
	我们创建deploy用户作为jenkins_user, workspace为deploy家目录下的jenkins目录.
</p>
<p>
	# su - root
</p>
<p>
	# adduser deploy
</p>
<p>
	# wget -O /etc/yum.repos.d/jenkins.repo <a href="http://pkg.jenkins-ci.org/redhat/jenkins.repo" rel="nofollow">http://pkg.jenkins-ci.org/redhat/jenkins.repo</a>
</p>
<p>
	<span style="line-height:1.5;"># rpm --import <a href="https://jenkins-ci.org/redhat/jenkins-ci.org.key" rel="nofollow">https://jenkins-ci.org/redhat/jenkins-ci.org.key</a></span>
</p>
<p>
	<span style="line-height:1.5;"># yum install jenkins -y</span>
</p>
<p>
	<span style="line-height:1.5;"># vi&nbsp;/etc/sysconfig/jenkins</span>
</p>
<p>
	<span style="line-height:1.5;"> </span>
</p>
<pre class="prettyprint lang-bsh">...
JENKINS_HOME="/home/deploy/jenkins"
JENKINS_USER="deploy"
...</pre>
<p>
	# service jenkins start
</p>
<p>
	浏览器访问Jenkins页面
</p>
<p><a href="http://deploy.example.com:8080" rel="nofollow">http://deploy.example.com:8080</a></p>
<p>
	安装完成, 以下是我已经配置好的一些Jenkins&nbsp;Job.
</p>
<p>
	<span style="line-height:1.5;"></span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-0.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-0-1024x338.png" alt="QQ20160311-0" width="1024" height="338" class="alignnone size-large wp-image-1884" /></a>
</p>
<p>
	这里我们使用一个国内PHP网站模板phpcms作为我们需要部署的产品进行本次范例演示, 在进行最终的Build前我们需要做一些准备工作, 稍后我们会回到这个界面.
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">三. Ansible配置</span>
</p>
<p>
	这里我们需要配置virtualenv去隔离我们ansible的发行版本为最新版本2.1.0, 默认pip或者yum安装的1.9版本因为BUG以及对windows不兼容的原因, 这里不推荐使用.
</p>
<p>
	配置步骤传送门:&nbsp;<a href="http://www.showerlee.com/archives/1862" target="_blank">http://www.showerlee.com/archives/1862</a>
</p>
<p>
	Ansible-playbook范例传送门:&nbsp;<a href="http://www.showerlee.com/archives/1649" target="_blank">http://www.showerlee.com/archives/1649</a>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">四. Gitlab配置</span>
</p>
<p>
	部署并使用传送门:&nbsp;<a href="http://www.showerlee.com/archives/1285" target="_blank">http://www.showerlee.com/archives/1285</a>
</p>
<p>
	我们最终会创建一个ansible playbook仓库&nbsp;git@git.example.cn:showerlee/Ansible-showerlee.git, 并在本地编写好我们的规则, 最终commit到这个仓库, 以便Jenkins去调用我们的部署<span style="line-height:1.5;">规则.</span>
</p>
<p>
	<span style="color:#E53333;">这里博主单独clone出来一份部署phpcms的playbook仓库</span><span style="color:#E53333;">, 算是给大家的福利:</span>
</p>
<p>
	<a href="https://git.showerlee.com/showerlee/leon-playbook-phpcms1.1" target="_blank"><span style="color:#E53333;"><a href="https://git.showerlee.com/showerlee/leon-playbook-phpcms1.1" rel="nofollow">https://git.showerlee.com/showerlee/leon-playbook-phpcms1.1</a></span><span style="color:#E53333;"></span></a>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-2.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-2-1024x500.png" alt="" width="800" height="391" class="alignnone size-large wp-image-1885" title="" align="" /></a>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-3.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-3-1024x250.png" alt="" width="800" height="195" class="alignnone size-large wp-image-1886" title="" align="" /></a>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-4.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-4-1024x274.png" alt="" width="800" height="214" class="alignnone size-large wp-image-1887" title="" align="" /></a>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">五.最终部署</span>
</p>
<p>
	<span style="color:#337FE5;font-size:14px;">准备工作完毕, 我们接下来给大家介绍Jenkins Job配置.</span>
</p>
<p>
	<span style="color:#337FE5;font-size:14px;">1.创建一个new item</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-5.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-5.png" alt="QQ20160311-5" width="354" height="313" class="alignnone size-full wp-image-1888" /></a>
</p>
<p>
	<span style="color:#337FE5;font-size:14px;">2. 创建一个freestyle Job, 命名规则"产品名-环境", 这里我们为Phpcms-Dev</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-6.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-6-1024x306.png" alt="" width="800" height="239" class="alignnone size-large wp-image-1889" title="" align="" /></a>
</p>
<p>
	<span style="color:#337FE5;font-size:14px;">3. Job配置</span>
</p>
<p>
	<span style="color:#337FE5;">1). 定制Build参数.</span>
</p>
<p>
	这里Dynamic Choice Parameter用来通过Groovy脚本来抓取这个git仓库的所有branch, 并作为一个多选项, 方便我们在最终Build前去选择我们需要的这个产品Branch分支.
</p>
<p>
	Groovy抓取Git branch代码:
</p>
<p>
	
</p>
<pre class="prettyprint lang-bsh">def gettags = ("git ls-remote -h <a href="mailto:git@git.showerlee.com">git@git.showerlee.com</a>:showerlee/phpcms.git").execute()  
gettags.text.readLines().collect { it.split()[1].replaceAll('refs/heads/', '')  }.unique() </pre>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-11.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-11-1024x425.png" alt="" width="800" height="332" class="alignnone size-large wp-image-1895" title="" align="" /></a>
</p>
<p>
	Choice Parameter也是用来给我们Job定制Build前的可选参数, 不过这里的参数可以直接写死
</p>
<p>
	deploy_environment为我们的参数名, 定义我们的部署环境名,&nbsp;prod, qa为我们具体的可选项, 定义我们产品的两个环境.
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-8.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-8-1024x427.png" alt="" width="800" height="334" class="alignnone size-large wp-image-1892" title="" align="" /></a><span style="color:#337FE5;">2). 源代码管理</span>
</p>
<p>
	我们可以利用Jenkins内置的Source Code Management工具去抓取远程Git或者SVN仓库的代码到本地, 这里我们抓取存放在我们Gitlab上的Playbook到Jenkins的workspace目录, 用来进行后续部署工作, 这个仓库如需认证,&nbsp;我们可以在Credentials add这个仓库的用户账号密码, 其余均保持默认即可(默认Jenkins default不支持Git, 需要到其后台安装Git插件)
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-9.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-9-1024x557.png" alt="" width="800" height="435" class="alignnone size-large wp-image-1894" title="" align="" /></a>
</p>
<p>
	<span style="color:#337FE5;">3). Execute shell进行最终的CLI部署.</span>
</p>
<p>
	这个Build模块下的Execute shell方法是Jenkins比较常用并非常核心的功能, 用来执行我们部署过程中核心的命令.
</p>
<p>
	开头和结尾的set +x,&nbsp;set&nbsp;-x用来关闭和打开该部分的扩展参数及命令
</p>
<p>
	<span>开启virtualenv和加载ansible环境变量</span>
</p>
<pre class="prettyprint"># source /home/deploy/.virtualenv/bin/activate
# . /home/deploy/.virtualenv/ansible/hacking/env-setup -q</pre>
<p>
	<span>进入该Job的workspace目录下保存该playbook的仓库子目录下, 检查ansible版本, 并执行最终的部署命令.</span>
</p>
<pre class="prettyprint lang-bsh">cd $WORKSPACE/leon-playbook-phpcms1.1
ansible --version
ansible-playbook -i inventory/$deploy_environment ./deploy.yml -e project=phpcms -e branch=$branch_selector -e env=$deploy_environment</pre>
<p><span style="color:#E53333;">注: -i&nbsp;用来自定义ansible host文件路径, ./deploy.yml为ansible-playbook入口文件, -e 后可跟给当前session添加的环境变量.</span> </p>
<p>
	<span style="color:#E53333;">这里</span><span style="color:#E53333;">$deploy_environment</span> <span style="color:#E53333;">$branch_selector 为该Job定义好的可选参数, 详见3-1)</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-10.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-10-1024x266.png" alt="" width="800" height="208" class="alignnone size-large wp-image-1891" title="" align="" /></a>
</p>
<p>
	
</p>
<p>
	配置完毕后, save保存.
</p>
<p>
	<span style="color:#337FE5;font-size:14px;">4. 执行Job.</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-12.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-12-1024x336.png" alt="" width="800" height="263" class="alignnone size-large wp-image-1897" title="" align="" /></a>
</p>
<p>
	选择master分支和prod环境
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-13.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-13.png" alt="QQ20160311-13" width="859" height="302" class="alignnone size-full wp-image-1898" /></a>
</p>
<p>
	
</p>
<p>
	查看该Job最终的console output, 也就是显示我们实际在CLI下的输出结果.
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-14.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2016/03/QQ20160311-14.png" alt="QQ20160311-14" width="347" height="684" class="alignnone size-full wp-image-1899" /></a>
</p>
<p>
	
</p>
<h1 class="build-caption page-headline" style="color:#333333;font-family:Helvetica, Arial, sans-serif;">
	Console Output<br />
</h1>
<pre class="prettyprint lang-bsh">Started by user Leon Li
Building in workspace /home/deploy/jenkins/workspace/Phpcms-Dev
 &gt; git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 &gt; git config remote.origin.url <a href="mailto:git@git.showerlee.com">git@git.showerlee.com</a>:showerlee/Ansible-showerlee.git # timeout=10
Fetching upstream changes from <a href="mailto:git@git.showerlee.com">git@git.showerlee.com</a>:showerlee/Ansible-showerlee.git
 &gt; git --version # timeout=10
 &gt; git fetch --tags --progress <a href="mailto:git@git.showerlee.com">git@git.showerlee.com</a>:showerlee/Ansible-showerlee.git +refs/heads/*:refs/remotes/origin/*
 &gt; git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 &gt; git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 6bf787dcad68219d8eee09cecb83cbca36edbef1 (refs/remotes/origin/master)
 &gt; git config core.sparsecheckout # timeout=10
 &gt; git checkout -f 6bf787dcad68219d8eee09cecb83cbca36edbef1
 &gt; git rev-list 6bf787dcad68219d8eee09cecb83cbca36edbef1 # timeout=10
[Phpcms-Dev] $ /bin/sh -xe /tmp/hudson7452069223867148990.sh
+ set +x
ansible 2.1.0 (devel 6ddea3e915) last updated 2016/02/16 16:13:32 (GMT +800)
  lib/ansible/modules/core: (detached HEAD 8d126bd877) last updated 2016/02/16 16:19:09 (GMT +800)
  lib/ansible/modules/extras: (detached HEAD f6c5ed987f) last updated 2016/02/16 16:19:40 (GMT +800)
  config file = /home/deploy/jenkins/workspace/Phpcms-Dev/leon-playbook-phpcms1.1/ansible.cfg
  configured module search path = /home/deploy/active-ansible-modules/

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [127.0.0.1]

TASK [deploy : Backup current source code] *************************************
changed: [127.0.0.1]

cmd: mv /data/deploy_dir/phpcms /data/deploy_dir/phpcms_master_1457681152

start: 2016-03-11 15:25:54.774716

end: 2016-03-11 15:25:54.927415

delta: 0:00:00.152699

TASK [deploy : Get new source code] ********************************************
changed: [127.0.0.1]

TASK [deploy : Check if caches/configs/database.php exists] ********************
ok: [127.0.0.1]

TASK [deploy : Check if test_dir exists] ***************************************
ok: [127.0.0.1]

TASK [deploy : debug] **********************************************************
ok: [127.0.0.1] =&gt; {
    "msg": "/data/deploy_dir/phpcms_master_1457681152/caches/configs/database.php exists"
}

msg: /data/deploy_dir/phpcms_master_1457681152/caches/configs/database.php exists

TASK [deploy : debug] **********************************************************
ok: [127.0.0.1] =&gt; {
    "msg": "/data/deploy_dir/phpcms_master_1457681152/test_dir exists"
}

msg: /data/deploy_dir/phpcms_master_1457681152/test_dir exists

TASK [deploy : Copy remote necessary original config to new release when Product env] ***
changed: [127.0.0.1] =&gt; (item={u'name': u'db_config', u'dir': u'caches/configs/database.php'})
changed: [127.0.0.1] =&gt; (item={u'name': u'version_config', u'dir': u'caches/configs/version.php'})

msg: All items completed

results: [
  {
    "src": "/data/deploy_dir/phpcms_master_1457681152/caches/configs/database.php", 
    "changed": true, 
    "group": "deploy", 
    "uid": 606, 
    "dest": "/data/deploy_dir/phpcms/caches/configs/database.php", 
    "checksum": "91869c2faa244f8c5de8a586636c6b4f3c0a2817", 
    "md5sum": "fd88a78a4629bca012a79d22fdcecadd", 
    "owner": "deploy", 
    "_ansible_no_log": false, 
    "item": {
      "name": "db_config", 
      "dir": "caches/configs/database.php"
    }, 
    "state": "file", 
    "gid": 608, 
    "mode": "0644", 
    "invocation": {
      "module_args": {
        "src": "/data/deploy_dir/phpcms_master_1457681152/caches/configs/database.php", 
        "directory_mode": null, 
        "force": true, 
        "remote_src": true, 
        "dest": "/data/deploy_dir/phpcms/caches/configs/database.php", 
        "selevel": null, 
        "seuser": null, 
        "setype": null, 
        "group": null, 
        "content": null, 
        "serole": null, 
        "original_basename": null, 
        "delimiter": null, 
        "mode": "0644", 
        "regexp": null, 
        "owner": null, 
        "follow": false, 
        "validate": null, 
        "backup": false
      }
    }, 
    "size": 302
  }, 
  {
    "src": "/data/deploy_dir/phpcms_master_1457681152/caches/configs/version.php", 
    "changed": true, 
    "group": "deploy", 
    "uid": 606, 
    "dest": "/data/deploy_dir/phpcms/caches/configs/version.php", 
    "checksum": "d0eaedb46a36303eb3f3e2a77cc2a623062eff3c", 
    "md5sum": "7917d8199b7c6d5bc87ff3035a72670e", 
    "owner": "deploy", 
    "_ansible_no_log": false, 
    "item": {
      "name": "version_config", 
      "dir": "caches/configs/version.php"
    }, 
    "state": "file", 
    "gid": 608, 
    "mode": "0644", 
    "invocation": {
      "module_args": {
        "src": "/data/deploy_dir/phpcms_master_1457681152/caches/configs/version.php", 
        "directory_mode": null, 
        "force": true, 
        "remote_src": true, 
        "dest": "/data/deploy_dir/phpcms/caches/configs/version.php", 
        "selevel": null, 
        "seuser": null, 
        "setype": null, 
        "group": null, 
        "content": null, 
        "serole": null, 
        "original_basename": null, 
        "delimiter": null, 
        "mode": "0644", 
        "regexp": null, 
        "owner": null, 
        "follow": false, 
        "validate": null, 
        "backup": false
      }
    }, 
    "size": 127
  }
]

TASK [deploy : Copy dir test_dir to new release when Product env] **************
changed: [127.0.0.1]

cmd: cp -a /data/deploy_dir/phpcms_master_1457681152/test_dir /data/deploy_dir/phpcms/

start: 2016-03-11 15:26:16.966237

end: 2016-03-11 15:26:17.069705

delta: 0:00:00.103468

TASK [deploy : Get php version] ************************************************
changed: [127.0.0.1 -&gt; localhost]

cmd: python /home/deploy/jenkins/workspace/Phpcms-Dev/leon-playbook-phpcms1.1/roles/deploy/files/get_php_version.py <a href="http://www.showerlee.com" rel="nofollow">http://www.showerlee.com</a>

start: 2016-03-11 15:26:17.468311

end: 2016-03-11 15:26:51.560313

delta: 0:00:34.092002

stdout: PHP/5.4.13

TASK [deploy : debug] **********************************************************
ok: [127.0.0.1] =&gt; {
    "msg": {
        "changed": true, 
        "cmd": "python /home/deploy/jenkins/workspace/Phpcms-Dev/leon-playbook-phpcms1.1/roles/deploy/files/get_php_version.py <a href="http://www.showerlee.com" rel="nofollow">http://www.showerlee.com</a>", 
        "delta": "0:00:34.092002", 
        "end": "2016-03-11 15:26:51.560313", 
        "rc": 0, 
        "start": "2016-03-11 15:26:17.468311", 
        "stderr": "", 
        "stdout": "PHP/5.4.13", 
        "stdout_lines": [
            "PHP/5.4.13"
        ], 
        "warnings": []
    }
}

msg: {
  "changed": true, 
  "end": "2016-03-11 15:26:51.560313", 
  "stdout": "PHP/5.4.13", 
  "cmd": "python /home/deploy/jenkins/workspace/Phpcms-Dev/leon-playbook-phpcms1.1/roles/deploy/files/get_php_version.py <a href="http://www.showerlee.com" rel="nofollow">http://www.showerlee.com</a>", 
  "start": "2016-03-11 15:26:17.468311", 
  "delta": "0:00:34.092002", 
  "stderr": "", 
  "rc": 0, 
  "stdout_lines": [
    "PHP/5.4.13"
  ], 
  "warnings": []
}

TASK [deploy : debug] **********************************************************
ok: [127.0.0.1] =&gt; {
    "msg": "PHP/5.4.13"
}

msg: PHP/5.4.13

PLAY RECAP *********************************************************************
127.0.0.1                  : ok=12   changed=5    unreachable=0    failed=0   

Finished: SUCCESS</pre>
<p>
	
</p>
<p>
	这样我们就利用Jenkins+Ansible+Gitlab, 成功部署phpcms到远程Client.</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1880">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="Jenkins+Ansible+Gitlab自动化部署三剑客" href="http://www.showerlee.com/archives/1880">http://www.showerlee.com/archives/1880</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1880/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Windows下TortoiseGit over Putty or Openssh提交项目到GitLab</title>
		<link>http://www.showerlee.com/archives/1300</link>
		<comments>http://www.showerlee.com/archives/1300#comments</comments>
		<pubDate>Sat, 30 Aug 2014 05:45:28 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1300</guid>
		<description><![CDATA[Gitlab默认的配置推荐使用shell命令行与server端进行交互,作为搞SCM的表示无压力,但是作为开发 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	<a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>lab默认的配置推荐使用shell命令行与server端进行交互,作为搞SCM的表示无压力,但是作为开发人员还是比较适应windows的GUI图形管理,方便他们将注意力集中到代码编写上,所以今天刚好接着昨天给大家介绍一下使用windows下的git client工具实现将本地代码提交到远程服务器.
</p>
<p>
	
</p>
<p>
	<span>解决方案：</span>
</p>
<p>
	
</p>
<p>
	环境部署
</p>
<p>
	操作系统 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Windows7 x64 Sp1
</p>
<p>
	Tortoise<a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tortoise<a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>-1.8.11.0-64bit.msi
</p>
<p>
	Git &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Git-1.9.4-preview20140815.exe
</p>
<p>
	Putty &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PuTTY 0.63
</p>
<p>
	OpenSSH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; owned by Git&nbsp;
</p>
<p>
	下载地址: &nbsp;<a href="http://yunpan.cn/QaaLGsd23BsWL" rel="nofollow">http://yunpan.cn/QaaLGsd23BsWL</a> (访问密码 96d7)
</p>
<p>
	<span style="color:#E53333;">注: 此处下载地址中的安装包都为64位版本,32位请另行下载.</span>
</p>
<p>
	
</p>
<p>
	<strong>一.部署前的准备工作</strong>
</p>
<p>
	安装TortoiseGit,Git,Putty,默认下一步安装即可,其中Git为Git client环境安装包,确保windows包含git环境.
</p>
<p>
	
</p>
<p>
	<strong>二.配置PuTTY authentication agent</strong>
</p>
<p>
	在安装TortoiseGit后,可以选择使用OpenSSH客户端还是使用Putty客户端,如果使用的是默认的Putty客户端,由于TortoiseGit GUI连接不支持server端自定义端口配置,若GitLab使用的SSH端口为自定义端口,则需要使用PuTTY的authentication agent去做一个本地的端口转发.
</p>
<p>
	<span style="line-height:1.5;">1.首先使用TortoiseGit自带的Puttygen创建本地的公/私钥对</span>
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/11.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/11.jpg" alt="1" width="245" height="196" class="alignnone size-full wp-image-1301" /></a>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/2.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/2.jpg" alt="2" width="483" height="469" class="alignnone size-large wp-image-1302" /></a>
</p>
<p>
	
</p>
<p>
	<span style="line-height:1.5;">2.点击Generate按钮,在窗口空白处按照提示晃动鼠标,生成公/私钥对,并保存到本地</span>
</p>
<p>
	<span style="line-height:1.5;">其中testkey为公钥,testkey.ppk为私钥</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/3.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/3.jpg" alt="3" width="480" height="471" class="alignnone size-large wp-image-1303" /></a>
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/4.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/4.jpg" alt="4" width="715" height="92" class="alignnone size-large wp-image-1304" /></a>
</p>
<p>
	<span style="line-height:1.5;">3.将窗口生成的Public key粘贴到GitLab站点具体使用账号的SSh Keys内即完成公钥上传.</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/23.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/23.jpg" alt="23" width="900" height="536" class="alignnone size-full wp-image-1338" /></a>
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/5.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/5-1024x269.jpg" alt="5" width="1024" height="269" class="alignnone size-large wp-image-1305" /></a>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">4.使用PuTTY连接gitlab服务器,open之前需选择之前本地生成的私钥</span>
</p>
<p>
	这里服务端domain为git.example.com
</p>
<p>
	git为Server端SSH For GitLab账户
</p>
<p>
	SSH端口为自定义的2222
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/7.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/7.jpg" alt="7" width="456" height="438" class="alignnone size-full wp-image-1307" /></a> <a href="http://www.showerlee.com/wp-content/uploads/2014/08/8.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/8.jpg" alt="8" width="456" height="438" class="alignnone size-large wp-image-1308" /></a>&nbsp;
</p>
<p>
	<span><br />
</span>
</p>
<p>
	<span>5</span><span style="line-height:1.5;">.连接成功会在右下角任务栏出现任务图标</span>
</p>
<p>
	&nbsp; <a href="http://www.showerlee.com/wp-content/uploads/2014/08/9.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/9.jpg" alt="9" width="309" height="71" class="alignnone size-large wp-image-1309" /></a>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;"><strong>三.配置TortoiseGit</strong></span>
</p>
<p>
	
</p>
<p>
	1.从windows开始菜单选择TortoiseGit-Setting工具,在对话框里选择Git项,填写相关info
</p>
<p>
	<span style="color:#E53333;">注: 这里的User Info中Name建议与你的Gitlab的账户名保持一致,且该账户必须有该project的相关git操作权限,如果没有可能会造成GIT相关操作报permisson deny错误.当然如果你Gitlab本身刚搭建好,只有系统初始的admin账户,未添加其他账户,则这个权限问题会被系统忽略.</span>
</p>
<p>
	<span style="color:#E53333;">当然另外一种可能是:</span>
</p>
<p>
	<span style="color:#E53333;">大多数国内文档这里未提及这点可能在于国人的windows系统99.9%都是Ghost版本,初始都为admin最高权限,所以这边权限问题直接忽略,</span><span style="line-height:1.5;color:#E53333;">但如果你的windows系统是家庭版,或者未使用系统最高权限登陆,则会出现上述报错情况,这个问题也是在我一个朋友那边发现的,他的机子是Surface的Win8家庭版,一般都是普通用户登录,So让我倒持了大半天,终于发现了问题所在...</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">如果有git相关管理经验的朋友,这里可以解释一下.</span>
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/10.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/10.jpg" alt="10" width="699" height="471" class="alignnone size-full wp-image-1310" /></a>
</p>
<p>
	2.在D盘新建一个目录,例如"D:\Git",并进入目录右键目录空白处选择"Git Create repository here...",弹出对话框点确认,这样即建立了一个本地Git仓库.
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/111.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/111.jpg" alt="11" width="900" height="604" class="alignnone size-large wp-image-1311" /></a> <a href="http://www.showerlee.com/wp-content/uploads/2014/08/12.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/12.jpg" alt="12" width="470" height="186" class="alignnone size-large wp-image-1312" /></a>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">3.在该仓库目录下创建一个测试项目文本文件,右键目录空白处,选择Git Commit -&gt; "master" ...,在弹出对话框里输入提示注释,选择要加入的版本控制文件,确定即可提交.</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/18.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/18.jpg" alt="18" width="900" height="604" class="alignnone size-full wp-image-1319" /></a><br />
<a href="http://www.showerlee.com/wp-content/uploads/2014/08/13.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/13.jpg" alt="13" width="555" height="535" class="alignnone size-full wp-image-1314" /></a>
</p>
<p>
	
</p>
<p>
	4.现在只是在本地实现使用Git管理项目,在此界面若显示Success则本地提交成功,接下来点击Push..,把我们的改动递交到Git服务器上.<br />
<a href="http://www.showerlee.com/wp-content/uploads/2014/08/14.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/14.jpg" alt="14" width="555" height="535" class="alignnone size-full wp-image-1315" /></a>
</p>
<p>
	5.此时会弹出Push对话框,在Ref - Remote栏里设定当前分支名为master,然后点击Destination - Remote栏的Manage按钮.<br />
<a href="http://www.showerlee.com/wp-content/uploads/2014/08/15.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/15.jpg" alt="15" width="492" height="493" class="alignnone size-full wp-image-1316" /></a>
</p>
<p>
	6.在弹出的设置对话框中按照如图所示,填写服务器Remote名称,URL(git@git.yanwenbo.cn:root/tesproject.git),之前保存的本地私钥testkey.ppk,点击Add New/Save按钮保存这一设置,然后点击确定退出返回之前的对话框.
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/16.jpg"></a><a href="http://www.showerlee.com/wp-content/uploads/2014/08/101.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/101.jpg" alt="10" width="692" height="505" class="alignnone size-large wp-image-1354" /></a>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">7.最终确认提交</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/17.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/17.jpg" alt="17" width="492" height="493" class="alignnone size-full wp-image-1318" /></a>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">8.push成功</span>
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/20.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/20.jpg" alt="20" width="513" height="345" class="alignnone size-full wp-image-1322" /></a>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">9. Giblab后台查看提交结果.</span>
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/21.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/21.jpg" alt="21" width="748" height="295" class="alignnone size-full wp-image-1323" /></a> <a href="http://www.showerlee.com/wp-content/uploads/2014/08/22.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/22-1024x290.jpg" alt="22" width="1024" height="290" class="alignnone size-large wp-image-1324" /></a>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">大功告成...</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">后记...</span>
</p>
<p>
	<span style="line-height:1.5;">之前介绍的是利用</span><span style="line-height:1.5;">TortoiseGit配合putty实现SSH自定义端口的连接GitLab</span>
</p>
<p>
	<span style="line-height:1.5;">但是在给一个朋友配的过程中发现他的SURFACE WIN8系统死活无法PUSH成功,但我的win7同样方法就没问题,索性就用OPENSSH的命令行方法实现.</span>
</p>
<p>
	<span style="line-height:1.5;">具体过程这里较之前的稍作更改</span>
</p>
<p>
	1. 利用git bash创建秘钥,方法和linux命令行创建秘钥命令行格式基本一致
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/110.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/110.jpg" alt="1" width="239" height="69" class="alignnone size-full wp-image-1344" /></a>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/24.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/24.jpg" alt="2" width="677" height="392" class="alignnone size-large wp-image-1345" /></a>
</p>
<p>
	a.客户端生成秘钥
</p>
<p>
	# cd ~
</p>
<p>
	# ssh-keygen -t rsa
</p>
<p>
	一路回车后生成公钥和秘钥对
</p>
<p>
	<span style="line-height:1.5;"># cat ~/.ssh/id_rsa.pub&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">—————————————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">将这里生成的秘钥全部复制并粘贴到gitlab web SSH Keys后台保存即可</span>
</p>
<p>
	<span style="line-height:1.5;">—————————————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">上传后如图:</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#111111;font-family:'Century Gothic', 'Microsoft YaHei', Verdana, Arial, Helvetica, sans-serif;font-size:13px;line-height:1.5;vertical-align:baseline;"></span><a href="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140829-9@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140829-9@2x-1024x291.png" alt="QQ20140829-9@2x" width="1024" height="291" class="alignnone size-large wp-image-1288" /></a>
</p>
<p>
	<span style="line-height:1.5;">b.测试SSH连接</span>
</p>
<p>
	<span style="line-height:1.5;"># ssh -p22 <a href="mailto:git@git.example.com">git@git.example.com</a></span>
</p>
<p>
	<span style="line-height:1.5;">若报如下错误:</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">PTY allocation request failed on channel 1</span>
</p>
<p>
	<span style="line-height:1.5;">/usr/bin/env: ruby: No such file or directory</span>
</p>
<p>
	<span style="line-height:1.5;">Connection to git.example.com closed.</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">说明服务端ruby环境变量未在此目录/usr/bin/ruby</span>
</p>
<p>
	<span style="line-height:1.5;">在服务器端加此软链即可:</span>
</p>
<p>
	<span style="line-height:1.5;"># ln -s /usr/local/ruby/bin/ruby /usr/bin/ruby</span>
</p>
<p>
	<span style="line-height:1.5;">注:若服务器端SSH自定义端口,则需要在客户端~/.ssh/config下添加端口配置</span>
</p>
<p>
	<span style="line-height:1.5;">假定自定义SSH端口为2222</span>
</p>
<p>
	<span style="line-height:1.5;"># echo “Port 2222” &gt;&gt; ~/.ssh/config</span>
</p>
<p>
	<span style="line-height:1.5;">c.重新连接</span>
</p>
<p>
	<span style="line-height:1.5;"># ssh -p22 <a href="mailto:git@git.example.com">git@git.example.com</a></span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">PTY allocation request failed on channel 1</span>
</p>
<p>
	<span style="line-height:1.5;">Welcome to GitLab, Anonymous!</span>
</p>
<p>
	<span style="line-height:1.5;">Connection to git.example.com closed.</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————</span>
</p>
<p></p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/32.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/32.jpg" alt="3" width="663" height="193" class="alignnone size-full wp-image-1347" /></a>
</p>
<p>
	
</p>
<p>
	2.将TortoiseGit默认的SSH客户端TortoiseGitPlink(Putty)<span>更改</span>为openssh,具体路径与你的实际安装路径为准.
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/41.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/41.jpg" alt="4" width="231" height="190" class="alignnone size-full wp-image-1348" /></a> <a href="http://www.showerlee.com/wp-content/uploads/2014/08/51.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/51.jpg" alt="5" width="699" height="471" class="alignnone size-large wp-image-1349" /></a> <a href="http://www.showerlee.com/wp-content/uploads/2014/08/61.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/61.jpg" alt="6" width="445" height="102" class="alignnone size-large wp-image-1350" /></a>
</p>
<p>
	3.更改<span>TortoiseGit的秘钥import路径为Git bash命令行生成的秘钥路径</span>
</p>
<p>
	<span>将之前到此处的配置中如下PuttyGen生成的秘钥路径更改成你的openssh生成的秘钥&nbsp;</span>
</p>
<p>
	<span>笔者是windows管理员账户登录</span>
</p>
<p>
	<span>所以路径为 C:\Users\Administrator\.ssh\id_rsa&nbsp;</span>
</p>
<p>
	<span><a href="http://www.showerlee.com/wp-content/uploads/2014/08/101.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/101.jpg" alt="10" width="692" height="505" class="alignnone size-large wp-image-1354" /></a><br />
</span>
</p>
<p></p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/91.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/91.jpg" alt="9" width="696" height="509" class="alignnone size-full wp-image-1353" /></a>
</p>
<p>
	
</p>
<p>
	4.其他配置保持不变,按照上文操作即可完成openssh认证远程Git over SSH for Gitlab.</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1300">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="Windows下TortoiseGit over Putty or Openssh提交项目到GitLab" href="http://www.showerlee.com/archives/1300">http://www.showerlee.com/archives/1300</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1300/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CentOS6.3下GitLab+Nginx(SSL)+MySQL+Ruby安装部署</title>
		<link>http://www.showerlee.com/archives/1285</link>
		<comments>http://www.showerlee.com/archives/1285#comments</comments>
		<pubDate>Fri, 29 Aug 2014 14:12:21 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1285</guid>
		<description><![CDATA[Gitlab是一个用Ruby on Rails开发的开源项目管理程序.可以通过WEB界面进行访问公开的或者私人 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	<a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>lab是一个用Ruby on Rails开发的开源项目管理程序.可以通过WEB界面进行访问公开的或者私人项目. 它和<a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>hub有类似的功能，能够浏览源代码，管理缺陷和注释.
</p>
<p>
	本文选择NGINX与MYSQL来配合<a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>Lab实现web管理,数据存储等功能,配置过程中难点基本在<a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>Lab的脚本修改,SSH秘钥连接,Nginx SSL证书等这些方面,作者也是耗费非常大的力气,结合很多文档的clue以及很多老外的debug comment,终于最终完成,希望在此给大家一个抛砖引玉的机会,了解到SCM(软件配置管理)其实也不是想象中那么小儿科,很多逻辑也着实需要下功夫investigation.
</p>
<p>
	最后我是一路向北,我为我自己带盐....
</p>
<p>
	
</p>
<p>
	解决方案：
</p>
<p>
	
</p>
<p>
	环境部署
</p>
<p>
	<span style="line-height:1.5;">操作系统 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; centos6.3 x64</span>
</p>
<p>
	<span style="line-height:1.5;"><a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>Lab&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span><a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>Lab</span>&nbsp;<span>6-3-stable</span></span>
</p>
<p>
	<span style="line-height:1.5;"><a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>Lab Shell &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1.8.0</span>
</p>
<p>
	<span style="line-height:1.5;">Ruby &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.0.0p353</span><span style="line-height:1.5;"></span>
</p>
<p>
	<span style="line-height:1.5;">NGINX &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nginx-1.4.0</span>
</p>
<p>
	<span style="line-height:1.5;">MYSQL &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;mysql-5.6.10</span>
</p>
<p>
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</p>
<p>
	<a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a> server(centos6.3 x64): git.example.com
</p>
<p>
	<span style="line-height:1.5;"><a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a> client(centos6.3 x64): client.example.com</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">server端配置:</span>
</p>
<p>
	
</p>
<p>
	<strong>一.安装前的准备工作</strong>
</p>
<p>
	
</p>
<p>
	1.关闭iptables和SELINUX
</p>
<p>
	
</p>
<p>
	# service iptables stop
</p>
<p>
	<span style="line-height:1.5;"># setenforce 0</span>
</p>
<p>
	<span style="line-height:1.5;"># vi /etc/sysconfig/selinux</span>
</p>
<p>
	<span style="line-height:1.5;">---------------</span>
</p>
<p>
	<span style="line-height:1.5;">SELINUX=disabled</span>
</p>
<p>
	<span style="line-height:1.5;">---------------</span>
</p>
<p>
	
</p>
<p>
	2.同步时间
</p>
<p>
	
</p>
<p>
	# ntpdate cn.pool.ntp.org
</p>
<p>
	
</p>
<p>
	3.安装LNMP
</p>
<p>
	
</p>
<p>
	传送门：<a href="http://www.showerlee.com/archives/73" target="_blank">http://www.showerlee.com/archives/73</a>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">4.安装GitLab的所需依赖包和工具</span>
</p>
<p>
	<span style="line-height:1.5;"># su -</span>
</p>
<p>
	<span style="line-height:1.5;"># rpm -Uvh <a href="http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-5-4.noarch.rpm" rel="nofollow">http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-5-4.noarch.rpm</a></span>
</p>
<p>
	<span style="line-height:1.5;"># yum -y groupinstall 'Development Tools'</span>
</p>
<p>
	<span style="line-height:1.5;"># yum -y install vim-enhanced readline readline-devel ncurses-devel gdbm-devel glibc-devel tcl-devel openssl-devel curl-devel expat-devel db4-devel byacc sqlite-devel gcc-c++ libyaml libyaml-devel libffi libffi-devel libxml2 libxml2-devel libxslt libxslt-devel libicu libicu-devel system-config-firewall-tui python-devel redis sudo wget crontabs logwatch logrotate perl-Time-HiRes git</span>
</p>
<p>
	
</p>
<p>
	5.配置redis
</p>
<p>
	<span style="line-height:1.5;">配置redis开机启动：</span>
</p>
<p>
	<span style="line-height:1.5;"># chkconfig redis on</span>
</p>
<p>
	<span style="line-height:1.5;"># service redis start</span>
</p>
<p>
	
</p>
<p>
	6.更改gem源(若默认无法连接)
</p>
<p>
	a.显示当前使用的sources
</p>
<p>
	<span style="line-height:1.5;"># gem sources</span>
</p>
<p>
	
</p>
<p>
	b.删除缺省source
</p>
<p>
	<span style="line-height:1.5;"># gem sources -r <a href="http://rubygems.org/" rel="nofollow">http://rubygems.org/</a></span>
</p>
<p>
	
</p>
<p>
	c.添加一个source
</p>
<p>
	<span style="line-height:1.5;"># gem sources -a <a href="https://ruby.taobao.org" rel="nofollow">https://ruby.taobao.org</a></span>
</p>
<p>
	
</p>
<p>
	d.更新source cache
</p>
<p>
	<span style="line-height:1.5;"># gem sources -u</span>
</p>
<p>
	
</p>
<p>
	6.安装Ruby
</p>
<p>
	
</p>
<p>
	a.源码安装Ruby
</p>
<p>
	<span style="line-height:1.5;">传送门: <a href="http://www.showerlee.com/archives/1123" target="_blank">http://www.showerlee.com/archives/1123</a></span>
</p>
<p>
	
</p>
<p>
	b.安装bundle组件：
</p>
<p>
	<span style="line-height:1.5;"># gem install bundler --no-ri --no-rdoc</span>
</p>
<p>
	
</p>
<p>
	<strong>二.安装GITLab shell</strong>
</p>
<p>
	
</p>
<p>
	1.创建用户git
</p>
<p>
	<span style="line-height:1.5;"># su -</span>
</p>
<p>
	<span style="line-height:1.5;"># adduser --system --shell /bin/bash --comment 'GitLab' --create-home --home-dir /home/git/ git</span>
</p>
<p>
	
</p>
<p>
	2、配置GitLab shell
</p>
<p>
	GitLab shell是专门为GitLab开发的提供ssh访问和版本管理的软件。
</p>
<p>
	a.使用git账户登陆
</p>
<p>
	<span style="line-height:1.5;"># su - git</span>
</p>
<p>
	
</p>
<p>
	b.克隆gitlab shell
</p>
<p>
	<span style="line-height:1.5;"># git clone <a href="https://github.com/gitlabhq/gitlab-shell.git" rel="nofollow">https://github.com/gitlabhq/gitlab-shell.git</a></span>
</p>
<p>
	
</p>
<p>
	c.切换成1.8.0版本，并编辑配置
</p>
<p>
	<span style="line-height:1.5;"># cd gitlab-shell</span>
</p>
<p>
	<span style="line-height:1.5;"># git checkout v1.8.0</span>
</p>
<p>
	
</p>
<p>
	d.拷贝配置文件
</p>
<p>
	<span style="line-height:1.5;"># cp config.yml.example config.yml</span>
</p>
<p>
	<span style="line-height:1.5;"># vi config.yml</span>
</p>
<p>
	<span style="line-height:1.5;">—————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;"># 将gitlab_url修改成gitlab的访问域名。例如本文档：https://git.example.com/</span>
</p>
<p>
	<span style="line-height:1.5;">gitlab_url: "https://git.example.com"</span>
</p>
<p>
	<span style="line-height:1.5;"># 将self_signed_cert修改成 true</span>
</p>
<p>
	<span style="line-height:1.5;">self_signed_cert: true</span>
</p>
<p>
	<span style="line-height:1.5;"># 添加网站SSL证书&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">ca_file: "/usr/local/nginx/ssl/gitlab.crt"</span>
</p>
<p>
	—————————————————————————————————————————
</p>
<p>
	<span style="color:#E53333;">注：如果gitlab是使用http访问，则需将https替换成http，配置文件中的self_signed_cert要修改成false，否则gitlab shell在通过api和gitlab进行通信的时候就会出现错误，导致项目push出错。因为后面配置web服务器的时候是使用ssl，所以这里要按照ssl的方式配置。</span>
</p>
<p>
	<span style="color:#E53333;line-height:1.5;">另外本文档的域名为测试域名，不要忘记在C/S两端均做好域名映射。</span>
</p>
<p>
	
</p>
<p>
	e.安装一些需要的目录和文件
</p>
<p>
	<span style="line-height:1.5;"># ./bin/install</span>
</p>
<p>
	
</p>
<p>
	5、配置MySQL数据库(安装过程详见上文)
</p>
<p>
	a.登录数据库
</p>
<p>
	<span style="line-height:1.5;"># mysql -u root -p</span>
</p>
<p>
	
</p>
<p>
	b. 为gitlab创建使用用户
</p>
<p>
	<span style="line-height:1.5;">&gt; create user gitlab@'localhost' identified by '123456';</span>
</p>
<p>
	
</p>
<p>
	c.创建gitlaba使用的数据库
</p>
<p>
	<span style="line-height:1.5;">&gt; CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;</span>
</p>
<p>
	
</p>
<p>
	d.给予gitlab用户权限
</p>
<p>
	<span style="line-height:1.5;">&gt; GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost';</span>
</p>
<p>
	
</p>
<p>
	<strong>三.安装GitLab</strong>
</p>
<p>
	
</p>
<p>
	1.将GitLab安装在git的家目录下：
</p>
<p>
	<span style="line-height:1.5;"># su - git</span>
</p>
<p>
	
</p>
<p>
	2.克隆GitLab并切换分支到6-3-stable
</p>
<p>
	<span style="line-height:1.5;">a.克隆GitLab</span>
</p>
<p>
	<span style="line-height:1.5;"># git clone <a href="https://github.com/gitlabhq/gitlabhq.git" rel="nofollow">https://github.com/gitlabhq/gitlabhq.git</a> gitlab</span>
</p>
<p>
	
</p>
<p>
	b. 切换到6-3-stable分支
</p>
<p>
	<span style="line-height:1.5;"># cd /home/git/gitlab</span>
</p>
<p>
	<span style="line-height:1.5;"># git checkout 6-3-stable</span>
</p>
<p>
	
</p>
<p>
	c、配置项目
</p>
<p>
	<span style="line-height:1.5;">a.复制配置文件</span>
</p>
<p>
	<span style="line-height:1.5;"># cp config/gitlab.yml.example config/gitlab.yml</span>
</p>
<p>
	
</p>
<p>
	b.修改配置文件中的访问域名
</p>
<p>
	<span style="line-height:1.5;"># sed -i 's|localhost|git.example.com|g' config/gitlab.yml</span>
</p>
<p>
	
</p>
<p>
	d.设定log和tmp目录所有者和权限
</p>
<p>
	<span style="line-height:1.5;"># chown -R git log/</span>
</p>
<p>
	<span style="line-height:1.5;"># chown -R git tmp/</span>
</p>
<p>
	<span style="line-height:1.5;"># chmod -R u+rwX log/</span>
</p>
<p>
	<span style="line-height:1.5;"># chmod -R u+rwX tmp/</span>
</p>
<p>
	
</p>
<p>
	e.创建gitlab-satellites目录
</p>
<p>
	<span style="line-height:1.5;"># mkdir /home/git/gitlab-satellites</span>
</p>
<p>
	
</p>
<p>
	f.创建tmp/pids/和tmp/sockets/目录，确保gitlab有相应的权限
</p>
<p>
	<span style="line-height:1.5;"># mkdir tmp/pids/</span>
</p>
<p>
	<span style="line-height:1.5;"># mkdir tmp/sockets/</span>
</p>
<p>
	<span style="line-height:1.5;"># chmod -R u+rwX tmp/pids/</span>
</p>
<p>
	<span style="line-height:1.5;"># chmod -R u+rwX tmp/sockets/</span>
</p>
<p>
	
</p>
<p>
	g.创建public/uploads目录
</p>
<p>
	<span style="line-height:1.5;"># mkdir public/uploads</span>
</p>
<p>
	<span style="line-height:1.5;"># chmod -R u+rwX public/uploads</span>
</p>
<p>
	
</p>
<p>
	h.复制unicorn配置
</p>
<p>
	<span style="line-height:1.5;"># cp config/unicorn.rb.example config/unicorn.rb</span>
</p>
<p>
	
</p>
<p>
	i.保持unicorn配置文件默认配置
</p>
<p>
	
</p>
<p>
	g.配置git的用户和邮件
</p>
<p>
	<span style="line-height:1.5;"># git config --global user.name "GitLab"</span>
</p>
<p>
	<span style="line-height:1.5;"># git config --global user.email "gitlab@git.example.com”</span>
</p>
<p>
	<span style="line-height:1.5;"># git config --global core.autocrlf input</span>
</p>
<p>
	
</p>
<p>
	k.配置数据库访问文件
</p>
<p>
	<span style="line-height:1.5;"># cp config/database.yml.mysql config/database.yml</span>
</p>
<p>
	编辑config/database.yml，设置其中连接数据库的账号密码
</p>
<p>
	<span style="line-height:1.5;"># vi config/database.yml</span>
</p>
<p>
	<span style="line-height:1.5;">———————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">#</span>
</p>
<p>
	<span style="line-height:1.5;"># PRODUCTION</span>
</p>
<p>
	<span style="line-height:1.5;">#</span>
</p>
<p>
	<span style="line-height:1.5;">production:</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; adapter: mysql2</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; encoding: utf8</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; reconnect: false</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; database: gitlabhq_production</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; pool: 10</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; username: <span style="color:#E53333;">gitlab</span></span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; password: “<span style="color:#E53333;">123456</span>”</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; # host: localhost</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; # socket: /tmp/mysql.sock</span>
</p>
<p>
	<span style="line-height:1.5;">———————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">修改其中username和password就可以了，其中密码就是上面数据库步骤中创建gitlab用户的密码。</span>
</p>
<p>
	
</p>
<p>
	l.确保该文件只有git账号有权限读取。
</p>
<p>
	<span style="line-height:1.5;"># chmod o-rwx config/database.yml</span>
</p>
<p>
	
</p>
<p>
	<strong>四.安装Gems</strong>
</p>
<p>
	
</p>
<p>
	1.安装charlock_holmes
</p>
<p>
	<span style="line-height:1.5;"># su -</span>
</p>
<p>
	<span style="line-height:1.5;"># gem install charlock_holmes --version '0.6.9.4'</span>
</p>
<p>
	<span style="line-height:1.5;"># exit</span>
</p>
<p>
	
</p>
<p>
	2.安装mysql包
</p>
<p>
	<span style="line-height:1.5;"># cd /home/git/gitlab/</span>
</p>
<p>
	<span style="line-height:1.5;"># vi Gemfile&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">修改 <a href="https://rubygems.org" rel="nofollow">https://rubygems.org</a> 为 <a href="https://ruby.taobao.org" rel="nofollow">https://ruby.taobao.org</a></span>
</p>
<p>
	
</p>
<p>
	# bundle install --deployment --without development test postgres puma aws
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">若报Could not find modernizr-2.6.2 in any of the sources错误,没有则无视:</span>
</p>
<p>
	<span style="color:#E53333;">修复方案:</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;"># vi Gemfile</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">搜索该行 &nbsp; gem "modernizr", &nbsp; &nbsp; &nbsp; &nbsp;"2.6.2"</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">更改为： &nbsp; gem "modernizr-rails", &nbsp;"2.7.1"</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;"># vi Gemfile.lock</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">搜索该行 &nbsp; modernizr (2.6.2)</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">更改为： &nbsp; modernizr-rails (2.7.1)</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">搜索该行 &nbsp; modernizr (= 2.6.2)：</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">更改为： &nbsp; modernizr-rails (= 2.7.1)</span>
</p>
<p>
	
</p>
<p>
	重新执行
</p>
<p>
	<span style="line-height:1.5;"># bundle install --deployment --without development test postgres puma aws</span>
</p>
<p>
	
</p>
<p>
	3.初始化数据和激活高级功能
</p>
<p>
	<span style="line-height:1.5;"># cd /home/git/gitlab</span>
</p>
<p>
	<span style="line-height:1.5;"># bundle exec rake gitlab:setup RAILS_ENV=production</span>
</p>
<p>
	<span style="line-height:1.5;">这步完成后，会生一个默认的管理员账号/密码：</span>
</p>
<p>
	<span style="line-height:1.5;"><a href="mailto:admin@local.host">admin@local.host</a>/5iveL!fe</span>
</p>
<p>
	
</p>
<p>
	4.安装启动脚本
</p>
<p>
	<span style="line-height:1.5;"># su -</span>
</p>
<p>
	<span style="line-height:1.5;"># wget -O /etc/init.d/gitlab <a href="https://raw.github.com/gitlabhq/gitlab-recipes/5-0-stable/init.d/gitlab" rel="nofollow">https://raw.github.com/gitlabhq/gitlab-recipes/5-0-stable/init.d/gitlab</a></span>
</p>
<p>
	<span style="line-height:1.5;"># chmod +x /etc/init.d/gitlab</span>
</p>
<p>
	
</p>
<p>
	5.开机时启动
</p>
<p>
	<span style="line-height:1.5;"># chkconfig --add gitlab</span>
</p>
<p>
	<span style="line-height:1.5;"># chkconfig gitlab on</span>
</p>
<p>
	
</p>
<p>
	6.检测应用程序状态
</p>
<p>
	<span style="line-height:1.5;"># su - git</span>
</p>
<p>
	<span style="line-height:1.5;"># cd gitlab/</span>
</p>
<p>
	<span style="line-height:1.5;"># bundle exec rake gitlab:env:info RAILS_ENV=production</span>
</p>
<p>
	<span style="line-height:1.5;"># exit</span>
</p>
<p>
	<span style="line-height:1.5;">可以查看到系统、Ruby、GitLab和GitLab Shell的版本和其他信息。</span>
</p>
<p>
	
</p>
<p>
	7.启动GitLab实例
</p>
<p>
	<span style="line-height:1.5;"># service gitlab start</span>
</p>
<p>
	
</p>
<p>
	8.查看应用更加详细的信息
</p>
<p>
	<span style="line-height:1.5;"># su - git</span>
</p>
<p>
	<span style="line-height:1.5;"># cd gitlab/</span>
</p>
<p>
	# bundle exec rake gitlab:check RAILS_ENV=production
</p>
<p>
	<span style="line-height:1.5;">这里会提示一个Init script up-to-date的错误，如下：</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">Init script up-to-date? ... no</span>
</p>
<p>
	<span style="line-height:1.5;">Try fixing it:</span>
</p>
<p>
	<span style="line-height:1.5;">Redownload the init script</span>
</p>
<p>
	<span style="line-height:1.5;">For more information see:</span>
</p>
<p>
	<span style="line-height:1.5;">doc/install/installation.md in section "Install Init Script"</span>
</p>
<p>
	<span style="line-height:1.5;">Please fix the error above and rerun the checks.</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">查阅官方自带文档,说明此问题可忽略.</span>
</p>
<p>
	
</p>
<p>
	<strong>五.Nginx配置</strong>
</p>
<p>
	
</p>
<p>
	1.配置Gitlab虚拟主机及SSL连接:
</p>
<p>
	
</p>
<p>
	# cd /usr/local/nginx/conf/vhosts/
</p>
<p>
	<span style="line-height:1.5;"># vi gitlab-ssl.conf</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注: 这里先感谢提供此脚本的极客,该脚本在原基础上稍作改动.</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">内容用红字标注的地方为需要自定义的地方.</span>
</p>
<p>
	<span style="line-height:1.5;">————————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">## GitLab</span>
</p>
<p>
	<span style="line-height:1.5;">## Contributors: randx, yin8086, sashkab, orkoden, axilleas</span>
</p>
<p>
	<span style="line-height:1.5;">## App Version: 5.4 - 6.0</span>
</p>
<p>
	<span style="line-height:1.5;">##</span>
</p>
<p>
	<span style="line-height:1.5;">## Modified from nginx http version</span>
</p>
<p>
	<span style="line-height:1.5;">## Modified from <a href="http://blog.phusion.nl/2012/04/21/tutorial-setting-up-gitlab-on-debian-6/" rel="nofollow">http://blog.phusion.nl/2012/04/21/tutorial-setting-up-gitlab-on-debian-6/</a></span>
</p>
<p>
	<span style="line-height:1.5;">##</span>
</p>
<p>
	<span style="line-height:1.5;">## Lines starting with two hashes (##) are comments containing information</span>
</p>
<p>
	<span style="line-height:1.5;">## for configuration. One hash (#) comments are actual configuration parameters</span>
</p>
<p>
	<span style="line-height:1.5;">## which you can comment/uncomment to your liking.</span>
</p>
<p>
	<span style="line-height:1.5;">##</span>
</p>
<p>
	<span style="line-height:1.5;">###################################</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp; &nbsp; &nbsp; &nbsp;SSL configuration &nbsp; &nbsp; &nbsp;##</span>
</p>
<p>
	<span style="line-height:1.5;">###################################</span>
</p>
<p>
	<span style="line-height:1.5;">##</span>
</p>
<p>
	<span style="line-height:1.5;">## Optimal configuration is taken from:</span>
</p>
<p>
	<span style="line-height:1.5;">## <a href="https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html" rel="nofollow">https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html</a></span>
</p>
<p>
	<span style="line-height:1.5;">## Make sure to read it and understand what each option does.</span>
</p>
<p>
	<span style="line-height:1.5;">##</span>
</p>
<p>
	<span style="line-height:1.5;">## [Optional] Generate a self-signed ssl certificate:</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp; &nbsp;mkdir /etc/nginx/ssl/</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp; &nbsp;cd /etc/nginx/ssl/</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp; &nbsp;sudo openssl req -newkey rsa:2048 -x509 -nodes -days 3560 -out gitlab.crt -keyout gitlab.key</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp; &nbsp;sudo chmod o-r gitlab.key</span>
</p>
<p>
	<span style="line-height:1.5;">##</span>
</p>
<p>
	<span style="line-height:1.5;">## Edit `gitlab-shell/config.yml`:</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp;1) Set "gitlab_url" param in `gitlab-shell/config.yml` to `https://git.example.com`</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp;2) Set "ca_file" to `/etc/nginx/ssl/gitlab.crt`</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp;3) Set "self_signed_cert" to `true`</span>
</p>
<p>
	<span style="line-height:1.5;">## Edit `gitlab/config/gitlab.yml`:</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp;1) Define port for http "port: 443"</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp;2) Enable https "https: true"</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp;3) Update ssl for gravatar "ssl_url: <a href="https://secure.gravatar.com/avatar/%" rel="nofollow">https://secure.gravatar.com/avatar/%</a>{hash}?s=%{size}&amp;d=mm"</span>
</p>
<p>
	<span style="line-height:1.5;">##</span>
</p>
<p>
	<span style="line-height:1.5;">##################################</span>
</p>
<p>
	<span style="line-height:1.5;">## &nbsp; &nbsp; &nbsp; &nbsp;CHUNKED TRANSFER &nbsp; &nbsp; &nbsp;##</span>
</p>
<p>
	<span style="line-height:1.5;">##################################</span>
</p>
<p>
	<span style="line-height:1.5;">##</span>
</p>
<p>
	<span style="line-height:1.5;">## It is a known issue that Git-over-HTTP requires chunked transfer encoding [0]</span>
</p>
<p>
	<span style="line-height:1.5;">## which is not supported by Nginx &lt; 1.3.9 [1]. As a result, pushing a large object</span>
</p>
<p>
	<span style="line-height:1.5;">## with Git (i.e. a single large file) can lead to a 411 error. In theory you can get</span>
</p>
<p>
	<span style="line-height:1.5;">## around this by tweaking this configuration file and either:</span>
</p>
<p>
	<span style="line-height:1.5;">## - installing an old version of Nginx with the chunkin module [2] compiled in, or</span>
</p>
<p>
	## - using a newer version of Nginx.
</p>
<p>
	##
</p>
<p>
	<span style="line-height:1.5;">## At the time of writing we do not know if either of these theoretical solutions works. As a workaround</span>
</p>
<p>
	<span style="line-height:1.5;">## users can use Git over SSH to push large files.</span>
</p>
<p>
	<span style="line-height:1.5;">##</span>
</p>
<p>
	<span style="line-height:1.5;">## [0] <a href="https://git.kernel.org/cgit/git/git.git/tree/Documentation/technical/http-protocol.txt#n99" rel="nofollow">https://git.kernel.org/cgit/git/git.git/tree/Documentation/technical/http-protocol.txt#n99</a></span>
</p>
<p>
	<span style="line-height:1.5;">## [1] <a href="https://github.com/agentzh/chunkin-nginx-module#status" rel="nofollow">https://github.com/agentzh/chunkin-nginx-module#status</a></span>
</p>
<p>
	<span style="line-height:1.5;">## [2] <a href="https://github.com/agentzh/chunkin-nginx-module" rel="nofollow">https://github.com/agentzh/chunkin-nginx-module</a></span>
</p>
<p></p>
<p>
	
</p>
<p>
	upstream gitlab {
</p>
<p>
	
</p>
<p>
	&nbsp; ## Uncomment if you have set up puma/unicorn to listen on a unix socket (recommended).
</p>
<p>
	<span style="line-height:1.5;">&nbsp; server unix:/home/git/gitlab/tmp/sockets/gitlab.socket;</span>
</p>
<p></p>
<p>
	<span style="line-height:1.5;">&nbsp; ## Uncomment if puma/unicorn are configured to listen on a tcp port.</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ## Check the port number in /home/git/gitlab/config/{puma.rb/unicorn.rb}</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; # <span style="color:#E53333;">server 127.0.0.1:8080</span>;</span>
</p>
<p>
	<span style="line-height:1.5;">}</span>
</p>
<p>
	
</p>
<p>
	## This is a normal HTTP host which redirects all traffic to the HTTPS host.
</p>
<p>
	<span style="line-height:1.5;">server {</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; listen *:80;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ## Replace git.example.com with your FQDN.</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; server_name <span style="color:#E53333;">git.example.com</span>;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; server_tokens off;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ## This doesn't have to be a valid path since we are redirecting,</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ## you don't have to change it.</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; root /nowhere;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; rewrite ^ <a href="https://$server_name$request_uri" rel="nofollow">https://$server_name$request_uri</a> permanent;</span>
</p>
<p>
	<span style="line-height:1.5;">}</span>
</p>
<p>
	
</p>
<p>
	server {
</p>
<p>
	<span style="line-height:1.5;">&nbsp; listen 443 ssl;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ## Replace git.example.com with your FQDN.</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; server_name<span style="color:#E53333;"> git.example.com</span>;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; server_tokens off;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; root /home/git/gitlab/public;</span>
</p>
<p>
	
</p>
<p>
	&nbsp; ## Increase this if you want to upload large attachments
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ## Or if you want to accept large git objects over http</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; client_max_body_size 20m;</span>
</p>
<p>
	
</p>
<p>
	&nbsp; ## Strong SSL Security
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ## <a href="https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html" rel="nofollow">https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html</a></span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ssl on;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; <span style="color:#E53333;">ssl_certificate /usr/local/nginx/ssl/gitlab.crt;</span></span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">&nbsp; ssl_certificate_key /usr/local/nginx/ssl/gitlab.key;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ssl_protocols &nbsp;TLSv1 TLSv1.1 TLSv1.2;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ssl_session_cache &nbsp;builtin:1000 &nbsp;shared:SSL:10m;</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	&nbsp; #add_header Strict-Transport-Security max-age=63072000;
</p>
<p>
	&nbsp; #add_header X-Frame-Options DENY;
</p>
<p>
	<span style="line-height:1.5;">&nbsp; #add_header X-Content-Type-Options nosniff;</span>
</p>
<p>
	
</p>
<p>
	&nbsp; ## Individual nginx logs for this GitLab vhost
</p>
<p>
	<span style="line-height:1.5;">&nbsp; <span style="color:#E53333;">access_log &nbsp;/usr/local/nginx/logs/gitlab_access.log;</span></span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">&nbsp; error_log &nbsp; /usr/local/nginx/logs/gitlab_error.log;</span>
</p>
<p>
	
</p>
<p>
	&nbsp; location / {
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; ## Serve static files from defined root folder.</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; ## @gitlab is a named location for the upstream fallback, see below.</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; try_files $uri $uri/index.html $uri.html @gitlab;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; }</span>
</p>
<p>
	
</p>
<p>
	&nbsp; ## If a file, which is not found in the root folder is requested,
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ## then the proxy pass the request to the upsteam (gitlab unicorn).</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; location @gitlab {</span>
</p>
<p>
	
</p>
<p>
	&nbsp; &nbsp; ## If you use https make sure you disable gzip compression
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; ## to be safe against BREACH attack.</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; gzip off;</span>
</p>
<p>
	
</p>
<p>
	&nbsp; &nbsp; ## <a href="https://github.com/gitlabhq/gitlabhq/issues/694" rel="nofollow">https://github.com/gitlabhq/gitlabhq/issues/694</a>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; ## Some requests take more than 30 seconds.</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; proxy_read_timeout &nbsp; &nbsp; &nbsp;300;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; proxy_connect_timeout &nbsp; 300;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; proxy_redirect &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;off;</span>
</p>
<p>
	
</p>
<p>
	&nbsp; &nbsp; proxy_set_header &nbsp; Host &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$http_host;
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; proxy_set_header &nbsp; X-Real-IP &nbsp; &nbsp; &nbsp; &nbsp; $remote_addr;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; proxy_set_header &nbsp; X-Forwarded-Ssl &nbsp; on;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; proxy_set_header &nbsp; X-Forwarded-For &nbsp; $proxy_add_x_forwarded_for;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; proxy_set_header &nbsp; X-Forwarded-Proto $scheme;</span>
</p>
<p>
	
</p>
<p>
	&nbsp; &nbsp; proxy_pass <a href="http://127.0.0.1:8080" rel="nofollow">http://127.0.0.1:8080</a>;
</p>
<p>
	<span style="line-height:1.5;">&nbsp; }</span>
</p>
<p>
	
</p>
<p>
	&nbsp; ## Enable gzip compression as per rails guide:
</p>
<p>
	<span style="line-height:1.5;">&nbsp; ## <a href="http://guides.rubyonrails.org/asset_pipeline.html#gzip-compression" rel="nofollow">http://guides.rubyonrails.org/asset_pipeline.html#gzip-compression</a></span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; location ~ ^/(assets)/ {</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; root /home/git/gitlab/public;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; gzip_static on; # to serve pre-gzipped version</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; expires max;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; add_header Cache-Control public;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; }</span>
</p>
<p>
	
</p>
<p>
	&nbsp; error_page 502 /502.html;
</p>
<p>
	<span style="line-height:1.5;">}</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">2.将nginx加入git用户组<span style="color:#E53333;">(重要)</span></span>
</p>
<p>
	<span style="line-height:1.5;"># usermod -a -G git nginx</span>
</p>
<p>
	<span style="line-height:1.5;"># chmod g+rx /home/git/</span>
</p>
<p>
	
</p>
<p>
	3.生成ssl证书
</p>
<p>
	<span style="line-height:1.5;"># mkdir /usr/local/nginx/ssl</span>
</p>
<p>
	<span style="line-height:1.5;"># cd /usr/local/nginx/ssl</span>
</p>
<p>
	<span style="line-height:1.5;"># openssl req -new -x509 -nodes -days 3560 -out gitlab.crt -keyout gitlab.key</span>
</p>
<p>
	
</p>
<p>
	4.开启Git over SSL
</p>
<p>
	# vi&nbsp;/home/git/gitlab/config/gitlab.yml
</p>
<pre class="prettyprint lang-bsh">  ## GitLab settings
  gitlab:
    ## Web server settings
    host: git.example.com
    port: 443
    https: true</pre>
<p>
	# vi&nbsp;/home/git/gitlab-shell/config.yml
</p>
<pre class="prettyprint lang-bsh">gitlab_url: "https://git.example.com"
http_settings:
#  user: someone
#  password: somepass
#  ca_file: /etc/ssl/cert.pem
#  ca_path: /etc/ssl/
  self_signed_cert: true

ca_file: "/usr/local/nginx/ssl/gitlab.crt"</pre>
<p>
	<span style="line-height:1.5;">5.启动nginx</span>
</p>
<p>
	<span style="line-height:1.5;"># service nginx start</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	
</p>
<p>
	6.打开web页面 git.example.com
</p>
<p>
	nginx直接跳转URL为https://<span>git.example.com</span>
</p>
<p>
	<span style="color:#E53333;">注:视浏览器不同这里首先会提示证书不受信任,因为我们在此是自己给自己颁发的证书,所以非官方CA授权,有需要授权的朋友可以通过很多其他途径购买.</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140829-7@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140829-7@2x-1024x598.png" alt="QQ20140829-7@2x" width="1024" height="598" class="alignnone size-large wp-image-1286" /></a>
</p>
<p>
	<span style="line-height:1.5;">GitLab默认的账号密码如下:</span>
</p>
<p>
	<span style="line-height:1.5;"><a href="mailto:admin@local.host">admin@local.host</a>/5iveL!fe</span>
</p>
<p>
	
</p>
<p>
	Client端配置:
</p>
<p>
	
</p>
<p>
	<strong>六.上传git仓库</strong>
</p>
<p>
	<span style="line-height:1.5;">1.客户端生成秘钥</span>
</p>
<p>
	<span style="line-height:1.5;"># cd ~</span>
</p>
<p>
	<span style="line-height:1.5;"># ssh-keygen -t rsa</span>
</p>
<p>
	<span style="line-height:1.5;">一路回车后生成公钥和秘钥对</span><span style="line-height:1.5;"></span>
</p>
<p>
	<span style="line-height:1.5;">$ cat ~/.ssh/id_rsa.pub&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">—————————————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">将这里生成的秘钥全部复制并粘贴到gitlab web SSH Keys后台保存即可</span>
</p>
<p>
	<span style="line-height:1.5;">—————————————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">上传后如图:</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140829-9@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140829-9@2x-1024x291.png" alt="QQ20140829-9@2x" width="1024" height="291" class="alignnone size-large wp-image-1288" /></a>
</p>
<p>
	<span style="line-height:1.5;">2.测试SSH连接</span>
</p>
<p>
	<span style="line-height:1.5;"># ssh -p22 <a href="mailto:git@git.example.com">git@git.example.com</a></span>
</p>
<p>
	<span style="line-height:1.5;">若报如下错误:</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">PTY allocation request failed on channel 1</span>
</p>
<p>
	<span style="line-height:1.5;">/usr/bin/env: ruby: No such file or directory</span>
</p>
<p>
	<span style="line-height:1.5;">Connection to git.example.com closed.</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">说明服务端ruby环境变量未在此目录/usr/bin/ruby</span>
</p>
<p>
	<span style="line-height:1.5;">在服务器端加此软链即可:</span>
</p>
<p>
	<span style="line-height:1.5;"># ln -s /usr/local/ruby/bin/ruby /usr/bin/ruby</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注:若服务器端SSH自定义端口,则需要在客户端~/.ssh/config下添加端口配置</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">假定自定义SSH端口为2222</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;"># echo “Port 2222” &gt;&gt; ~/.ssh/config</span>
</p>
<p>
	
</p>
<p>
	3.重新连接
</p>
<p>
	<span style="line-height:1.5;"># ssh -p22 <a href="mailto:git@git.example.com">git@git.example.com</a></span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">PTY allocation request failed on channel 1</span>
</p>
<p>
	<span style="line-height:1.5;">Welcome to GitLab, Anonymous!</span>
</p>
<p>
	<span style="line-height:1.5;">Connection to git.example.com closed.</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">4.命令行上传git仓库</span>
</p>
<p>
	<span style="line-height:1.5;"># su -&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;"># mkdir testprojiect</span>
</p>
<p>
	# cd testprojiect/
</p>
<p>
	<span style="line-height:1.5;"># git init</span>
</p>
<p>
	<span style="line-height:1.5;"># echo "What a fucking Hello World" &gt; readme.txt</span>
</p>
<p>
	<span style="line-height:1.5;"># git add .</span>
</p>
<p>
	<span style="line-height:1.5;"># git commit -m 'first commit'</span>
</p>
<p>
	<span style="line-height:1.5;"># git remote add origin <a href="mailto:git@git.example.com">git@git.example.com</a>:root/testproject.git</span>
</p>
<p>
	<span style="line-height:1.5;"># git push -u origin master</span>
</p>
<p>
	<span style="line-height:1.5;">————————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">Counting objects: 3, done.</span>
</p>
<p>
	<span style="line-height:1.5;">Writing objects: 100% (3/3), 238 bytes | 0 bytes/s, done.</span>
</p>
<p>
	<span style="line-height:1.5;">Total 3 (delta 0), reused 0 (delta 0)</span>
</p>
<p>
	<span style="line-height:1.5;">To <a href="mailto:git@git.example.com">git@git.example.com</a>:root/testproject.git</span>
</p>
<p>
	<span style="line-height:1.5;">* [new branch] &nbsp; &nbsp; &nbsp;master -&gt; master</span>
</p>
<p>
	<span style="line-height:1.5;">Branch master set up to track remote branch master from origin.</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">————————————————————————————————————————————</span>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140829-8@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140829-8@2x-1024x329.png" alt="QQ20140829-8@2x" width="1024" height="329" class="alignnone size-large wp-image-1287" /></a>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">大功告成...</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注: 若主页CSS出现错误未加载, 可从新编译assets, 可从新获取CSS文件.</span>
</p>
<p>
	<span style="line-height:1.5;"><span style="color:#E53333;"># cd /</span><span style="color:#E53333;">home/git/gitlab</span></span>
</p>
<p>
	<span style="color:#E53333;">#&nbsp;bundle exec rake assets:precompile RAILS_ENV=production</span>
</p>
<p>
	<span style="color:#E53333;"><br />
</span>
</p>
<p>
	<span><span style="color:#E53333;">注: 解决</span><span style="color:#E53333;">Gravatar的头像加载timeout问题</span></span>
</p>
<p>
	<span></span>
</p>
<p>
	<span><span><span style="color:#E53333;">搜索plain_url部分, 将原有部分改成:</span><br />
<span style="color:#E53333;">plain_url: "http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&amp;d=identicon"</span></span></span>
</p>
<p>
	<span style="line-height:1.5;"><span style="color:#E53333;">#cd&nbsp;</span><span style="color:#E53333;">/home/git/gitlab</span><span style="color:#E53333;"></span></span>
</p>
<p>
	<span><span style="color:#E53333;">清除缓存</span></span>
</p>
<p>
	<span style="line-height:1.5;"><span style="color:#E53333;">#&nbsp;</span><span style="color:#E53333;">RAILS_ENV=production bundle exec rake cache:clear</span><span style="color:#E53333;"></span></span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;"># service gitlab restart</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注: 解决内存耗尽问题</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">如果你的VPS 为1G内存+1核处理器</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">建议将默认的unicorn worker_process设置为2, timeout设定为60s, 这样就不会因为长时间加载web页面而出现timeout等问题.</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">#&nbsp;vi /home/git/gitlab/config/unicorn.rb</span>
</p>
<pre class="prettyprint lang-bsh">...
worker_processes 2
timeout 60
...</pre>
<p>
	官方推荐配置详见:&nbsp;<a href="https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/requirements.md" target="_blank">https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/requirements.md</a>
</p>
<p>
	
</p>
<p>
	
</p>
<p>
	本文的Gitlab为6.3版本, 如果大家有升级到7.14或者8.0版本的需要的话, 可以参考官方的升级文档
</p>
<p><a href="https://github.com/gitlabhq/gitlabhq/blob/master/doc/update/6.x-or-7.x-to-7.14.md" rel="nofollow">https://github.com/gitlabhq/gitlabhq/blob/master/doc/update/6.x-or-7.x-to-7.14.md</a></p>
<p><a href="https://github.com/gitlabhq/gitlabhq/blob/master/doc/update/7.14-to-8.0.md" rel="nofollow">https://github.com/gitlabhq/gitlabhq/blob/master/doc/update/7.14-to-8.0.md</a></p>
<p></p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1285">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="CentOS6.3下GitLab+Nginx(SSL)+MySQL+Ruby安装部署" href="http://www.showerlee.com/archives/1285">http://www.showerlee.com/archives/1285</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1285/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CentOS6.3下Gitosis安装部署</title>
		<link>http://www.showerlee.com/archives/1240</link>
		<comments>http://www.showerlee.com/archives/1240#comments</comments>
		<pubDate>Mon, 11 Aug 2014 11:04:23 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Git]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1240</guid>
		<description><![CDATA[&#160; Git作为一个分布式的版本控制系统，使用git的时候，一般和服务器通讯使用的是ssh协议，用ss [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	<span style="line-height:1.5;">&nbsp; <a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>作为一个分布式的版本控制系统<span>，</span>使用git的时候，一般和服务器通讯使用的是ssh协议，用ssh的主要优点是速度快（传输前数据会先压缩，比HTTP快），安全，方便读写。&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; 客户端通过ssh访问服务器端的验证方式一般有两种，一种是用户名密码的方式，一种是使用公私钥认证的方式. 使用公私钥的方式比较方便，无需每次登录输入密码。&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; 某个受信任的客户端的公钥会被设置在服务器端的 ~/.ssh/authorized_keys文件中，有关此文件的格式可以参见 sshd的用户手册 man sshd . authorized_keys有个比较厉害的功能是 支持 command参数，使得每次用户使用此公钥进行验证的时候执行此后面的命令.这样就可以做一些逻辑处理了.&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; 一般git库的管理需要权限控制，如何方便简单的进行库的权限管理呢？ authorized_keys是一个思路，指定特定command参数，每次验证好用户后首先执行相关逻辑，检测当前用户是否具有某个权限。 所以便有了gitosis，与其说gitosis是一个git权限管理系统，还不如说它是一个authorized_keys文件管理器.</p>
<p></span>
</p>
<p>
	<span style="line-height:1.5;"></span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">解决方案：</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;"><strong>一.环境部署</strong></span>
</p>
<p>
	<span style="line-height:1.5;">操作系统： &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;centos6.3 x64</span>
</p>
<p>
	<span style="line-height:1.5;"><a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; git-1.7.1</span>
</p>
<p>
	<span style="line-height:1.5;"><a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>osis: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>osis</span>
</p>
<p>
	<span style="line-height:1.5;"><a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>web: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;1.7.1-3 &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">OpenSSH Server: &nbsp; &nbsp; openssh-server-5.3p1</span>
</p>
<p>
	<span style="line-height:1.5;">apache: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;httpd-2.4.4</span>
</p>
<p>
	<span style="line-height:1.5;">python-setuptools: &nbsp; python-setuptools-0.6.10-3</span>
</p>
<p>
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
</p>
<p>
	<a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a> server(centos6.3 x64): node2.example.com
</p>
<p>
	<span style="line-height:1.5;"><a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a> client(centos6.3 x64): node1.example.com</span>
</p>
<p>
	
</p>
<p>
	server端配置:
</p>
<p>
	<span style="line-height:1.5;">一.关闭iptables和SELINUX</span>
</p>
<p>
	<span style="line-height:1.5;"># service iptables stop</span>
</p>
<p>
	<span style="line-height:1.5;"># setenforce 0</span>
</p>
<p>
	<span style="line-height:1.5;"># vi /etc/sysconfig/selinux</span>
</p>
<p>
	<span style="line-height:1.5;">---------------</span>
</p>
<p>
	<span style="line-height:1.5;">SELINUX=disabled</span>
</p>
<p>
	<span style="line-height:1.5;">---------------</span>
</p>
<p>
	
</p>
<p>
	<strong>二.同步时间</strong>
</p>
<p>
	<span style="line-height:1.5;"># ntpdate cn.pool.ntp.org</span>
</p>
<p>
	
</p>
<p>
	<strong>三.安装apache</strong>
</p>
<p>
	<span style="line-height:1.5;">传送门：<a href="http://www.showerlee.com/archives/6" target="_blank">http://www.showerlee.com/archives/6</a></span>
</p>
<p>
	
</p>
<p>
	<strong>四.安装OpenSSH</strong>
</p>
<p>
	<span style="line-height:1.5;">1.yum安装OpenSSH:</span>
</p>
<p>
	<span style="line-height:1.5;"># yum install openssh-server -y</span>
</p>
<p>
	
</p>
<p>
	2.修改ssh服务端配置:
</p>
<p>
	<span style="line-height:1.5;"># vi /etc/ssh/sshd_config</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp;Port 22 # 修改成你想要的登陆端口</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp;PermitRootLogin no # 禁止root用户登陆</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp;StrictModes yes # 检查密钥的用户和权限是否正确，默认打开的</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp;RSAAuthentication yes # 启用 RSA 认证</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp;PubkeyAuthentication yes # 启用公钥认证</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp;PasswordAuthentication yes # 启用密码认证，默认是打开的</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp;ServerKeyBits 1024 # 修改后变为此状态，将ServerKey强度改为1024比特</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; PermitEmptyPasswords no # 修改后变为此状态，禁止空密码进行登录</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————</span>
</p>
<p>
	
</p>
<p>
	3.重启服务：
</p>
<p>
	<span style="line-height:1.5;"># /etc/init.d/sshd restart</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;"><strong>五.安装<a href="http://www.showerlee.com/archives/tag/git" title="查看Git中的全部文章" class="tag_link">Git</a>&nbsp;</strong></span>
</p>
<p>
	<span style="line-height:1.5;"># yum install git-core -y</span>
</p>
<p>
	&nbsp;
</p>
<p>
	<strong>六.安装Gitosis</strong>
</p>
<p>
	<span style="line-height:1.5;">1.安装Gitosis依赖python-setuptools包</span>
</p>
<p>
	<span style="line-height:1.5;"># yum install python-setuptools -y</span>
</p>
<p>
	
</p>
<p>
	2.安装Gitosis
</p>
<p>
	<span style="line-height:1.5;"># cd ~</span>
</p>
<p>
	<span style="line-height:1.5;"># mkdir src</span>
</p>
<p>
	<span style="line-height:1.5;"># cd src&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;"># git clone <a href="https://github.com/tv42/gitosis.git" rel="nofollow">https://github.com/tv42/gitosis.git</a></span>
</p>
<p>
	<span style="line-height:1.5;"># cd gitosis</span>
</p>
<p>
	<span style="line-height:1.5;"># python setup.py install</span>
</p>
<p>
	&nbsp;
</p>
<p>
	3.为gitosis创建系统用户&nbsp;
</p>
<p>
	<span style="line-height:1.5;"># useradd -m git</span>
</p>
<p>
	<span style="line-height:1.5;"># passwd git</span>
</p>
<p>
	&nbsp;
</p>
<p>
	4. 运行gitosis
</p>
<p>
	<span style="line-height:1.5;">(1).将管理员生成的公钥上传或拷贝到服务器上。这里的公钥需要在git服务器管理员下使用ssh-keygen命令来创建</span>
</p>
<p>
	<span style="line-height:1.5;"># su - git</span>
</p>
<p>
	保证web页面有权限显示该仓库内容
</p>
<p>
	<span style="line-height:1.5;">#&nbsp;chmod -R 755 /home/git</span>
</p>
<p>
	<span style="line-height:1.5;"># ssh-keygen -t rsa</span>
</p>
<p>
	<span style="line-height:1.5;"># cp ~/.ssh/id_rsa.pub /tmp</span>
</p>
<p>
	
</p>
<p>
	(2).初始化gitosis
</p>
<p>
	<span style="line-height:1.5;">进入到拷贝过来的id_rsa.pub所在目录</span>
</p>
<p>
	<span style="line-height:1.5;"># cd /tmp</span>
</p>
<p>
	<span style="line-height:1.5;"># gitosis-init &lt; id_rsa.pub</span>
</p>
<p>
	<span style="line-height:1.5;">此时，会在/home/git目录下生成<span>gitosis</span>仓库和配置目录</span>
</p>
<p>
	<span style="line-height:1.5;"># cd /home/git</span>
</p>
<p>
	<span style="line-height:1.5;"># ll</span>
</p>
<p>
	<span style="line-height:1.5;">------------------------</span><span style="line-height:1.5;">------------------------</span><span style="line-height:1.5;">----------------</span>
</p>
<p>
	<span style="line-height:1.5;">drwxr-xr-x 2 git git 4096 Aug 12 13:39 gitosis</span>
</p>
<p>
	<span style="line-height:1.5;">drwxr-xr-x 4 git git 4096 Aug 12 13:39 repositories</span>
</p>
<p>
	<span style="line-height:1.5;">------------------------</span><span style="line-height:1.5;">------------------------</span><span style="line-height:1.5;">---------------</span>
</p>
<p>
	
</p>
<p>
	(3).切换回当前(root)用户
</p>
<p>
	<span style="line-height:1.5;"># exit</span>
</p>
<p>
	
</p>
<p>
	(4).配置权限
</p>
<p>
	<span style="line-height:1.5;">如果想要别人能够clone gitosis-admin.git，需要执行以下操作：</span>
</p>
<p>
	<span style="line-height:1.5;"># chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update</span>
</p>
<p>
	<span style="line-height:1.5;">至此，gitosis的安装工作已完成，其相关配置可以有管理员来操作，然后再提交到服务器上.</span>
</p>
<p>
	
</p>
<p>
	(5)现在可以试一下用初始化 Gitosis 的公钥的拥有者身份 SSH 登录服务器，应该会看到类似下面这样：
</p>
<p>
	<span style="line-height:1.5;"># su - git</span>
</p>
<p>
	<span style="line-height:1.5;">$ ssh git@127.0.0.1</span>
</p>
<p>
	<span style="line-height:1.5;">------------------------------------------------</span>
</p>
<p>
	<span style="line-height:1.5;">PTY allocation request failed on channel 0</span>
</p>
<p>
	<span style="line-height:1.5;">ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; Connection to gitserver closed.</span>
</p>
<p>
	<span style="line-height:1.5;">------------------------------------------------</span><span style="line-height:1.5;"></span>
</p>
<p>
	<span style="line-height:1.5;">说明 Gitosis 认出了该用户的身份，但由于没有运行任何 Git 命令，所以它切断了连接。那么，现在运行一个实际的 Git 命令 — 克隆 Gitosis 的控制仓库：</span>
</p>
<p>
	
</p>
<p>
	在你本地计算机上克隆git仓库
</p>
<p>
	<span style="line-height:1.5;"># cd /tmp</span>
</p>
<p>
	<span style="line-height:1.5;"># git clone git@gitserver:gitosis-admin.git</span>
</p>
<p>
	<span style="line-height:1.5;">这会得到一个名为 gitosis-admin 的工作目录，主要由两部分组成：</span>
</p>
<p>
	红色为git仓库配置,蓝色为实际仓库保存的文件
</p>
<p>
	<span style="line-height:1.5;"># cd gitosis-admin</span>
</p>
<p>
	<span style="line-height:1.5;"># ll -a</span>
</p>
<p>
	<span style="line-height:1.5;">----------------------------------------------------------</span>
</p>
<p>
	<span style="line-height:1.5;">total 20</span>
</p>
<p>
	<span style="line-height:1.5;">drwxr-xr-x 4 git git 4096 Aug 12 13:21 .</span>
</p>
<p>
	<span style="line-height:1.5;">drwxr-xr-x 4 git git 4096 Aug 12 13:23 ..</span>
</p>
<p>
	<span style="line-height:1.5;"><span style="color:#E53333;">drwxr-xr-x 8 git git 4096 Aug 12 13:22 .git</span></span>
</p>
<p>
	<span style="line-height:1.5;"><span style="color:#337FE5;">-rwxr-xr-x 1 git git &nbsp;157 Aug 12 13:21 gitosis.conf</span></span>
</p>
<p>
	<span style="line-height:1.5;"><span style="color:#337FE5;">drwxr-xr-x 2 git git 4096 Aug 12 13:20 keydir</span></span>
</p>
<p>
	<span style="line-height:1.5;">-----------------------------------------------------------</span>
</p>
<p>
	以上操作相当于,系统git用户初始化并成为<span>gitosis</span>管理员,且利用其管理员权限将<span>gitosis-admin仓库</span>clone到本地.
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">5.添加本地用户john和仓库test到gitosis,并和管理员git合作管理gitosis</span>
</p>
<p>
	<span style="line-height:1.5;">1. 用户john添加并发送id_rsa.pub给git</span>
</p>
<p>
	<span style="line-height:1.5;"># su -</span>
</p>
<p>
	<span style="line-height:1.5;"># useradd john &amp; passwd john</span>
</p>
<p>
	<span style="line-height:1.5;"># su - john</span>
</p>
<p>
	<span style="line-height:1.5;">#</span><span style="line-height:1.5;"> ssh-keygen -t rsa</span>
</p>
<p>
	<span style="line-height:1.5;">-----------------------------------------------------------</span>
</p>
<p>
	<span style="line-height:1.5;">Generating public/private rsa key pair.</span>
</p>
<p>
	<span style="line-height:1.5;">Enter file in which to save the key (/home/john/.ssh/id_rsa):&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">Created directory '/home/john/.ssh'.</span>
</p>
<p>
	<span style="line-height:1.5;">Enter passphrase (empty for no passphrase):&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">Enter same passphrase again:&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">Your identification has been saved in /home/john/.ssh/id_rsa.</span>
</p>
<p>
	<span style="line-height:1.5;">Your public key has been saved in /home/john/.ssh/id_rsa.pub.</span>
</p>
<p>
	<span style="line-height:1.5;">-----------------------------------------------------------</span>
</p>
<p>
	<span style="line-height:1.5;">#</span><span style="line-height:1.5;"> cp /home/john/.ssh/id_rsa.pub /tmp</span>
</p>
<p>
	
</p>
<p>
	2. gitosis管理员git分配john权限
</p>
<p>
	# su - git
</p>
<p>
	# mkdir projects
</p>
<p>
	# cd ~/projects
</p>
<p>
	# git clone <a href="mailto:git@node2.example.com">git@node2.example.com</a>:gitosis-admin
</p>
<p>
	# cd gitosis-admin
</p>
<p>
	# cat gitosis.conf
</p>
<p>
	------------------------------------------------
</p>
<p>
	[gitosis]
</p>
<p>
	[group gitosis-admin]
</p>
<p>
	writable = gitosis-admin
</p>
<p>
	members = <a href="mailto:git@node2.example.com">git@node2.example.com</a>
</p>
<p>
	------------------------------------------------
</p>
<p>
	# ls keydir/
</p>
<p>
	-------------------------
</p>
<p>
	<a href="mailto:git@node2.example.com.pub">git@node2.example.com.pub</a>
</p>
<p>
	-------------------------
</p>
<p>
	# cp /tmp/id_rsa.pub keydir/john.pub
</p>
<p>
	# vi gitosis.conf
</p>
<p>
	————————————————————————————————————
</p>
<p>
	[gitosis]
</p>
<p>
	[group gitosis-admin]
</p>
<p>
	writable = gitosis-admin
</p>
<p>
	members = <a href="mailto:git@node2.example.com">git@node2.example.com</a>
</p>
<p>
	[group test]
</p>
<p>
	writable = test
</p>
<p>
	members = <a href="mailto:git@node2.example.com">git@node2.example.com</a> john
</p>
<p>
	————————————————————————————————————
</p>
<p>
	# git add .
</p>
<p>
	# git commit -am "add member john and project foo"
</p>
<p>
	# git push
</p>
<p>
	3. 用户git添加项目test
</p>
<p>
	# su - git
</p>
<p>
	# cd ~/projects
</p>
<p>
	# mkdir test
</p>
<p>
	# cd test
</p>
<p>
	# git init
</p>
<p>
	# echo "Hello World." &gt; hello.txt
</p>
<p>
	# git add hello.txt
</p>
<p>
	# git commit -am 'first commit'
</p>
<p>
	# git remote add origin <a href="mailto:git@node2.example.com">git@node2.example.com</a>:test.git
</p>
<p>
	# git push origin master
</p>
<p>
	4. 用户 john clone test并修改hello.txt
</p>
<p>
	# su - john
</p>
<p>
	# git clone <a href="mailto:git@node2.example.com">git@node2.example.com</a>:test.git
</p>
<p>
	# cd test
</p>
<p>
	# date &gt;&gt; hello.txt
</p>
<p>
	# git commit -am 'add time to hello.txt' &amp;&amp; git push
</p>
<p>
	整个过程分为:
</p>
<p>
	1.通过修改gitosis-admin管理gitosis用户权限,需要clone到本地,然后修改配置文件,最后add push将结果推送到远程实现权限修改.
</p>
<p>
	2.添加系统用户,生成该用户公钥,并将其复制到keydir下,实现该用户有权限进行git等相关操作.
</p>
<p>
	3.登陆该用户账户进行git相关操作,修改完后commit，push到中服务器即可完成仓库权限配置.
</p>
<p>
	
</p>
<p>
	
</p>
<p>
	<strong>七.安装gitweb</strong>
</p>
<p>
	<span style="line-height:1.5;">1.首先我们需要Git的源码，其中带有GitWeb，并能生成定制的CGI脚本：</span>
</p>
<p>
	<span style="line-height:1.5;"># git clone git://git.kernel.org/pub/scm/git/git.git</span>
</p>
<p>
	<span style="line-height:1.5;"># cd git/</span>
</p>
<p>
	<span style="line-height:1.5;"># make GITWEB_PROJECTROOT="/home/git/repositories" prefix=/usr gitweb &nbsp; &nbsp; &nbsp;&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;"># cp -rf gitweb /usr/local/apache2/htdocs/</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注: 通过指定 GITWEB_PROJECTROOT 变量告诉编译命令 Git 仓库的位置</span>
</p>
<p>
	
</p>
<p>
	2.设置Apache以CGI方式运行该脚本，并添加一个VirtualHost配置：
</p>
<p>
	<span style="line-height:1.5;">(1).加载apache的vhost配置文件</span>
</p>
<p>
	<span style="line-height:1.5;"># vi /usr/local/apache2/conf/httpd.conf&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">搜索包含httpd-vhosts的行,并去掉该行注释.</span>
</p>
<p>
	
</p>
<p>
	(2).加载cgid模块,使其支持perl语言.
</p>
<p>
	<span style="line-height:1.5;"># vi /usr/local/apache2/conf/httpd.conf&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">搜索包含mod_cgid.so的行,并去掉该行注释.</span>
</p>
<p>
	
</p>
<p>
	(3).配置VirtualHost
</p>
<p>
	<span style="line-height:1.5;"># vi /usr/local/apache2/conf/extra/httpd-vhosts.conf&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">添加如下配置:</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">&lt;VirtualHost *:80&gt;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; ServerName git.example.com</span>
</p>
<p>
	&nbsp; &nbsp; DocumentRoot /usr/local/apache2/htdocs/gitweb
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; &lt;Directory /usr/local/apache2/htdocs/gitweb&gt;</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; &nbsp; &nbsp; Options +ExecCGI</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; &nbsp; &nbsp; AllowOverride All</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; &nbsp; &nbsp; order allow,deny</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; &nbsp; &nbsp; Allow from all</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; &nbsp; &nbsp; AddHandler cgi-script cgi pl</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; &nbsp; &nbsp; DirectoryIndex gitweb.cgi</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; &nbsp; &lt;/Directory&gt;</span>
</p>
<p>
	<span style="line-height:1.5;">&lt;/VirtualHost&gt;</span>
</p>
<p>
	<span style="line-height:1.5;">——————————————————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">(4).安装Time/HiRes.pm perl模块</span>
</p>
<p>
	<span style="line-height:1.5;">首次打开web页面报Can't locate Time/HiRes.pm in @INC ….错误</span>
</p>
<p>
	<span style="line-height:1.5;">解决方法:</span>
</p>
<p>
	<span style="line-height:1.5;"># yum install perl-devel perl-CPAN -y</span>
</p>
<p>
	<span style="line-height:1.5;"># perl -MCPAN -e shell&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">cpan[2]&gt; install Time::HiRes&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;">cpan[3]&gt; exit&nbsp;</span>
</p>
<p>
	
</p>
<p>
	(5).重启apache服务
</p>
<p>
	<span style="line-height:1.5;"># /usr/local/apache2/bin/apachectl restart</span>
</p>
<p>
	
</p>
<p>
	(6).修改本机HOST,并打开gitweb页面
</p>
<p><a href="http://git.example.com" rel="nofollow">http://git.example.com</a></p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140812-1@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140812-1@2x-1024x174.png" alt="QQ20140812-1@2x" width="1024" height="174" class="alignnone size-large wp-image-1247" /></a> <a href="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140812-2@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140812-2@2x-1024x255.png" alt="QQ20140812-2@2x" width="1024" height="255" class="alignnone size-large wp-image-1248" /></a> <a href="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140812-3@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140812-3@2x-1024x190.png" alt="QQ20140812-3@2x" width="1024" height="190" class="alignnone size-large wp-image-1249" /></a>
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140812-5@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140812-5@2x-1024x184.png" alt="QQ20140812-5@2x" width="1024" height="184" class="alignnone size-large wp-image-1251" /></a>
</p>
<p>
	
</p>
<p>
	大功告成....</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1240">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="CentOS6.3下Gitosis安装部署" href="http://www.showerlee.com/archives/1240">http://www.showerlee.com/archives/1240</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1240/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVN到Git迁移笔记</title>
		<link>http://www.showerlee.com/archives/1227</link>
		<comments>http://www.showerlee.com/archives/1227#comments</comments>
		<pubDate>Fri, 08 Aug 2014 10:11:08 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[Svn]]></category>
		<category><![CDATA[APACHE]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1227</guid>
		<description><![CDATA[本篇博文目的是将本地SVN服务器的project迁移为GIT格式,并上传到目前大家常用的github托管服务器 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	本篇博文目的是将本地SVN服务器的project迁移为GIT格式,并上传到目前大家常用的github托管服务器.
</p>
<p>
	
</p>
<p>
	<span style="line-height:1.5;">解决方案：</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">一.环境部署</span>
</p>
<p>
	<span style="line-height:1.5;">操作系统： &nbsp; &nbsp; &nbsp; &nbsp;centos6.3 x64</span>
</p>
<p>
	<span style="line-height:1.5;">SVN: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; subversion-1.8.0</span>
</p>
<p>
	<span style="line-height:1.5;">apache: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;httpd-2.4.4</span>
</p>
<p>
	
</p>
<p>
	svn server(centos6.3 x64): node2.example.com
</p>
<p>
	<span style="line-height:1.5;">svn client(centos6.3 x64): node1.example.com</span>
</p>
<p>
	<span style="line-height:1.5;">git server: <a href="https://github.com/leonIi/" rel="nofollow">https://github.com/leonIi/</a></span>
</p>
<p>
	
</p>
<p>
	一.关闭iptables和SELINUX
</p>
<p>
	<span style="line-height:1.5;"># service iptables stop</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注：如需开启防火墙,则添加如下一条规则打开svn 3690端口</span>
</p>
<p>
	<span style="line-height:1.5;"># iptables -A INPUT -p tcp &nbsp;--dport 3690 -j ACCEPT</span>
</p>
<p>
	<span style="line-height:1.5;"># setenforce 0</span>
</p>
<p>
	<span style="line-height:1.5;"># vi /etc/sysconfig/selinux</span>
</p>
<p>
	<span style="line-height:1.5;">---------------</span>
</p>
<p>
	<span style="line-height:1.5;">SELINUX=disabled</span>
</p>
<p>
	<span style="line-height:1.5;">---------------</span>
</p>
<p>
	
</p>
<p>
	二.同步时间
</p>
<p>
	<span style="line-height:1.5;"># ntpdate cn.pool.ntp.org</span>
</p>
<p>
	
</p>
<p>
	三.安装apache
</p>
<p>
	<span style="line-height:1.5;">传送门：<a href="http://www.showerlee.com/archives/6" target="_blank">http://www.showerlee.com/archives/6</a></span>
</p>
<p>
	
</p>
<p>
	四.关闭系统自带svnserve
</p>
<p>
	<span style="line-height:1.5;"># service svnserve stop</span>
</p>
<p>
	<span style="line-height:1.5;"># chkconfig svnserve off</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注：本文档为了与apache2.4.4配合不发生兼容问题，所以使用了最新编译版本的svn,这里关闭是为了保证与rpm的版本不冲突.</span>
</p>
<p>
	
</p>
<p>
	五.安装svn server
</p>
<p>
	<span style="line-height:1.5;">传送门：<a href="http://www.showerlee.com/archives/350" target="_blank">http://www.showerlee.com/archives/350</a></span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注:安装完毕后:</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">svn根目录: /data/svn_repo</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">http访问URL: <a href="http://node2.example.com/svn/&#039;具体仓库" rel="nofollow">http://node2.example.com/svn/&#039;具体仓库</a>'</span>
</p>
<p>
	
</p>
<p>
	六.SVN到GIT迁移
</p>
<p>
	
</p>
<p>
	1.首先在github上面创建一个repository(略)
</p>
<p>
	
</p>
<p>
	2.创建一个SVN仓库(svn server)
</p>
<p>
	
</p>
<p>
	# cd /data/svn_repo/
</p>
<p>
	<span style="line-height:1.5;"># svnadmin create project01</span>
</p>
<p>
	<span style="line-height:1.5;">重启svn与apache</span>
</p>
<p>
	<span style="line-height:1.5;"># killall svnserve</span>
</p>
<p>
	<span style="line-height:1.5;"># /usr/local/svn/bin/svnserve -d -r /data/svn_repo/</span>
</p>
<p>
	<span style="line-height:1.5;"># /usr/local/apache2/bin/apachectl restart</span>
</p>
<p>
	
</p>
<p>
	3.SVN checkin and checkout(svn client)
</p>
<p>
	<span style="line-height:1.5;">1).客户端安装svn(若安装可略过)</span>
</p>
<p>
	<span style="line-height:1.5;"># yum install svn -y</span>
</p>
<p>
	
</p>
<p>
	2). svn checkout
</p>
<p>
	<span style="line-height:1.5;"># cd ~</span>
</p>
<p>
	<span style="line-height:1.5;"># mkdir svn_client_repo</span>
</p>
<p>
	<span style="line-height:1.5;"># cd svn_client_repo</span>
</p>
<p>
	<span style="line-height:1.5;"># svn co <a href="http://node2.example.com/svn/project01" rel="nofollow">http://node2.example.com/svn/project01</a></span>
</p>
<p>
	
</p>
<p>
	3). svn status
</p>
<p>
	<span style="line-height:1.5;"># svn status project01</span>
</p>
<p>
	<span style="line-height:1.5;"># cd project01</span>
</p>
<p>
	<span style="line-height:1.5;"># touch test01 test02 test03</span>
</p>
<p>
	
</p>
<p>
	4). svn add (添加)
</p>
<p>
	<span style="line-height:1.5;"># svn add test01</span>
</p>
<p>
	<span style="line-height:1.5;"># svn add test02</span>
</p>
<p>
	<span style="line-height:1.5;"># svn add test03</span>
</p>
<p>
	
</p>
<p>
	5). svn checkin(提交)
</p>
<p>
	
</p>
<p>
	# svn ci -m”project01”
</p>
<p>
	
</p>
<p>
	6). svn log (查看文件日志注释)
</p>
<p>
	<span style="line-height:1.5;"># svn log 1</span>
</p>
<p>
	
</p>
<p>
	常见错误提示:
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">Commit failed (details follow):</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">Error normalizing log message to internal format</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">Can't convert string from native encoding to 'UTF-8':</span>
</p>
<p>
	解决方法:
</p>
<p>
	<span style="line-height:1.5;"># vi ~/.subversion/config</span>
</p>
<p>
	<span style="line-height:1.5;">修改:log-encoding = UTF-8</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">svn: Can't open file '/data/svn_repo/project01/db/txn-current-lock': Permission denied</span>
</p>
<p>
	<span style="line-height:1.5;">解决方法:</span>
</p>
<p>
	<span style="line-height:1.5;">将server端 /data/svn_repo/project01目录属主修改为apache用户,默认为daemon</span>
</p>
<p>
	# chown -R daemon.daemon /data/svn_repo/project01
</p>
<p>
	
</p>
<p>
	2.使用git迁移(svn client)
</p>
<p>
	<span style="line-height:1.5;">1).客户端安装git(若安装可略过)</span>
</p>
<p>
	<span style="line-height:1.5;"># yum install git* git-svn -y</span>
</p>
<p>
	<span style="line-height:1.5;"># cd ~</span>
</p>
<p>
	<span style="line-height:1.5;"># mkdir git_client_repo</span>
</p>
<p>
	<span style="line-height:1.5;"># cd <span>git_client_repo</span></span>
</p>
<p>
	建立SVN用户到git用户的映射文件
</p>
<p>
	<span style="line-height:1.5;"># echo "(no author) = test &lt;test@123.com&gt;" &gt;&nbsp;userinfo.txt&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;"># git svn init <a href="http://node2.example.com/svn/project01&nbsp;project01" rel="nofollow">http://node2.example.com/svn/project01&nbsp;project01</a></span>
</p>
<p>
	<span style="line-height:1.5;"># cd project01</span>
</p>
<p>
	<span style="line-height:1.5;">将svn用户映射到git上.</span>
</p>
<p>
	<span style="line-height:1.5;"># git svn fetch&nbsp;<span>--authors-file=../userinfo.txt</span></span>
</p>
<p>
	# git log
</p>
<p>
	-------------------------------------------------------------------------------------------------------------------------
</p>
<p>
	<span style="line-height:1.5;">commit edc2cdd658f8844ad4a883d083b84ef5dad2320c</span>
</p>
<p>
	<span style="line-height:1.5;">Author: </span><span style="line-height:1.5;color:#E53333;">test &lt;test@123.com&gt;</span>
</p>
<p>
	<span style="line-height:1.5;">Date: &nbsp; Mon Aug 11 05:50:09 2014 +0000</span>
</p>
<p>
	
</p>
<p>
	&nbsp; &nbsp; project01<br />
&nbsp; &nbsp;&nbsp;
</p>
<p>
	&nbsp; &nbsp; git-svn-id: <a href="http://node2.example.com/svn/project01@2" rel="nofollow">http://node2.example.com/svn/project01@2</a> 595a6c50-5861-48b1-ab0a-b1b54e0fc7cc
</p>
<p>
	commit 9bde3c02fbfa6f22088b442a519cfd3870433ebc
</p>
<p>
	Author: <span style="color:#E53333;">test &lt;test@123.com&gt;</span>
</p>
<p>
	Date: &nbsp; Fri Aug 8 07:55:54 2014 +0000
</p>
<p>
	&nbsp; &nbsp; &lt;E2&gt;&lt;80&gt;&lt;9D&gt;project01&lt;E2&gt;&lt;80&gt;&lt;9D&gt;<br />
&nbsp; &nbsp;&nbsp;
</p>
<p>
	&nbsp; &nbsp; git-svn-id: <a href="http://node2.example.com/svn/project01@1" rel="nofollow">http://node2.example.com/svn/project01@1</a> 595a6c50-5861-48b1-ab0a-b1b54e0fc7cc
</p>
<p>
	<span style="line-height:1.5;">-----------------------------------------------------------------------------------------------------------------------</span>
</p>
<p>
	当然上面的两步，可以作一步处理
</p>
<p>
	#&nbsp;git svn clone <a href="http://node2.example.com/svn/project01" rel="nofollow">http://node2.example.com/svn/project01</a> &nbsp;--authors-file=userinfo.txt &nbsp;project01
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">注: git svn fetch 这个步骤，可能碰到只想从某个版本开始进行fetch，那么请需要 –r 参数。</span>
</p>
<p>
	
</p>
<p>
	例如：
</p>
<p>
	
</p>
<p>
	# git svn fetch -r 1342:HEAD
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">注：1342是你想要从这个版本开始fetch，如何查看这个版本号，你可以使用 svn 命令（windows下需要安装Subversion Client，e.g. sliksvn），简单使用就是 svn log svn_url&nbsp;</span>
</p>
<p>
	<span style="color:#E53333;">这个时候，你可能看到整屏在刷新，没关系，看到log就行。当然更简单的就是使用TortoiseSVN-&gt; Show log。</span>
</p>
<p>
	
</p>
<p>
	亦或者你可以这样使用：
</p>
<p>
	
</p>
<p>
	# git svn clone <a href="http://node2.example.com/svn/project01" rel="nofollow">http://node2.example.com/svn/project01</a> -sr 1342:HEAD project01
</p>
<p>
	
</p>
<p>
	2)创建本地SSH keys并上传到github,详见:
</p>
<p>
	<span style="line-height:1.5;"><a href="https://help.github.com/articles/generating-ssh-keys" rel="nofollow">https://help.github.com/articles/generating-ssh-keys</a></span>
</p>
<p>
	<span style="line-height:1.5;">并更改连接到github SSH端口</span>
</p>
<p>
	<span style="line-height:1.5;"># vim ~/.ssh/config</span>
</p>
<p>
	<span style="line-height:1.5;">增加:</span>
</p>
<p>
	<span style="line-height:1.5;">————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">Host github.com</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; Hostname ssh.github.com</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; Port 443</span>
</p>
<p>
	<span style="line-height:1.5;">————————————————————————————</span>
</p>
<p></p>
<p>
	
</p>
<p>
	3).到这步的时候，本地已经clone了SVN仓库，现在需要的就是提交到远程了。首先，关联github远程仓库，如下：
</p>
<p>
	
</p>
<p>
	# git remote add origin <a href="mailto:git@github.com">git@github.com</a>:leonIi/project01
</p>
<p>
	<span style="line-height:1.5;"># git fetch</span>
</p>
<p>
	<span style="line-height:1.5;"># git commit -a -m "add file"</span>
</p>
<p>
	<span style="line-height:1.5;"># git add .</span>
</p>
<p>
	<span style="line-height:1.5;"># git push -f&nbsp;</span>
</p>
<p>
	
</p>
<p>
	到github上面查看这个仓库(repository),大致效果如下（https://github.com/leonIi/project01.git）
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140808-1@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140808-1@2x-1024x600.png" alt="QQ20140808-1@2x" width="1024" height="600" class="alignnone size-large wp-image-1233" /></a>
</p>
<p>
	
</p>
<p>
	<span>大功告成…</span>
</p>
<p>
	
</p>
<p></p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1227">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="SVN到Git迁移笔记" href="http://www.showerlee.com/archives/1227">http://www.showerlee.com/archives/1227</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1227/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
