本文安装gitlab版本为: "build_version": "14.0.0"

解决官方无法安装的情况

编辑源

使用清华大学 TUNA 镜像源 打开网址将内容复制到gitlab-ce.repo文件中,编辑路径

vim /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key

更新本地 YUM 缓存

sudo yum makecache

 

安装git

如果已经用yum安装过git,并且版本低于2.7.4,要先卸载掉旧的版本

yum install vim curl openssh-server openssh-clients gcc-c++ zlib1g-dev zlib-devel curl-devel expat-devel gettext-devel opgcc perl-ExtUtils-MakeMaker
yum remove git

使用源码编译安装git

mkdir /tmp/git && cd /tmp/git
curl -O --progress https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.32.0.tar.gz
tar zxvf git-2.32.0.tar.gz
cd git-2.32.0
./configure --prefix=/usr/local/git
make all
make  install
# 验证git版本号
git --version
#查看git安装路径
which git
#创建软连接
ln -s /usr/local/git/bin/git /usr/bin/git
ln -s /usr/local/git/bin/git /usr/local/bin/git

 

安装 GitLab 社区版

sudo yum install gitlab-ce #(自动安装最新版)
sudo yum install gitlab-ce-8.8.4-ce.0.el6 #(安装指定版本)

配置并启动GitLab

# vim /etc/gitlab/gitlab.rb 
# 找到 external_url 'http://000.00.00.00:8081' # 修改成你的地址

# 日志路径配置
mv /var/log/gitlab /data/logs/
ln -s /data/logs/gitlab /var/log/gitlab

# 首次启动也需要以下命令加载配置,完成初始化
sudo gitlab-ctl reconfigure

#启动gitlab
sudo gitlab-ctl restart

设置GitLab用户密码

GitLab 提供了一个 Rake Task 来使用用户名重置用户的密码,可以通过以下命令调用

sudo gitlab-rake "gitlab:password:reset[root]"

要重置默认管理员密码,请使用用户名 root 运行此 Rake 任务,这是该管理员帐户的默认用户名。

GitLab配置更改

当gitlab安装完成后,根据自己的环境,要修改配置。

如:

  • gitlab修改nginx端口,绑定IP等
  • gitlab修改ssh端口
  • gitlab修改访问url等
  • gitlab修改数据库类型(这个没必要,因为这里的数据库只存储些用户名,gitlab代码放在/var/opt/gitlab/git-data/下)
  • gitlab修改redis,gunicorn配置等等

所有的配置在/etc/gitlab/gitlab.rb中修改,修改完配置后执行gitlab-ctl reconfigure生效

  • gitlab所有的工程目录都在/opt/gitlab/
[ root@gitlab-server:~ ]# ls /opt/gitlab/
bin  dependency_licenses.json  embedded  etc  init  LICENSE  licenses  LICENSES  service  sv  var  version-manifest.json  version-manifest.txt
  • 其他服务的配置目录都在/var/opt/gitlab/下
[ root@gitlab-server:~ ]# ls /var/opt/gitlab/
alertmanager  gitaly     gitlab-exporter  gitlab-workhorse  nginx              postgresql              redis
backups       git-data   gitlab-rails     grafana           node-exporter      prometheus              trusted-certs-directory-hash
bootstrapped  gitlab-ci  gitlab-shell     logrotate         postgres-exporter  public_attributes.json
  • 默认存储位置:

官方文档:https://docs.gitlab.com/omnibus/settings/configuration.html#storing-git-data-in-an-alternative-directory

#创建/data/gitlab目录
mkdir -p /data/gitlab/git-data
chown -R git:git /data/gitlab
chmod -R +x /data

#修改gitlab配置文件,在git_data_dirs下面添加一句:git_data_dirs({ "default" => { "path" => "/data/gitlab/git-data" } })
vim /etc/gitlab/gitlab.rb
---------------------------------------
# git_data_dirs({
#   "default" => {
#     "path" => "/mnt/nfs-01/git-data"
#    }
# })
git_data_dirs({ "default" => { "path" => "/data/gitlab/git-data" } })

#停止当前gitlab,重新加载配置
sudo gitlab-ctl stop
sudo gitlab-ctl reconfigure

#重新加载后,会发现在/data/gitlab/git-data 目录下多出一个repositories目录
#最后启动gitlab即可
sudo gitlab-ctl restart
  • 修改备份文件默认目录

修改/etc/gitlab/gitlab.rb来修改默认存放备份文件的目录:

gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/data/backup/gitlab"
gitlab_rails['backup_archive_permissions'] = 0644

创建并修改目录权限

mkdir -p /data/backup/gitlab

# 赋予目录权限,否则重新加载配置会报权限错误
chmod -R 0644 /data/backup/gitlab
chmod -R +x /data/

使用gitlab-ctl reconfigure命令重载配置文件。

# 重新加载配置,并重启服务
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart

修改配置示例:

[ root@gitlab-server:~ ]# grep -v '#' /etc/gitlab/gitlab.rb |grep -v ^$
external_url 'http://gitlab.qshtest.com'
gitlab_rails['gravatar_plain_url'] = 'http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&d=identicon'
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/data/backup/gitlab"
gitlab_rails['backup_archive_permissions'] = 0644
git_data_dirs({ "default" => { "path" => "/data/gitlab/git-data" } })
gitlab_rails['gitlab_shell_ssh_port'] = 2222

修改url是别人通过url拉取代码,IP对客户端透明。修改ssh port及nginx绑定IP等为环境需要解决冲突。

