Gitlab安装及使用

in DevOps with 0 comment

Gitlab是基于Ruby on Rails开源的项目管理和代码托管平台,可以很方便的管理公司私有库,所以通常是自建Gitlab。下面来看下Gitlab服务的安装。

官方硬件需求至少需要4GB内存。在CentOS 7安装为例,安装Gitlab。

安装配置依赖包

Gitlab服务需要系统防火墙打开HTTP, HTTPSSSH访问。这些依赖通常是通用的,运维人员可能已经安装好

sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld

安装邮局服务

我们可以安装Postfix进行邮件通知,注意DNS解析。如果安装有其他邮局服务,可以跳过。此外,安装Gitlab后,还需配置smtp。

sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix

安装Gitlab软件包

我们可以使用官方提供的一键脚本安装包,安装最新稳定版

//输出到文件里是为了看下下载的脚本内容
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh > rpm.sh
chmod +x rpm.sh
./rpm.sh

或者在线下载官方包进行安装

wget -O gitlab.rpm https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-12.10.4-ce.0.el7.x86_64.rpm/download.rpm
rpm -ivh gitlab.rpm
#可以查看安装了哪些的文件,看到gitlab安装在/opt/gitlab目录下
#rpm -ql gitlab-ce-12.10.4-ce.0.el7.x86_64

也可以使用软件源安装

# 配置yum源
cat << EOF >> /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6
Repo_gpgcheck=0
Enabled=1
Gpgkey=https://packages.gitlab.com/gpg.key
EOF

#更新本地yum缓存
sudo yum makecache

#安装Gitlab-ce社区版
sudo yum install gitlab-ce        #自动安装最新版
sudo yum install gitlab-ce-x.x.x    #安装指定版本

我们还可以将gitlab安装在docker、kubernetes等容器服务里

修改配置

默认配置文件路径:/etc/gitlab/gitlab.rb,修改配置后,需要重启服务方可生效。

配置URL
external_url 'http://gitlab.wenqy.com:80'
nginx['listen_port'] = 80

默认nginx 监听的是80 端口,如果nginx 修改端口,external_url 里面也必须带端口。gitlab安装内置默认用户root,首次访问external_url时,需要root用户登陆,设置密码。如果配置不修改重启,可能会出现502错误。

配置unicorn端口

unicorn是Ruby语言领域的一款http server软件。默认端口是8080。如果是非独享服务器,Tomcat默认端口也是8080,容易发生端口占用冲突,也会导致502错误。此时,可以需要unicorn端口。

unicorn['port'] = 8901
配置SSH

新暴露了ssh的端口8902

gitlab_rails['gitlab_ssh_host'] = '192.168.1.34'
gitlab_rails['gitlab_shell_ssh_port'] = 8902

修改ssh协议后,/etc/ssh/sshd_config配置文件新增ssh端口

#Port 22
Port 22
port 8902

防火墙开放端口

iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 8902 -j ACCEPT
iptables-save
iptables -nL --line-number

重启ssh服务

systemctl restart sshd.service
配置邮箱

填写配置好的smtp信息

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.wenqy.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "wenqy@wenqy.com"
gitlab_rails['smtp_password'] = "123456"
gitlab_rails['smtp_domain'] = "smtp.uf-tobacco.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'none'
gitlab_rails['smtp_ssl'] = false
gitlab_rails['smtp_force_ssl'] = false

gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_display_name'] = 'Gitlab'
gitlab_rails['gitlab_email_from'] = 'wenqy@wenqy.com'

重启后进入console测试邮箱发送

gitlab-rails console
#进入控制台,然后发送邮件
Notify.test_email('wen.qy@qq.com', '邮件标题', '邮件正文').deliver_now
重启gitlab

修改配置后,重启生效

#重器gitlab配置服务
sudo gitlab-ctl reconfigure
#重启gitlab
gitlab-ctl restart 

常用命令

