关于gitlab服务器的搭建

2017-01-17 Meng Lei 更多博文 » 博客 » GitHub »

备忘 GIT 持续集成

原文链接 http://menglei.tk/2017/01/17/gitlab/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


Gitlab简介

Gitlab 是一个用于管理GIT代码库的项目,提供权限管理、代码review、问题跟踪、wiki以及持续集成等多种功能,Gitlab 一共提供四种版本可供用户选择,分别是

  • Gitlab Community Edition (CE):社区版,免费,用户自行托管,通过社区提供技术支持
  • Gitlab Enterprise Edition (EE):企业版,付费,用户自行托管,提供附加的功能以及技术支持
  • Gitlab.com:免费的SaaS服务,可以创建共有以及私有的版本库,可以购买额外的技术支持
  • GitHost.io:由Gitlab提供的用户私有的独享服务

我们使用的是Gitlab CE版本。

Gitlab安装

Gitlab的安装非常简单,首先访问下载地址:https://about.gitlab.com/downloads/,选择对应的操作系统类型,我们使用的是Ubuntu 16.04,也就是Gitlab官方推荐的运行环境,然后就会跳转到对应的安装说明,按照说明一步一步安装即可。

安装所需要的依赖项

sudo apt-get install curl openssh-server ca-certificates postfix

添加gitlab源并安装

目前最新的版本是8.13.11

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt-get install gitlab-ce

如果不想通过脚本进行安装,也可以直接下载gitlab的deb包,通过dpkg命令进行安装

curl -LJO https://packages.gitlab.com/gitlab/gitlab-ce/packages/ubuntu/xenial/gitlab-ce-XXX.deb/download
dpkg -i gitlab-ce-XXX.deb

配置并启动gitlab

sudo gitlab-ctl reconfigure

执行完上述命令后,即可通过IP或者域名访问Gitlab,初次访问,会提示用户设置一个至少八位的管理员密码,用户名为root,今后这就是本系统的第一个用户,拥有最高的管理员权限。使用用户名root和刚刚设置的密码登陆之后,就可以进行一系列的设置了。

Gitlab 配置

以上只是Gitlab的默认配置,如果需要更加自定义的配置Gitlab,就需要执行以下操作了。

配置外部访问URL

为了能够正确显示代码库的下载地址,Gitlab需要知道用户使用的是什么地址来进行访问的,例如:http://gitlab.example.com,在/etc/gitlab/gitlab.rb中添加或者编辑如下参数:

external_url "http://gitlab.example.com"

运行sudo gitlab-ctl reconfigure使更改生效。

配置URL相对路径

注意:相对路径的特性是在8.5版本才加入的,目前处于实验状态。

尽管Gitlab推荐用户将其安装在独有的域名之下,但是由于种种原因,这种做法并不一定总是可行,所以,Gitlab可以安装在相对路径之下,例如:http://exmaple.com/gitlab

需要注意的是,修改了URL之后,所有的远程地址都会改变,所以您必须要在所有的本地版本库中手动修改指向您gitlab实例的所有远程地址。

相对路径的系统需求

由于Gitlab安装包内含有已经编译好的资源文件(CSS、JavaScript、字体等),如果您配置Gitlab的相对路径,这些资源都需要被重新编译,这项任务将耗费相当一部分CPU和内存资源,为了避免资源耗尽导致出错,您的系统必须拥有至少2GB的可用内存,当然,Gitlab推荐至少要有4GB的内存和4核或者8核的CPU。

启动Gitlab的相对路径

启动相对路径功能需要按照以下步骤进行操作:

  • 1.(可选)如果系统资源不足,可以通过以下命令关闭Unicorn和Sidekiq来释放一部分内存。

    sudo gitlab-ctl stop unicorn
    sudo gitlab-ctl stop sidekiq
    
  • 2.在/etc/gitlab/gitlab.rb中设置external_url参数。

    external_url "https://example.com/gitlab"
    

    在本例中,Gitlab将会运行在相对路径/gitlab下,用户可以根据自己的需求进行设置。

  • 3.重新运行配置命令使更改生效

    sudo gitlab-ctl reconfigure
    
  • 4.如果您在第一步中关闭了Unicorn和Sidekiq,此处需要重启。

    sudo gitlab-ctl restart
    

关闭Gitlab的相对路径

