目录

    1. 简介

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

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

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

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

    2. 安装

    2.1 安装工具集

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

    2.2 安装 Gitlab CE

    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 位置可能不一样。可以通过命令查找具体位置:

    find /var -name gitlab.socket
    

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

        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

    #启动服务
    gitlab-ctl reconfigure
    gitlab-ctl start
    

    其他常用命令:

    # 单独起一个服务
    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 日志。

    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 的权限。

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

    再看 nignx.conf 中

    user  nginx;
    

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

    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. 参考