公司的项目,通常需要进行代码的版本管理。简单的方式可以在内网搭建一个仓库,然后添加各个组员的公钥来共同开发。这种方式不利于管理和维护,而且功能过于单一。我们很希望有像GitHub这样的git服务,功能齐全且好维护。但由于GFW的原因,有时候访问延迟过大。更重要的是,github免费版只支持开源项目,私有项目需要付费,而且比较昂贵,并不适合公司的项目。
GitLab 是一个类似与GitHub的项目,功能十分强大且界面美观,支持代码管理、issue管理、代码review和CI等功能。它提供免费社区版和付费版。社区版已经足够满足大部分的需求,而且安装很方便。
安装
GitLab CE的源码安装十分麻烦,需要安装和配置的东西太多,就不过多在环境搭建上折腾了。可以选择官方提供的Omnibus 一键安装包或者使用docker安装。
一键安装包
Omnibus GitLab 是官方提供的一键安装包,集成了GitLab,以及所需的服务和依赖。官方提供不同linux发行版的安装方法。
这里以ubuntu 14.04 为例。
安装依赖
1 | $ sudo apt-get install curl openssh-server ca-certificates postfix |
postfix 用来发送邮件,在安装期间选择【Internet Site】。也可以使用sendmail或者配置SMTP服务并使用SMTP发送邮件。
添加GitLab仓库并安装
1 2 | $ curl -sS http://packages.gitlab.cc/install/gitlab-ce/script.deb.sh | sudo bash $ sudo apt-get install gitlab-ce |
也可以下载deb包安装。
1 2 3 4 5 6 | $ curl -LJO https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/pool/trusty/main/g/gitlab-ce/gitlab-ce-<版本>.deb $ dpkg -i gitlab-ce-<版本>.deb ```bash **启动GitLab** ```bash $ sudo gitlab-ctl reconfigure |
docker安装
使用docker安装更方便,且易于升级管理。
确保系统安装了docker,并拉取GitLab官方镜像。
1 | $ docker pull gitlab/gitlab-ce |
启动GitLab 容器。
1 2 3 4 5 6 7 8 9 10 11 | sudo docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 \ --publish 1226:80 \ --publish 23:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest |
关于启动参数:
1 2 3 4 5 6 | --detach 设置容器后台运行 --hostname 设置容器的hostname --publish 暴露 https、http和ssh端口 --name 容器名称 --restart always 每次启动容器就重启GitLab --volume 设置GitLab数据挂载点 |
这里把GitLab的相关数据目录,都挂载到宿主机上的/srv/gitlab目录。
1 2 3 | /srv/gitlab/data 应用程序数据 /srv/gitlab/logs GitLab的log /srv/gitlab/config GitLab的配置文件 |
访问GitLab
安装完成之后,可以通过浏览器访问GitLab的web界面。第一次访问GitLab的时候,需要设置管理员的密码。设置完成之后,即可登陆进入主界面。
用户名和密码可以做相应修改。默认用户名为root。

到此,就可以创建自己的组(group)和项目(project)了。但是,现在用户pull和push代码还有些问题,需要做进一步的设置。
下面以docker安装的gitlab的配置为例,其它方式安装可以参考或者直接看官网文档。
配置
Omnibus GitLab的配置配置文件位于 /etc/gitlab/gitlab.rb。可以通过进入容器,修改配置做相应的自定义设置。
1 2 | $ docker exec -it gitlab bash $ vim /etc/gitlab/gitlab.rb |
基础设置
用户可以点击右上角图标的下拉菜单,选择【settings】做一些基础设置。