关闭相对路径功能,只需要按照以上的操作一步一步进行即可,并且将external_url设置为不包含相对路径即可,当配置完成之后,您可能需要单独运行以下命令重启Unicorn。

sudo gitlab-ctl restart unicorn

使用非root用户调用外部配置文件

Gitlab从/etc/gitlab/gitlab.rb处加载配置文件,该文件仅能够被root用户访问,但是在特定情况下,是允许用户以非root形式访问配置文件的,那么就需要在/etc/gitlab/gitlab.rb中配置如下的路径:

from_file "/home/admin/external_gitlab.rb"

需要注意的是,如果是以root权限运行的sudo gitlab-ctl reconfigure,那么,任何/etc/gitlab/gitlab.rb文件中from_file之后的配置项将会覆盖外部配置文件中的配置。

在其他位置保存Git数据

默认情况下,Gitlab会将所有数据保存在/var/opt/gitlab/git-data,所有的版本库会保存在其中的一个子目录repositories,我们可以通过修改/etc/gitlab/gitlab.rb中的git-data来改变其保存位置。

git_data_dirs({"default" => "/mnt/nas/git-data"})

自从Gitlab 8.10版本以来,也可以通过修改/etc/gitlab/gitlab.rb来将Git数据保存在不止一个目录中。

git_data_dirs({
  "default" => "/var/opt/gitlab/git-data",
  "alternative" => "/mnt/nas/git-data"
})

注意:所有的目录以及子目录都不能是软连接。

运行sudo gitlab-ctl reconfigure来使配置生效。

如果之前在/var/opt/gitlab/git-data中已经有版本库,需要按照如下操作将其移动到新的位置

# Prevent users from writing to the repositories while you move them.
sudo gitlab-ctl stop

# Note there is _no_ slash behind 'repositories', but there _is_ a
# slash behind 'git-data'.
sudo rsync -av /var/opt/gitlab/git-data/repositories /mnt/nas/git-data/

# Start the necessary processes and run reconfigure to fix permissions
# if necessary
sudo gitlab-ctl upgrade

# Double-check directory layout in /mnt/nas/git-data. Expected output:
# repositories
sudo ls /mnt/nas/git-data/

# Done! Start GitLab and verify that you can browse through the repositories in
# the web interface.
sudo gitlab-ctl start

启用HTTPS

默认情况下,Gitlab并未启用HTTPS,如果需要使用HTTPS,那么首先要修改/etc/gitlab/gitlab.rb

# note the 'https' below
external_url "https://gitlab.example.com"

由于主机名是'gitlab.exmaple.com',Gitlab将会搜索/etc/gitlab/ssl/gitlab.example.com.key/etc/gitlab/ssl/gitlab.example.com.crt两个文件作为证书和加密密钥,相应的,我们要创建目录/etc/gitlab/ssl并将证书文件复制到此处。

sudo mkdir -p /etc/gitlab/ssl
sudo chmod 700 /etc/gitlab/ssl
sudo cp gitlab.example.com.key gitlab.example.com.crt /etc/gitlab/ssl/

现在即可运行sudo gitlab-ctl reconfigure,当配置结束,即可通过https://gitlab.example.com访问gitlab。

如果您正在运行防火墙,则必须要启用443端口以便HTTPS流量可以通过。

# UFW example (Debian, Ubuntu)
sudo ufw allow https

# lokkit example (RedHat, CentOS 6)
sudo lokkit -s https

# firewall-cmd (RedHat, Centos 7)
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld

默认情况下,当external_url配置以https开头的时候,Nginx便不再监听HTTP的80端口,如果想要将所有的HTTP请求都重定向给HTTPS,那么需要使用redirect_http_to_https配置:

external_url "https://gitlab.example.com"
nginx['redirect_http_to_https'] = true

Gitlab的备份与迁移

备份Gitlab

Gitlab的备份非常简单,只需要一条命令即可:

sudo gitlab-rake gitlab:backup:create

使用以上命令,会在/var/opt/gitlab/backups目录下创建一个名称1484626546_2017_01_17_gitlab_backup.tar的压缩包,这就是Gitlab的完整备份文件,文件名开头的1484626546为精确到秒的时间戳。

Gitlab的备份文件存放位置可以通过修改/etc/gitlab/gitlab.rb文件来配置:

gitlab_rails['backup_path'] = '/some/path/backups'

将Gitlab备份文件上传至云存储中

