大家好,我是Mandy。今天分享的主题内容是如何使用GitLab搭建属于自己的代码管理平台。
为什么会单独分享这篇文章呢,相信在很多的开发同学任职的公司中,都用到了gitlab来做代码管理平台,同时结合GitLab的一些自动化功能,实现devops的功能。
GitLab由乌克兰程序员DmitriyZaporozhets和ValerySizov开发,它使用Ruby语言写成。后来,一些部分用Go语言重写。截止2018年5月,该公司约有290名团队成员,以及2000多名开源贡献者。GitLab被IBM,Sony,JülichResearchCenter,NASA,Alibaba,Invincea,O'ReillyMedia,Leibniz-Rechenzentrum(LRZ),CERN,SpaceX等组织使用。
GitLab是由GitLabInc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装方法是参考GitLab在GitHub上的Wiki页面。同时官方也提供了免费版本,可以支持独立安装,也可以支持直接使用官方搭建的web服务。
与GitLab同类的产品也很多,例如国外微软旗下的GitHub,国内的Gitee都属于同类的代码管理平台,同时这些平台也结合了一些企业开发相关的功能。例如项目任务管理、项目自动化构建发布等等功能。
使用GitHub的同学应该知道,GitHub属于国外的网站在访问上经常遇到无法访问或者访问较慢的情况,并且个人是没法直接创建私有仓库,你只能通过创建公开仓库,对于有私有仓库的需求就需要付费使用并且费用还不算低。
对于Gitee来说,属于国内的网站避免了访问的问题,但Gitee是开发部分免费功能,其他的功能是需要收费使用。
基于上述的一些原因,企业也选择GitLab来搭建代码管理平台,同时里面的一些自动化功能也是完全不亚于GitHub、Gitee。对于个人开发者使用GitLab,不仅能够管理自己的代码,同时也能学到GitLab与其他的系统实现一些自动化功能,这将是一个不错的选择。
如何搭建
接下来,我将全面的演示如何在Linux上搭建GitLab。整体来说是非常的简单,整篇文章都是采用Docker来搭建,毕竟现在Docker的使用不管是个人还是企业都是非常主流的技术栈。
这里要特别的说明一下,强烈建议你选择一个高配置的服务器来搭建GitLab,在我个人的测试过程中发现GitLab是非常消耗内存,基本搭建好GitLab就会占用4G的内存,如果你只是在本地搭建用作学习,应该是完全没问题的,毕竟个人的电脑应该没有低于4G内存大小的计算机。
检索官方镜像并拉取到本地
通过docker search xxx
可以查找Docker官方镜像中,关于GitLab的镜像,你会看到如下很多的镜像。有的是一些插件,有的是基于官方镜像构建的镜像。这里还是强烈推荐直接使用官方提供的GitLab镜像。
shell
# 查找gitlab镜像
docker search gitlab
[root@VM-4-9-centos ~]# docker search gitlab
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
bitnami/gitlab-runner 35
bitnami/gitlab-runner-helper 3
alpinelinux/gitlab-runner-helper Helper image container gitlab-runner-helper ... 4
rapidfort/gitlab-ce 12
okteto/gitlab 2
alpinelinux/gitlab-runner Alpine Linux gitlab-runner (supports more ar... 5
drud/gitlab-ce 18
accurics/gitlab-connector 0
domjudge/gitlabci 0
wodby/gitlab Alpine-based GitLab CE container image 0
ustclug/gitlab Dockrized GitLab used by LUG@USTC 0
alpinelinux/gitlab Alpine Linux based Gitlab image 8
itisfoundation/gitlab-runner-docker 0
pnnlmiscscripts/gitlab-runner-operator 0
jitesoft/gitlab-ci-runner Image inheriting from the gitlab runner. I... 0
vulhub/gitlab 0
alpinelinux/gitlab-shell Alpine Linux based gitlab-shell image, provi... 1
wodby/gitlab-nginx Nginx for GitLab CE container image 0
corpusops/gitlabtools https://github.com/corpusops/docker-gitlabto... 0
vulhub/gitlab-cve-2016-9086 gitlab cve-2016-9086 0 [OK]
drud/gitlab-backups 0
gromacs/gitlab-runner 0
wodby/gitlab-runner 0
avenga/gitlab-job 0
osuosl/gitlab-runner-helper 0
接下来拉取官方镜像到本地,直接拉取最新的镜像。
shell
docker pull gitlab/gitlab-ce:latest
拉取好镜像之后,可以查看本地是否拉取到镜像。这里使用docker images
查看本地的镜像有哪些,下面就可以看到gitlab/gitlab-ce的镜像地址,表示我们已经成功拉取到本地。
shel
[root@VM-4-9-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gitlab/gitlab-ce latest df5003a3217c 2 days ago 2.86GB
zmister/mrdoc v6 f4973a0fcd4b 3 months ago 1.34GB
postgres 15.2 bf700010ce28 6 months ago 379MB
openspug/spug-service latest db1e45c81bec 7 months ago 593MB
surveyking/surveyking latest 7445aa54d4c4 12 months ago 157MB
mariadb 10.8.2 51adad759c74 21 months ago 414MB
启动镜像容器
拉取到镜像之后,就可以基于镜像在本地启动一个GitLab容器。这里要说明一点,你再创建容器时,一定要做磁盘挂载和端口映射。不过磁盘挂载很可能容器删除导致数据丢失,端口映射是为了通过宿主机的访问达到访问容器内部的GitLab服务,否则是没法直接访问容器内的服务。
shel
# 启动容器
docker run \
-itd \
-p 9981:80 \
-p 9922:22 \
-v /opt/gitlab/etc:/etc/gitlab \
-v /opt/gitlab/log:/var/log/gitlab \
-v /opt/gitlab/opt:/var/opt/gitlab \
--restart always \
--privileged=true \
--name gitlab \
gitlab/gitlab-ce
上述命令主要的作用是:
1、 run:启动容器命令,这是Docker自带的命令,创建容器时必须使用该命令才能创建容器。
2、-itd:-i参数是以交互模式运行容器,通常与 -t 同时使用命令解释;-t参数是为容器重新分配一个伪输入终端,通常与 -i 同时使用;-d参数是后台运行容器,并返回容器id。
3、-p:是做端口映射,第一个-p是为了将容器内的web端口映射宿主机的端口,这样就能通过宿主机的端口直接访问到容器内的端口,也就是说后面通过浏览器访问GitLab就需要该端口;第二个-p是为了将容器内22端口映射至宿主机9922端口,这是访问ssh的端口,例如后面使用命令git push
代码到GitLab会用到该协议。
4、-v:该参数为了将宿主机的目录和容器内的目录做一个映射,容器内的文件和宿主机实现同步,防止数据丢失,哪怕是后续你容器被删掉,宿主机的文件保持存在,数据就不会丢失。
5、--restart:保持容器自动启动。比如你关闭了Docker服务,容器也会随着退出,再次启动Docker服务时,容器会自动启动,不需要你手动去启动容器。
6、--privileged:该参数是为了让容器内获取到宿主机的root权限。
7、--name:该参数是为了给容器取一个名称,记住这个名称要不能重复。例如你本地有一个名字叫做A的容器,就不能取同样名称的容器。
8、gitlab/gitlab-ce:该参数是表示容器从哪一个镜像中创建,前面我们拉取了官方镜像到本地仓库,因此会自动从本地的镜像中去创建。如果你没拉取镜像到本地,此时会自动去Docker官方镜像仓库中拉取到本地。
此时,我们的GitLab容器已经创建完毕,但要访问容器,还需要你修改一些其他的配置。这里推荐直接在容器中去修改配置,如果直接在宿主机修改,可能出现同步到容器中存在延迟,导致访问出现问题。
修改配置
在修改配置之前,你需要明确如下几点:
1、访问方式:如果你是想通过域名的方式访问,你需要解析一个域名,如果不需要直接使用配置成宿主机的IP地址。我这里假设域名是a.baidu.com。
2、ssh方式:ssh适用于代码同步,这里也需要配置成域名或者IP的方式。
she
#第一步是进入到容器内部,gitlab可以写成你容器的id
docker exec -it gitlab /bin/bash
#修改gitlab.rb的配置文件
vi /etc/gitlab/gitlab.rb
#gitlab访问地址,可以写域名。如果端口不写的话默认为80端口
external_url 'http://192.168.1.194'
或者是
external_url 'a.baidu.com'
#ssh主机ip
gitlab_rails['gitlab_ssh_host'] = '192.168.1.194'
#ssh连接端口
gitlab_rails['gitlab_shell_ssh_port'] = 9922
修改好之后,在容器中重启gitlab-ctl reconfigure
配置,并且使用gitlab-ctl restart
来重启GitLab服务。此时就可以直接使用IP的方式访问GitLab,如果你配置的是域名,还需要在Linux系统中使用域名配置,做端口代理访问到GitLab服务。假设你用的是NGINX做web服务,你需要做如下的配置。
shell
server{
listen 80;
server_name a.baidu.com;
location / {
proxy_pass http://127.0.0.1:9981;
}
}
配置好域名之后,重启NGINX服务nginx -s reload
就可以通过域名的方式访问。
注意事项
在网上有的文章会提到如下的配置操作:
shell
vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
gitlab:
host: 192.168.1.194
port: 9980
https: false
但实际测试下来,并非一定要做这一步操作。在你上面修改好配置之后,执行``gitlab-ctl reconfigure命令重启后,上面的
gitlab.yml`文件会自动帮你同步配置。
账号修改
当你能访问搭建好的GitLab服务,并且能够访问,但一开始会让你进行登录注册,GitLab默认的超级管理员账号是root
,此时是需要你修改默认的密码。
shell
# 进入容器内部
docker exec -it gitlab /bin/bash
# 进入控制台
gitlab-rails console -e production
# 查询id为1的用户,id为1的用户是超级管理员
user = User.where(id:1).first
# 修改密码为gitlab001
user.password='gitlab001'
# 保存
user.save!
# 退出
exit
此时你使用root账号,并且密码是gitlab001就可以正常访问了。
自此GitL按服务就算搭建完成,你就可以直接使用了。更多的功能,你也可以直接进行摸索使用。