在centos7上搭建gitlab的正确姿势

公司初创, 新买了一台Dell r320服务器。略屌, 但屌的是它居然是机架式的而不是之前常见到的塔式, 所以大家都觉得很叼的样子。但其实性能一般, 4核8G内存1T硬盘的配置并不算什么高端水准。但是不管怎么样, 既然服务器买了总不能当做摆设吧。
按最初设计, 服务器至少两台。一台用来做测试服务器, 另一台用来部署各种工具, 比如svn, gitlab, 游戏后台管理和自动化发布工具等等。但是预算有限, 服务器只有一个那就先用着吧, 实在不行以后再想辙。
工具最先要用到也就是策划和美术们要管理资源和文档的svn, 另外就是技术要用的gitlab。svn很简单没什么可说的, 其实技术也完全可以使用svn, 但是为了更好地装逼, 虽然暂时只有一前一后两个技术, 但我们还是任性地选择了gitlab这个部署起来非常蛋疼但biger够高的代码版本管理工具。

言归正传, 介绍一下centos7安装gitlab的正确姿势。

系统工具安装设置

论官方文档的重要性

https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md 开始装之前, 建议各位老少爷们千万不要吝惜这点时间, 动手点进去, 花个十分钟把整个流程熟悉一下。这真是血的教训, 我最开始的时候网上搜到一篇安装教程就开始动手装, 结果中间出了N多问题。所以, 劝诫各位不管是装什么工具, 花点时间看看官方的文档, 百利而无一害。

说一下服务器上的环境和需要用到的依赖

OS: centos 7
Ruby: 2.1.2p95
redis: 2.8.19
mysql: 5.6.25
git: 2.1.3
nginx: 1.8.0

升级linux系统版本和安装wget

升级所有包, 改变软件设置和系统设置,系统版本内核都升级;wget是很常用的linux系统下载工具, 方便之后下载需要用到的包。

$ sudo yum -y update
$ sudo yum -y install wget

增加EPEL安装源

EPEL, 即Extra Packages for Enterprise Linux, 是对标准yum安装源的很好补充, 里边包含了很多常用的软件。
下载并安装GPG key

$ sudo wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 https://www.fedoraproject.org/static/0608B895.txt
$ sudo rpm —import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

检验是否安装成功

$ sudo rpm -qa gpg*

安装epel-release-6-8.noarch包

$ sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

配置EPEL源

创建文件/etc/yum.repos.d/PUIAS_6_computational.repo, 然后写入以下内容:

name=PUIAS computational Base $releasever - $basearch
mirrorlist=http://puias.math.ias.edu/data/puias/computational/$releasever/$basearch/mirrorlist
#baseurl=http://puias.math.ias.edu/data/puias/computational/$releasever/$basearch
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puias

下载并安装GPG key

$ sudo wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-puias http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias
$ sudo rpm —import /etc/pki/rpm-gpg/RPM-GPG-KEY-puias

检验成功没有
出现类似的打印既安装成功
gpg-pubkey-352c64e5-52ae6884

安装配置完后, 可以敲入命令检测一下:

$ sudo yum repolist

安装GitLab的所需依赖包和工具

$ su -
$ yum -y groupinstall ‘Development Tools’
$ 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

如果安装过程中出现不能安装的情况, 那么增加rhel6的安装源, 再试试。

$ yum-config-manager —enable rhel-6-server-optional-rpms

配置redis

$ sudo chkconfig redis on # 加入开机自启动redis的设置
$ sudo service redis start # 启动redis, 默认端口6379

配置邮件服务器
这里暂时略过了, 没有弄。

安装Ruby

$ su -
$ mkdir /tmp/ruby && cd /tmp/ruby
$ curl —progress ftp://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz | tar xz
$ cd ruby-2.0.0-p353
$ ./configure —prefix=/usr/local/
$ make && make install

确认安装是否成功

$ which
/usr/local/bin/ruby
$ ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

安装bundle

$ sudo gem install bundler —no-ri —no-rdoc
如果提示sudo: gem: command not found, 切换到root账户下执行。

创建git用户来运行gitlab服务