gitlab-ctl start #启动全部服务
gitlab-ctl restart #重启全部服务
gitlab-ctl stop #停止全部服务
gitlab-ctl restart nginx #重启单个服务
gitlab-ctl status #查看全部组件的状态
gitlab-ctl show-config #验证配置文件
gitlab-ctl uninstall #删除gitlab(保留数据)
gitlab-ctl cleanse #删除所有数据,重新开始
gitlab-ctl tail <svc_name>  #查看服务的日志
gitlab-rails console production #进入控制台 ,可以修改root 的密码
gitlab-ctl --help #查看gitlab-ctl命令的帮助信息

汉化

如果需要汉化,汉化包与gitlab软件包版本要一致,否则可能发送意想不到的错误,汉化之前更应该先备份gitlab数据。未尝试,不建议汉化。

# 暂停gitlab
gitlab-ctl stop
# 查看gitlab版本
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
12.8.1-ee
# 下载对应版本汉化包
git clone https://gitlab.com/xhang/gitlab.git
# 备份
cp -r /opt/gitlab/embedded/service/gitlab-rails{,.ori}
# 汉化包覆盖
cp -rf gitlab-10-3-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/
# 启动
gitlab-ctl start

安装git

Gitlab是基于git做版本控制,访问gitlab需要安装git,在linux用yum源安装

# 修改yum源,指向163
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载对应版本repo文件, 放入/etc/yum.repos.d/
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
# 如果yum命令直接卡死,造成rpm数据库异常,杀进程
# 删除rpm数据文件 
rm -f /var/lib/rpm/__db.00*
# 重建rpm数据文件 
rpm -vv --rebuilddb
# 清除缓存
yum clean all
yum makecache
# 安装git
yum -y install git

Groups

一个 GitLab 的组是一些项目的集合,连同关于多少用户可以访问这些项目的数据。 每一个组都有一个项目命名空间(与用户一样),所以如果一个叫 training 的组拥有一个名称是 materials 的项目,那么这个项目的 url 会是 http://server/training/materials

image-20200811224510385

每一个组都有许多用户与之关联,每一个用户对组中的项目以及组本身的权限都有级别区分。 权限的范围从 “访客”(仅能提问题和讨论) 到 “拥有者”(完全控制组、成员和项目)。 权限的种类太多以至于难以在这里一一列举,不过在 GitLab 的管理界面上有帮助链接。

项目

一个 GitLab 的项目相当于 git 的版本库。 每一个项目都属于一个用户或者一个组的单个命名空间。 如果这个项目属于一个用户,那么这个拥有者对所有可以获取这个项目的人拥有直接管理权; 如果这个项目属于一个组,那么该组中用户级别的权限也会起作用。

image-20200811224833453

每一个用户账号都有一个 命名空间 ,即该用户项目的逻辑集合。 如果一个叫 wenqy 的用户拥有一个名称是 springcloudstudy的项目,那么这个项目的 url 会是 http://server/wenqy/springcloudstudy

每一个项目都有一个可视级别,控制着谁可以看到这个项目页面和仓库。 如果一个项目是 私有 的,这个项目的拥有者必须明确授权从而使特定的用户可以访问。 一个 内部 的项目可以被所有登录的人看到,而一个 公开 的项目则是对所有人可见的。 注意,这种控制既包括 git fetch 的使用也包括对项目 web 用户界面的访问。

配置SSH Keys

我们需要经常免登录git账号进行推送代码,这时需要配置SSH Keys,将生成的RSA 公钥填入。

image-20200811225630116

当通常情况下,我们已经在GitHub、码云上已经分配了账号,可能是相同的ID,也可能在一个平台上有多个账号,我们可能需要区分不同的平台和账号和一个平台的多个账号。我们可以看下同时配置GitHub两个账号,用命令生成公钥私钥对

ssh-keygen -t rsa -C "one@github.com"

ssh-keygen -t rsa -C "two@github.com"

运行命令后不要一路回车,分别在第一次对话出现“Enter file in which to save the key”的时候输入不同的文件名,避免覆盖。两份包含私钥和公钥的4个文件,后缀为.pub的文件为公钥文件。linux或mac用户一定要在~/.ssh路径下运行命令行,不然生成的文件不会出现在当前目录,Windows用户则在“C:\Users\用户名\.ssh”目录下运行命令行。

