gitlab搭建

一、需求分析

不论是开发还是运维还是管理者一般都熟悉githubgithub主要用于开源项目的维护,同时实现代码文本界面的管理,但是对于一般的企业而言,因商业机密代码是不能公开的,虽然github提供了私有仓库,但是还是无法满足全球的用户(因地理位置性、费用、网络传输速度等),所以即为了速度又为了保密性,公司有必要建立自己的github类似功能。这里有很多方法实现,这里我推荐Gitlab实现。Gitlab是利用 Ruby on Rails 一个开源的版本管理系统实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。

         gitlab官方提供的软件包,对软件基本要求:仅支持ubuntudebiancentosred hatoracle linuxscientific linux这几种linux衍生操作系统,自8.13版本开始不再支持Ruby 2.3以下版本(不含2.3);对硬件基本要求:存储:基于git的代码大小,gitlab瓶颈是磁盘的寻道,官方最低标配的CPU2核(支持500),最好是4核(支持用户2000)或8核(支持用户5000),内存:物理内存4G以上(官方标配,支持100用户),交换分区要在2G以上。

二、简单逻辑图

694405b86650a443e19400d113134ce6.png-wh_

这里也可以考虑不用备份。

三、详细规划

软件

版本

操作系统

CentOS Linux release 7.2_3.10.0-327.18.2.el7.x86_64

Gitlab

gitlab-ce-8.9.9(开源)ee版(收费)

 

用户

权限

管理员

all

普通用户

pushpull、创建分支、当前项目的代码

经理

查看所有项目代码及普通用户的权限

四、项目实施

1.安装gitlab

官网已经出gitlabrpm包,可以直接安装(当然也可以采用源码包安装,不建议,太繁琐了,各种配置问题,本人忙乎了两天时间才安装完毕,结果启动后有些二级web页面打不开),如修改git存储及weburl等问题(可以修改/etc/gitlab/gitlab.rb文件),后文有对配置文件的详细描述。

官网下载(使用脚本下载源)

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh|bash

yum install gitlab-ce -y

这里(自己搭建了yum源,使用公司自己的yum源,公司的提供gitlab-ce-8.9gitlab-ce-8.6两种版本)

安装过程参考文档出处:http://www.xuliangwei.com/xubusi/385.htmlgitlab安装部分。

cat /etc/redhat-release

uname -r

#这里仅测试了centos7.27.3

#安装和配置必要的依赖关系

#打开HTTPSSH访问

yum install curl openssh-server postfix -y

systemctl enable sshd postfix

systemctl start sshd postfix

#防火墙如果开启,则需要打开HTTPSSH访问(如果不开启,则忽略下面两条命令)

firewall-cmd --permanent --add-service=http

systemctl reload firewalld

#安装gitlab

yum install gitlab*.rpm < == 指定版本号

#配置并启动gitlab

gitlab-ctl reconfigure

gitlab-ctl start

#如果修改gitlab的配置文件/etc/gitlab/gitlab.rb的内容,需要重新gitlab-ctlreconfigure(先停掉),再启动gitlab

 

2.关于gitlab的相关配置

(配置文件默认路径/etc/gitlab/gitlab.rb),官方网址的配置有详细说明,详见:

https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/configuration.md

我这里介绍几点常用的配置修改:

1gitlabURL修改

external_url

可以是ip也可以是域名。

注意:也可以设置成相关的URL,例如:https://example.com/gitlab,但是设置成relativeURL的时候对gitlab的版本有要求,8.17版本开始之后,就不用重新编译(编译安装的),之后的需要重新执行gitlab-ctl reconfiguregitlab-ctl restart命令。

2git提交代码路径修改

git_data_dir

这里使用绝对路径,此路径不能是软链接。

同时也可以有多个git代码路径,如下实例:

git_data_dirs({

 "default" => "/var/opt/gitlab/git-data",

 "alternative" => "/mnt/nas/git-data"

})

#如果在/var/opt/gitlab/git-data下存在git仓库,想要增加或改变路径,可以进行如下操作:

gitlab-ctl stop

rsync -av /var/opt/gitlab/git-data/repositories/mnt/nas/git-data/

#这里需要注意/repositories后面没有/,/mnt/nas/git-data/需要跟/

gitlab-ctl upgrade   #< ==主要是更新修改的配置,如果必要的话需要gitlab-ctl reconfigure.

#查看/mnt/nas/git-data/下是否有repositories.

ls /mnt/nas/git-data/

gitlab-ctl start

 

注意:这个目录如果是nfs或者其他方式挂载的,需要关闭如下(默认是关闭的)

manage_storage_directories['enable'] =false

62b4451d423c33201d688b4d15915d7d.png-wh_

 

 

挂载的仓库目录有一个问题:就是比如启动时,nginxredisunicorn需要在挂载之后才能启动,所以需要增加一条配置如下:

# wait for /var/opt/gitlab to be mounted

high_availability['mountpoint'] ='/var/opt/gitlab'

#在进行gitlab-ctlreconfigure,然后启动即可。

3git用户或组的修改

gitlab-shell 登录的默认的用户是git,官网说不建议更改,会产生意向不到的后果,如果非要更改用户,则做如下操作:修改成了gitlab

## Modify default git user.

user['username'] = "gitlab"

user['group'] = "gitlab"

#用户或组可以指定uidgid

user['uid'] = 1234

user['gid'] = 1234

# # The shell for the git user

# user['shell'] = "/bin/sh"       