从Gitlab 7.4开始,可以使用备份脚本将其创建的'.tar'文件进行上传,其使用Fog Library来执行上传操作,在下面的例子中,我们使用Amazon S3作为存储,但是Fog也可以同时使用其他存储提供商的服务。

/etc/gitlab/gitlab.rb文件中添加以下命令:

gitlab_rails['backup_upload_connection'] = {
  'provider' => 'AWS',
  'region' => 'eu-west-1',
  'aws_access_key_id' => 'AKIAKIAKI',
  'aws_secret_access_key' => 'secret123'
  # If using an IAM Profile, leave aws_access_key_id & aws_secret_access_key empty
  # ie. 'aws_access_key_id' => '',
  # 'use_iam_profile' => 'true'
}
gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket'

将备份文件上传至本地挂载的存储中

您也可以通过Fog将备份文件上传至本地挂在的存储设备中,例如NFS、CIFS、SMB等,由于Gitlab的备份服务是运行在Git用户下的,所以挂载点必须是以git用户作为owner。

除了local_root之外,必须还要backup_upload_remote_directory参数,这个参数指明了备份文件将要复制到您所挂在的目录中的哪个子目录,如果目录不存在,将会自动创建,如果要将备份文件复制到您所挂在的那个根目录中,则该值只需要设置为.即可。

gitlab_rails['backup_upload_connection'] = {
  :provider => 'Local',
  :local_root => '/mnt/backups'
}

# The directory inside the mounted folder to copy backups to
# Use '.' to store them in the root directory
gitlab_rails['backup_upload_remote_directory'] = 'gitlab_backups'

保存配置文件

需要注意的是,备份文件中并没有保存您的配置信息,一方面的原因是您的数据库中保存有加密的两步验证信息,讲加密信息和密钥保存在同一个位置违背了使用储存加密信息的原则。

至少需要备份的文件是/etc/gitlab/gitlab.rb/etc/gitlab/gitlab-secrets.json以保存数据库的加密密钥。

恢复以前创建的备份文件

您只能将备份文件恢复到完全相同的Gitlab版本中。

在执行恢复操作之前,您必须要拥有一个能够正常运行的Gitlab实例,同时在执行恢复操作的时候,该实例上原来运行的所有数据都将会被清空,被恢复的数据所替代。

在启用了两步验证(2FA)的Gitlab中,您必须要确保将/etc/gitlab/gitlab.rg/etc/gitlab/gitlab-secrets.json同时恢复,并且在恢复之后要运行sudo gitlab-ctl reconfigure使修改生效。

执行以下恢复步骤的过程中我们假设:

  • 必须安装了与创建备份所用Gitlab完全相同的版本。
  • 必须执行了sudo gitlab-ctl reconfigure至少一次。
  • 如果Gitlab没有在运行中,则必须要执行sudo gitlab-ctl start

首先,确保备份的tar文件被放置在了gitlab.rb文件中gitlab_rails['backup_path']中所配置的路径下,默认值是/var/opt/gitlab/backups

sudo cp 1484626546_2017_01_17_gitlab_backup.tar /var/opt/gitlab/backups/

停止连接到数据库的进程,只剩Gitlab在运行

sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
# Verify
sudo gitlab-ctl status

接下来,恢复备份文件,指定您想要恢复的文件的时间戳

# This command will overwrite the contents of your GitLab database!
sudo gitlab-rake gitlab:backup:restore BACKUP=1484626546_2017_01_17

重启并确认Gitlab运行状态

sudo gitlab-ctl start
sudo gitlab-rake gitlab:check SANITIZE=true

如果备份和恢复所用的Gitlab版本不符,在恢复过程中会报错,您只需要重新安装正确的Gitlab版本并重试即可。

设置定时任务保证每日备份

为了添加每日定时备份任务,需要使用root用户添加cron定时任务:

sudo su -
crontab -e

然后添加如下命令使其每日凌晨两点钟执行一次定时备份:

0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1

同时,为了避免备份文件过多占用磁盘空间,我们需要为备份文件设置一个生命周期,只需要在/etc/gitlab/gitlab/rb中设置以下参数并执行sudo gitlab-ctl reconfigure即可:

# limit backup lifetime to 7 days - 604800 seconds
gitlab_rails['backup_keep_time'] = 604800

注意:backup_keep_time仅对本地备份有效。