配置config文件

.ssh目录下创建config文件,在config文件中添加以下内容:

#github server one
Host one.github.com
Hostname github.com
User one
PreferredAuthentications publickey
IdentityFile C:\\Users\\xmn-wenqy.HELLO-WORLD\\.ssh\\id_rsa
#github server two
Host two.github.com
Hostname github.com
User two
PreferredAuthentications publickey
IdentityFile C:\\Users\\xmn-wenqy.HELLO-WORLD\\.ssh\\id_rsa_cloud

每个账号单独配置一个Host,每个Host要取一个别名,一般为每个Host主要配置HostName和IdentityFile两个属性,配置完保存即可。Host的名字可以自定义名字,不过这个会影响git相关命令,例如:Host one.github.com这样定义的话,使用命令git clone git@one.github.com:one/project.git,git@后面紧跟的名字改为one.github.com

为仓库设置局部的用户名和邮箱

# 取消全局 用户名/邮箱 配置
git config --global --unset user.name
git config --global --unset user.email
    
# 单独为每个repo设置 用户名/邮箱
git config user.name "one_name" ; git config user.email "one_email"
git config user.name "two_name" ; git config user.email "two_email"

配置好SSH Keys后就可以免登录推送代码到gitlab了。

钩子

GitLab 在项目和系统级别上都支持钩子程序。 对任意级别,当有相关事件发生时,GitLab 的服务器会执行一个包含描述性 JSON 数据的 HTTP 请求。 这是自动化连接你的 git 版本库和 GitLab 实例到其他的开发工具,比如 CI 服务器,聊天室,或者部署工具的一个极好方法。

对应root超级用户,有更多的管理权限,有管理面板,可以对使用者、项目进行管理和统计分析等等。

架构

gitlab 依赖的组件默认安装在/var/opt/gitlab/目录下

architecture_simplified

Gitlab利用Nginx或者Apache作为web前端代理到Unicorn web服务端。默认情况下,Unicorn和前端之间的通信是通过Unix domain socket进行的,但也支持通过TCP转发请求。利用Sidekiq从Redis队列中拉取job并处理,是Ruby后台任务处理器;利用Redis缓存作业、会话等信息;利用PostgreSQL做持久化数据库,保存用户、权限、issues等元信息;利用GitLab Shell接收SSH请求,GitLab Shell通过Gitaly访问存储库,为Git对象提供服务,并与Redis通信,将作业提交给Sidekiq供GitLab处理。GitLab Shell通过GitLab API查询以确定授权和访问;GitalyGitLab Shell和GitLab web app执行Git操作,并为GitLab web app提供一个API,以从Git获取属性(例如titile、、branches、tags、其他元数据),并获取blob(例如diff、commits、files);GitLab Workhorse是由GitLab设计的程序,可帮助缓解Unicorn的压力,它旨在充当智能反向代理,以帮助加快整个GitLab的运行速度。

此外,官方推荐服务器CPU核数至少4核,存储空间不少于gitlab所有存储库之和,磁盘最好采用逻辑卷管理方便扩展硬盘驱动器,gitlab占用太多内存,容易导致服务器崩溃,可以启用swap分区,缓解内存压力,例如,阿里云ECS默认是没有开启swap的,这值得注意一下。日志目录默认安装在/var/log/gitlab路径下。还应该注意Gitlab的性能优化、数据备份和迁移

Gitlab安装和部署还是相对容易的,只是依赖的组件相对庞杂,太过吃内存。对于熟悉Git和GitHub的人也是极易上手,甚至是无感知使用的。

参考

https://about.gitlab.com/install/#centos-7

https://gitlab.com/gitlab-org/gitlab-foss/

https://packages.gitlab.com/gitlab/gitlab-ce

https://docs.gitlab.com/omnibus/settings/smtp.html

https://docs.gitlab.com/ee/install/requirements.html

https://docs.gitlab.com/ce/development/architecture.html

https://blog.csdn.net/ouyang_peng/article/details/84066417 解决GitLab内存消耗大的问题