GitLab头像无法正常显示

原因:gravatar被墙 解决办法: 编辑 /etc/gitlab/gitlab.rb,将

# gitlab_rails['gravatar_plain_url'] = 'http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&d=identicon'
修改为:
#gitlab_rails['gravatar_plain_url'] = 'http://gravatar.duoshuo.com/avatar/%{hash}?s=%{size}&d=identicon'
gitlab_rails['gravatar_plain_url'] = 'http://cdn.libravatar.org/avatar/%{hash}?s=%{size}&d=identicon'

#然后在命令行执行:
sudo gitlab-ctl reconfigure 
sudo gitlab-rake cache:clear RAILS_ENV=production

 

Gitlab配置SMTP邮件

官方文档:https://docs.gitlab.com/omnibus/settings/smtp.html

登录GitLab

# 上面设置的密码
Username: root 
Password: 123123tyf
 

GitLab汉化

 

nginx配置

解决 80 端口被占用

upstream gitlab {
     server 114.55.111.111:8081 ;
}
server {
    #侦听的80端口
    listen       80;
    server_name  git.diggg.cn;
    location / {
        proxy_pass   http://gitlab;    #在这里设置一个代理,和upstream的名字一样
        #以下是一些反向代理的配置可删除
        proxy_redirect             off;
        #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
        proxy_set_header           Host $host;
        proxy_set_header           X-Real-IP $remote_addr;
        proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size       10m; #允许客户端请求的最大单文件字节数
        client_body_buffer_size    128k; #缓冲区代理缓冲用户端请求的最大字节数
        proxy_connect_timeout      300; #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout         300; #后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout         300; #连接成功后,后端服务器响应时间(代理接收超时)
        proxy_buffer_size          4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers              4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
        proxy_busy_buffers_size    64k; #高负荷下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    }
}

# 检查配置
/usr/local/nginx-1.5.1/sbin/nginx -tc conf/nginx.conf

# nginx 重新加载配置
/usr/local/nginx-1.5.1/sbin/nginx -s reload
 

运维

# 启动所有 gitlab 组件:
sudo gitlab-ctl start

# 停止所有 gitlab 组件:
sudo gitlab-ctl stop

# 重启所有 gitlab 组件:
sudo gitlab-ctl restart

# 查看服务状态
sudo gitlab-ctl status

# 启动服务
sudo gitlab-ctl reconfigure

# 修改默认的配置文件
sudo vim /etc/gitlab/gitlab.rb

# 查看版本
sudo cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

# 系统内核调优
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl -p
echo never > /sys/kernel/mm/transparent_hugepage/enabled

# 检查gitlab
gitlab-rake gitlab:check SANITIZE=true --trace

# 查看日志
sudo gitlab-ctl tail

 

备份恢复

Gitlab 创建备份

使用Gitlab一键安装包安装Gitlab非常单, 同样的备份恢复与迁移也非常简单,用一条命令即可创建完整的Gitlab备份:

gitlab-rake gitlab:backup:create
 #如果使用源码安装的gitlab话,使用以下命令 sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production

以上命令将在/var/opt/gitlab/backups目录下创建一个名称类似为xxxxxxxx_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的xxxxxx是备份创建的时间戳。

也可以使用SKIP变量来选择要备份的内容,SKIP变量的选项有:db, uploads (attachments), repositories, builds(CI build output logs), artifacts (CI build artifacts), lfs (LFS objects)。多个项之间用逗号隔开:

sudo gitlab-rake gitlab:backup:create SKIP=db,uploads1

backup命令执行之后,终端上会出现导出数据库及repo数据等的的操作日志。

备份定时任务

#0 2 * * * /usr/bin/gitlab-rake gitlab:backup:create
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create

恢复

首先进入备份 gitlab 的目录,这个目录是配置文件中的 gitlab_rails['backup_path'] ,默认为 /var/opt/gitlab/backups 。

然后停止 unicorn 和 sidekiq ,保证数据库没有新的连接,不会有写数据情况。

# 停止相关数据连接服务
gitlab-ctl stop unicorn 
# ok: down: unicorn: 0s, normally up 

gitlab-ctl stop sidekiq
# ok: down: sidekiq: 0s, normally up
 # 从xxxxx编号备份中恢复 # 然后恢复数据,1406691018为备份文件的时间戳 gitlab-rake gitlab:backup:restore BACKUP=1406691018 # 启动Gitlab sudo gitlab-ctl start
# 恢复过程中没有权限
mkdir /var/opt/gitlab/backups
chown git /var/opt/gitlab/backups
chmod 700 /var/opt/gitlab/backups
# 恢复成功页面报没有权限的错误
sudo chown -R git:git /var/opt/gitlab/git-data/repositories
sudo chmod -R ug+rwX,o-rwx /var/opt/gitlab/git-data/repositories
sudo chmod -R ug-s /var/opt/gitlab/git-data/repositories
sudo find /var/opt/gitlab/git-data/repositories -type d -print0 | sudo xargs -0 chmod g+

迁移

把备份文件拷贝到gitlab的备份目录下,根据上面gitlab恢复步骤即可。
Error executing action `run` on resource 'bash[migrate gitlab-rails database]'

https://gitlab.com/gitlab-org/gitlab-ce/issues/2052#note_1667899

NameError: uninitialized constant Devise::Async

本文参考:http://www.cnblogs.com/chinajava/p/5870683.html