用户可以设置自己的用户名、密码、邮箱等信息,同时可以设置web的主题等等。但最重要的是设置自己的SSH Keys,这样才能正常的push和pull代码。
使用现有的公钥。
1 | $ cat ~/.ssh/id_rsa.pub |
或者创建新的ssh keys。更多参考ssh配置。
1 | $ ssh-keygen -t rsa -b 4096 -C "你的邮箱" |
然后复制,并添加到GitLab中。
external_url 设置
external_url为主机的域名或ip地址。默认的设置为:
1 2 | external_url 'GENERATED_EXTERNAL_URL' // 默认 http://hostname |
这个值默认是基于hostname的。
GitLab的资源如图片、git仓库地址都是基于这个url。项目的仓库地址为:
1 2 3 4 5 | // http http://<external_url>:<port>/<组名>/<项目名>.git // ssh git@<external_url>:<组名>/<项目名>.git |
可以根据自己情况修改external_url。
1 | external_url 'http://10.2.237.56' |
注意:external_url 必须带如http:// 的协议头。
设置之后,应用配置。
1 | $ sudo gitlab-ctl reconfigure |
端口设置
修改了external_url 之后,clone 代码的时候还是提示需要用户名密码。明明已经添加了ssh key ,莫非哪里打开方式不对?原来可能是容器启动的时候,ssh 端口映射为23,而不是默认的22。
GitLab 容器默认使用了以下端口:
- 80 http端口
- 433 https端口
- 8080 Unicorn端口
- 22 ssh 端口
因为这几个端口在宿主机经常使用,所以需要更改端口。修改/etc/gitlab/gitlab.rb 配置文件。
修改external_url
如果是http或者https端口,需要修改external_url。
1 2 3 4 5 | // http external_url "http://gitlab.example.com:1226" //启动时使用1226端口 // https external_url "https://gitlab.example.com:1227" //启动时使用1227端口 |
修改 ssh 端口
如果是ssh端口,需要修改gitlab_shell_ssh_port。
1 2 | // 使用23作为ssh端口 gitlab_rails['gitlab_shell_ssh_port'] = 23 |
重启配置生效。
1 | $ sudo gitlab-ctl reconfigure |
此时项目的仓库地址就变了。如果ssh端口地址不是默认的22,就会加上ssh:// 协议头。
1 2 3 4 5 | # 22端口 git@<external_url>:<组名>/<项目名>.git # 非22端口 ssh://git@<external_url>:port/<组名>/<项目名>.git |
如果需要设置http为域名,ssh为ip的话,可以通过gitlab_rails[‘gitlab_ssh_host’]设置ssh 的host。
1 2 3 4 5 6 7 | // 设置external_url 和 http端口 external_url 'http://gitlab.example.com:1226 // 设置ssh host gitlab_rails['gitlab_ssh_host'] = '10.2.123.123' // 设置ssh 端口 gitlab_rails['gitlab_shell_ssh_port'] = 23 |
这里有个坑。按上面设置external_url之后,居然访问不了,百思不得其解啊,都是按官网设置的。后来才发现一条,关于nginx的设置。原来默认下,nginx监听的端口为external_url中定义的,或者默认的80/443。所以刚nginx是监听的1226端口。而docker run的时候是暴露的80端口,所以根本就访问不了。
修改nginx的监听端口,一切ok。
1 2 | # nginx['listen_port'] = nil nginx['listen_port'] = 80 |
至此,就可以顺利的通过项目下的仓库地址来pull代码了。
配置方法
启动docker容器,然后进入容器修改配置,这种方式也没啥毛病,但如果想提前设置配置项,gitlab也提供了一个环境变量 GITLAB_OMNIBUS_CONFIG 来实现。
1 2 3 4 5 6 7 8 9 10 11 12 | sudo docker run --detach \ --hostname gitlab.example.com \ --env GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.example.com'; gitlab_rails['gitlab_shell_ssh_portv'] = '23';" \ --publish 443:443 \ --publish 1226:80 \ --publish 23:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest |
这个 GITLAB_OMNIBUS_CONFIG 环境变量设置的值并不会写入到gitlab.rb配置文件,只是在启动时加载,所以每次启动都需要带上这个启动项。其实我觉得并不是很方便。
如果安装了docker-compose的话,启动会方便一些,只需要配置一份docker-compose.yml文件,以后都用该文件启动。以下是一个docker-compose.yml的模板。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | web: image: 'gitlab/gitlab-ce:latest' restart: always hostname: 'gitlab.example.com' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://gitlab.example.com:9090' gitlab_rails['gitlab_shell_ssh_port'] = 2224 ports: - '9090:9090' - '2224:22' volumes: - '/srv/gitlab/config:/etc/gitlab' - '/srv/gitlab/logs:/var/log/gitlab' - '/srv/gitlab/data:/var/opt/gitlab' |
这里通过环境变量设置了external_url和ssh 端口。
之后在docker-compose.yml所在文件目录,启动GitLab。
1 | $ docker-compose up -d |
常用功能
GitLab有需要不错的功能,下面列举几个。
通告
如果需要升级或者别的需求,需要通知到每个用户,可以设置通告。仅限管理员使用。

管理员点击右上角的小把手,然后点击【message】的tab,然后再输入通告内容和展示的开始时间和结束时间即可。
登录首页
默认的登录首页是关于GitLab CE的一段描述。当然可以根据自己的需求自定义。
登录管理员账户,进入【Admin Area】,点击右上角的配置图标,点击下拉菜单的【Appearance】,然后输入标题、内容以及logo等信息即可。

描述的内容可以使用markdown的语法。有个两个logo
的设置。page的logo是显示在页面上的图标。header log是显示在顶端的一个logo。
设置后的界面如下图所示:

升级
使用docker的方式,升级也很方便。
首先关闭正在运行的gitlab。
1 2 | $ docker stop gitlab $ docker rm gitlab |
再拉取最新的gitlab-ce镜像。
1 | $ docker pull gitlab/gitlab-ce:latest |
最后,在按之前的方式重启gitlab。
1 2 3 4 5 6 7 8 9 10 11 | sudo docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 \ --publish 1226:80 \ --publish 23:22 \ --name gitlab \ --restart always \ --volume /srv/gitlab/config:/etc/gitlab \ --volume /srv/gitlab/logs:/var/log/gitlab \ --volume /srv/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest |
如果是通过docker-compose的方式,则通过
1 | $ docker-compose pull |
拉取最新的镜像,然后重启。
1 | $ docker-compose up -d |
总结
本文大体有以下内容:
- GitLab的安装方式:可以直接安装,也可以使用docker安装,建议使用后者。
- 配置:介绍了基于docker安装的一些简单配置,如external_url、ssh端口等等,以及使用 GITLAB_OMNIBUS_CONFIG环境变量或者使用docker-compose的方式提前设置相关项启动。
- 小功能:介绍一些GitLab的小功能,如通过等。
- 升级:介绍GitLab的升级方法。
通过以上介绍的方法,基本就可以使用GitLab了。当然,这只是一些最基础的配置,可以深入学习官方文档做更细化的配置。后续将会介绍GitLab CI的实践方法。
参考
[1] Omnibus GitLab documentation
[2] Configuration options 参数配置
[3] NGINX settings