$ su -
$ adduser —system —shell /bin/bash —comment ‘GitLab’ —create-home —home-dir /home/git/ git
Tip:省略密码

配置gitlab-shell

GitLab shell是专门为GitLab开发的提供ssh访问和版本管理的软件。

$ su - git # 因为git用户没有密码, 所以这里要先切到root, 然后切换到git用户

clone gitlab-shell的源码

$ git clone https://github.com/gitlabhq/gitlab-shell.git
$ cd gitlab-shell

切换到v2.2.0版本

$ git checkout v2.2.0

然后根据自己的需求修改配置

$ cp config.yml.example config.yml

将 gitlab_url: “http://localhost:8080/“ 修改成自己的域名或者地址, 如 http://test.gitlab.net
Tip: 另外如果使用的域名是测试域名, 不要忘记在系统的/etc/hosts做域名映射。

执行脚本安装其他一些必备的配置或者目录

$ ./bin/install

安装mysql数据库

安装mysql并设置开机启动

$ su -
$ yum install -y mysql-server mysql-devel
$ chkconfig mysqld on
$ service mysqld start
设置mysql root账户的密码:
$ /usr/bin/mysql_secure_installation

创建新用户和数据库给gitlab使用

$ mysql -u root -p
# 输入root密码

# 为gitlab创建使用用户

CREATE USER 'gitlab'@'localhost' IDENTIFIED BY 'gitlab账号的密码';

# 创建gitlaba使用的数据库

CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;

# 给予gitlab用户权限

GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost';

# 登出数据库

\q

安装配置Gitlab

安装

$ su - git # 因为git用户没有密码, 所以这里要先切到root, 然后切换到git用户

克隆GitLab并切换分支到7-4-stable

$ git clone https://github.com/gitlabhq/gitlabhq.git gitlab
$ cd /home/git/gitlab
$ git checkout 7-4-stable

根据自己的实际情况配置
# 复制配置文件

$ cp config/gitlab.yml.example config/gitlab.yml

# 修改配置文件中的访问域名(your_domain_name为项目的访问域名)

$ sed -i ‘s|localhost|your_domain_name|g’ config/gitlab.yml

# 设定log和tmp目录所有者和权限

$ chown -R git log/
$ chown -R git tmp/
$ chmod -R u+rwX log/
$ chmod -R u+rwX tmp/

# 创建gitlab-satellites目录

$ mkdir /home/git/gitlab-satellites

# 创建tmp/pids/和tmp/sockets/目录, 确保gitlab有相应的权限

$ mkdir tmp/pids/
$ mkdir tmp/sockets/
$ chmod -R u+rwX tmp/pids/
$ chmod -R u+rwX tmp/sockets/

# 创建public/uploads目录

$ mkdir public/uploads
$ chmod -R u+rwX public/uploads

# 复制unicorn配置

$ cp config/unicorn.rb.example config/unicorn.rb

# 编辑unicorn配置(笔者这里采用默认配置)

$ vim config/unicorn.rb

# 配置git的用户和邮件

$ git config —global user.name “GitLab”
$ git config —global user.email “gitlab@your_domain_name”
$ git config —global core.autocrlf input

# 配置数据库访问文件, 修改其中username和password就可以了, 其中密码就是上面数据库步骤中创建gitlab用户的密码。

$ cp config/database.yml.mysql config/database.yml

#
# PRODUCTION
#
production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: gitlabhq_production
  pool: 10
  username: gitlab
  password: "gitlab"
  # host: localhost
  # socket: /tmp/mysql.sock

确保该文件只有git账号有权限读取。

$ chmod o-rwx config/database.yml

Tip:配置的时候需要仔细一点, 很可能因为一点小问题导致gitlab项目运行失败, 又得回头来折腾。

安装Gems

$ su -
$ gem install charlock_holmes —version ‘0.6.9.4’
$ exit

安装mysql依赖包

$ cd /home/git/gitlab/
$ bundle install —deployment —without development test postgres puma aws