##这里有一个安全问题,git的用户应当禁止bash登录,更改为/opt/gitlab/embedded/bin/git-shell  (这里由于是gitlab集成的git所以文件目录是这样。),我暂时没有更改,因为还不确定是否成功,通过服务器禁止了无密码登录来保证安全

# # The home directory for the git user

# user['home'] = "/var/opt/gitlab"

# user['git_user_name'] ="GitLab"

# user['git_user_email'] ="gitlab@#{node['fqdn']}"

注意:是否管理用户和用户组(这里默认是不管理)

manage_accounts['enable'] = false,可以考虑使用其他的工具管理。比如LDAP.

 

4、防止用户滥用gitlab导致gitlab损坏,

首先开启Rack Attack功能(默认是开启的),它起到保护的作用。

gitlab_rails['rack_attack_git_basic_auth']= {

 'enabled' => true, # Enable/Disable Rack Attack

 'ip_whitelist' => ["127.0.0.1"], # Whitelisted urls

 'maxretry' => 10, # Limit the number of Git HTTP authenticationattempts per IP

 'findtime' => 60, # Reset the auth attempt counter per IP after 60seconds

 'bantime' => 3600 # Ban an IP for one hour (3600s) after too manyauth attempts

}

再者加入要保护的路径,加入到gitlab_rails['rack_attack_protected_paths']中。

例如:

gitlab_rails['rack_attack_protected_paths']= [

 '/users/password',

 '/users/sign_in',

 '/api/#{API::API.version}/session.json',

 '/api/#{API::API.version}/session',

 '/users',

 '/users/confirmation',

 '/unsubscribes/',

 '/import/github/personal_access_token'

]

注意:路径的问题,最好用绝对路径。

 

其他配置:比如LDAPHTTPSRedirect HTTP requests to HTTPSChange the defaultport and the ssl certificate locationsUse non-packagedweb-serverUsing a non-packaged Redis instanceAdding ENV Vars tothe GitLab Runtime EnvironmentChanging GitLab.yml settingsSending applicationemail via SMTPOmniauth (Google, Twitter, GitHub login)Setting theNGINX listen address or addressesInserting custom NGINX settings into the GitLab server blockInsertingcustom settings into the NGINX configEnable nginx_status

请详见gitlab官方网址

https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/configuration.md

 

 

五、Gitlab组件

官网中都有分离的组件包,详见官网https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/architecture.md#physical-office-analogy

d4d2d4c95e6551cb2220fd6ace361e22.png-wh_603b105e9e6454aea861717635a678e3.png-wh_

1.Nginx

作为前端提供web页面以及git工具是走http协议还是https协议。

2.Ruby on Rails

后端gitlab服务是采用Ruby on Rails框架,通过unicorn实现后台服务和进程。

3.SSHD

开启sshd服务,用于用户上传ssh key进行版本克隆及上传。注:用户上传的ssh key是保存到git账户中

4.数据库:

目前仅支持MySQL/MariaDBPostgreSQL,官方建议使用PostgreSQL

使用PostgreSQL必须确认GitLab使用的数据库安装了pg_trgm扩展。这个扩展需要PostgreSQL使用 root 用户在GitLab每个数据库里面执行下面的命令:

CREATE EXTENSION pg_trgm;

5.Redis

Redis存储每个客户端的sessions和后台任务队列,任务包括新建仓库、发送邮件等等

6.Sidekiq

Rails框架自带的,查看redis中的任务并执行,使用多线程处理后台任务。这个进程启动的时候会使用整个Rails堆栈(200MB+),但是它会在内存泄漏的情况下增加。一个用户非常活跃的服务器上(10,000个活跃用户)Sidekiq进程会占用1GB+的内存。

六、优化

1.硬件层优化:

能用ssd最好,或者使用转速高7200的,缓存高的sata盘,最好做raid10,数据库的原因导致的。CPU和内存前面已经叙述。

2.件层优化:

1)安全方面这里不赘述,单独一台服务器安装gitlab,没有其他服务是最好的

2gitlab的高可用性参考官网:https://www.gitlab.cc/high-availability/

3gitlab-Runner不建议安装到gitlab服务器上,工作时会消耗大量内存,可以考虑使用docker启动一个(也不建议安装到其他服务器,如果你要讲shell作为gitlab-Runner的执行器时,有安全问题,可以查看官网https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/security/index.md

gitlab-Runner是一个执行软件集成的脚本,通常配合gitlab-CI集成工具使用。Runner可以分布到不同的机器上。

下图是Gitlab-CI的简单逻辑拓扑图:

2f1ce065b662909527077bba3d2c7d96.png-wh_

4)gitlab自身优化

Unicorn优化:

增加unicornworkers数量,可以减少应用的响应时间并提高处理并发请求的能力,官方建议使用这样的配置:CPU 核心数 + 1 = unicorn workers 

对于只有2GB内存的机器,官方建议至少配置3unicorn workers;使用1GB内存加一个机械硬盘上的swap分区,建议只配置2Unicron workers;至少配两个,如果只使用一个unicorn workersgit只能通过ssh协议工作,因为HTTP访问需要两个workers(一个用来处理用户请求,一个用来处理身份验证) 如果你使用512MB内存加一个固态硬盘(SSD)上的swap分区,你可以用2unicorn workersgit就可以通过HTTP方式访问GitLab       

修改方法如下:在gitlab的配置文件/etc/gitlab/gitlab.rb中:

unicorn['worker_processes'] = 3

unicorn['worker_timeout'] = 60

nginx、数据库、redis的优化:一般不优化,基本已经优化好

用户的优化:没有试过,官方不建议,有可能出问题。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章