Please enable Javascript to view the contents

GitLab 搭建与配置

 ·  ☕ 3 分钟

1. 简介

GitLab 是一个利用 Ruby on Rails 开发的开源应用程序,实现了自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目。

它拥有与 GitHub 类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。

简单说,GitLab 能够满足的需求有:

  • 代码仓库管理
  • Code Review
  • 免费的私有仓库
  • 开源,可以在内网搭建
  • GitLab CI,可以用于持续集成

2. 安装

2.1 安装工具集

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

2.2 安装 Gitlab CE

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

2.3 gitlab.rb 配置

编辑 /etc/gitlab/gitlab.rb

  • 将 external_url = “http://gitlab.com” ,修改为自己的域名:http://yourdomain.com。
  • 修改端口,取消 # unicorn[‘port’] = 8080 的注释,将 8080 修改为 8001 ,避免端口被占用。
  • 修改端口,取消 # gitlab_workhorse[‘auth_backend’] = “http://localhost:8080” 的注释,将 8080 修改为 8001。
  • 关闭 GitLab 自带的 Nginx,取消 #nginx[‘enable’] = true 的注释,将 true 改为 false。

2.4 本地 Nginx 配置:

下面以 GitLab 9.4.4 为例,其他版本的 gitlab.socket 位置可能不一样。可以通过命令查找具体位置:

1
find /var -name gitlab.socket

利用,nginx -t,命令找到 nginx 的配置文件位置,新增如下server

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
	upstream gitlab {
    server unix://var/opt/gitlab/gitlab-rails/sockets/gitlab.socket;
    }
	server{
        listen 80;
        server_name yourdomain.com;

        server_tokens off;     # don't show the version number, a security best practice
        root /opt/gitlab/embedded/service/gitlab-rails/public;

        client_max_body_size 50m;

        access_log  /var/log/gitlab/nginx/gitlab_access.log;
        error_log   /var/log/gitlab/nginx/gitlab_error.log;

        location / {
        try_files $uri $uri/index.html $uri.html @gitlab;
        }

    location @gitlab {
        proxy_read_timeout 300; # Some requests take more than 30 seconds.
        proxy_connect_timeout 300; # Some requests take more than 30 seconds.
        proxy_redirect     off;

        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Frame-Options   SAMEORIGIN;

        proxy_pass http://gitlab;
        }

    location ~ ^/(assets)/  {
        root /opt/gitlab/embedded/service/gitlab-rails/public;
        # gzip_static on; # to serve pre-gzipped version
        expires max;
        add_header Cache-Control public;
        }

    error_page 502 /502.html;
    }

2.5 启动 GitLab

1
2
3
#启动服务
gitlab-ctl reconfigure
gitlab-ctl start

其他常用命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 单独起一个服务
gitlab-ctl start nginx
#停止服务
gitlab-ctl stop
#重启服务
gitlab-ctl restart
//状态
gitlab-ctl status
# 查看日志
gitlab-ctl tail
# 列出全部服务
gitlab-ctl service-list
# 平稳停止一个服务
gitlab-ctl graceful-kill

3. 错误处理

3.1 git clone 500

这时需要修改 Nginx 配置,上面的配置使用的是 gitlab ,实际上官网上配置的是 gitlab-workhorse 。下面是一个简约配置,更详细的参数可以前往官方文档查看,文末有链接。

upstream gitlab-workhorse {
    server unix://var/opt/gitlab/gitlab-workhorse/socket;
    }
	server{
        listen 80;
        server_name yourdomain.com;

        server_tokens off;     # don't show the version number, a security best practice
        root /opt/gitlab/embedded/service/gitlab-rails/public;

        client_max_body_size 50m;

        access_log  /var/log/gitlab/nginx/gitlab_access.log;
        error_log   /var/log/gitlab/nginx/gitlab_error.log;

        location / {
        try_files $uri $uri/index.html $uri.html @gitlab-workhorse;
        }
		
        location @gitlab-workhorse {
        proxy_read_timeout 300; # Some requests take more than 30 seconds.
        proxy_connect_timeout 300; # Some requests take more than 30 seconds.
        proxy_redirect     off;

        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Frame-Options   SAMEORIGIN;

		proxy_pass http://gitlab-workhorse;
        }

        location ~ ^/(assets)/  {
        root /opt/gitlab/embedded/service/gitlab-rails/public;
        # gzip_static on; # to serve pre-gzipped version
        expires max;
        add_header Cache-Control public;
        }

    error_page 502 /502.html;
    }

3.2 502 页面

提示,GitLab is taking too much time to respond。这时,可以查看一下上面 Nginx 配置的 /var/log/gitlab/nginx/gitlab_error.log 日志。

1
2017/08/12 09:35:11 [crit] 21178#0: *1568 connect() to unix://var/opt/gitlab/gitlab-workhorse/socket failed (13: Permission denied) while connecting to upstream, client: 113.92.157.150, server: yourdomain.com, request: "GET / HTTP/1.1", upstream: "http://unix://var/opt/gitlab/gitlab-workhorse/socket:/", host: "yourdomain.com"

接着,查看一下,/var/opt/gitlab/gitlab-workhorse/socket 的权限。

1
2
ll  /var/opt/gitlab/gitlab-workhorse/socket
> srwxrwxrwx 1 git git 0 Aug 12 11:15 /var/opt/gitlab/gitlab-workhorse/socket=

再看 nignx.conf 中

1
user  nginx;

分析原因:网页以 nginx 用户执行 /var/opt/gitlab/gitlab-workhorse/socket 失败,没有权限。而 /var/opt/gitlab/gitlab-workhorse/socket 所属 git 组,git 用户。所以,只需要将 nginx 用户加入 git 组,即可。

1
usermod -G git nginx

官方文档上是通过,passenger_group 实现的,由于 Passenger 模块需要重新编译 Nginx 安装,于是,没有采用官方文档的配置。Stackoverflow 上面,有人通过直接修改 /var/opt/gitlab/gitlab-workhorse/socket 所属组也可以,没有复现出来,并且,每次 gitlab-ctl reconfigure 之后,修改的权限就会失效。

4,测试

具体的 git 命令,这里就不详细罗列了。新建一个项目,GitLab 支持直接从 GitHub 上 Fork,接着 git clone 到本地,然后 git push 到 master,进行了一个完整的推拉过程。

5. 参考


微信公众号
作者
微信公众号