Tip1: gem install和bundle install这两步安装的时候很坑爹, 因为安装的源都是国外的, 所以有时候会因为网络的原因导致整个安装过程频频失败, 因为这两步耗费了大量的精力。后来等公司人少了之后, 安装就很顺利了。so建议找个人少网好的地方执行这两步骤。
Tip2: 如果安装过程中出现长时间没有反应的时候, 可以尝试将GemFile里边source: http://rubygems.org 替换成 source: “https://ruby.taobao.org“, 然后再尝试。

初始化数据

$ cd /home/git/gitlab
$ bundle exec rake gitlab:setup RAILS_ENV=production
完成之后会生成一个默认的管理员账号:

admin@local.host
5iveL!fe

安装gitlab服务启动脚本

$ su -
$ wget -O /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlab-recipes/master/init/sysvinit/centos/gitlab-unicorn
$ chmod +x /etc/init.d/gitlab
设置开机自启动
$ chkconfig —add gitlab
$ chkconfig gitlab on

检测应用程序状态

$ su - git
$ cd gitlab/
$ bundle exec rake gitlab:env:info RAILS_ENV=production
Tip: 这里可以查看系统、Ruby、GitLab和GitLab Shell的版本和其他信息

启动Gitlab

$ service gitlab start

查看应用更加详细的信息

$ su - git
$ cd gitlab/
$ bundle exec rake gitlab:check RAILS_ENV=production
Tip: 这里可以看到一些检测的日志, 如果中间出现了红色的报错信息, 那就挨个解决。其中Init script up-to-date整个错误, 官方文档上提示可以忽略。

安装web服务器

选择Nginx,版本1.8.0

$ su -
$ yum -y install nginx
加入开机启动项
$ chkconfig nginx on

将gitlab的web服务配置文件拷入/etc/nginx/conf.d目录下

$ cd /home/git/gitlab
$ cp lib/support/nginx/gitlab /etc/nginx/conf.d/gitlab

根据实际情况修改配置,servre_name修改成自己的域名或者ip地址, 然后清除无用的web配置表

$ cd /etc/nginx/conf.d
$ mv default.conf default.conf.bak

将nginx加入git用户组,确保nginx有访问gitlab目录的权限,避免出现403错误

$ usermod -a -G git nginx
$ chmod g+rx /home/git/

重新启动nginx

$ sudo service nginx restart

配置防火墙

如果nginx配置里gitlab的端口不是默认的80端口, 需要把端口加入到防火的配置里, 避免出现无法连通的情况。然后重启防火墙。

当所有的步骤都顺利完成之后, 恭喜你也能拥有自己的gitlab了。访问地址就是gitlab.conf里配置的地址, 打开之后就能看到如此页面了。可以输入之前生成的管理员账号进入系统。

问题摘录

在这里把我在这整个过程中遇到的问题记录一下, 希望能给到大家一点帮助。

  1. bundle install的时候出现Could not find addressable-2.3.2 in any of the sources Runbundle installto install missing gems.类似的问题, 但去相应目录下查看却发现这个库是存在的, 并且安装提示出现了time out这样的提示, 那就是网络的原因导致了安装过程失败。
    解决办法: 找个网速好的地方或者等公司用网的时候少了再试试。

  2. 访问页面的时候出现302错误, 查看/home/git/gitlab/log/unicorn.stderr.log日志的时候发现有31 > 30秒这一行, 访问请求超时。分析其原因, 可能是因为访问页面的时候要加载大量的资源, 但是服务器尚未生成这些页面的资源, 所以需要执行下面的命令编译生成需要的资源文件。
    解决办法:

    $ cd /home/git/gitlab
    $ bundle exec rake assets:precompile RAILS_ENV=production

  3. gitlab是使用http或者https访问, nginx的配置和上述好几个文件里对应的ssl项的配置都是不一样的, https比http的配置更加复杂。当时第一次安装的时候, 从网上down下来的gitlab nginx配置的时候错误地down到了https的配置, 结果运行起来出现了许多验证失败导致push失败等相关的问题, 所以如果不是刚性需求, 这里还是建议选择http的访问方式。
    解决办法: 选择简便配置的http访问方式。

  4. 运行gitlab-shell bin目录下check脚本可以有效地发现一些ssh验证权限可能存在的问题, 所以这一步很有必要。

以上仅是个人使用经验,不一定代表正确思路,仅供参考。