image.png 基于Git实现的在线代码仓库托管软件 你可以用gitlab自己搭建一个类似于Github一样的系统,一般用于在企业、学校等内部网络搭建git私服。 功能:Gitlab 是一个提供代码托管、提交审核和问题跟踪的代码管理平台。对于软件工程质量管理非常重要。 版本:GitLab 分为社区版(CE) 和企业版(EE)

Gitlab的服务构成

nginx 静态web服务器
gitlab-shell 用于处理Git命令和修改authorized keys列表 (Ruby语言)
gitlab-workhorse 轻量敏捷级的反向代理服务器,它会处理一些大的HTTP请求,比如

  • 文件上传
  • 文件下载
  • git push
  • gitpull
  • 和Git包下载
  • 其它请求会反向代理到GitLab Rails应用,即反向代理给后端的unicorn (go语言)

logrotate 日志文件管理工具
postgresql 数据库
redis 缓存数据库
sidekiq 用于在后台执行队列任务(异步执行) (Ruby语言)
unicorn An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的,主要使用Ruby编写 (Ruby Web Server)

GitLab安装
配置 建议CPU2核,内存4G以上, 更多版本的安装,请查看官方源地址 image.png

使用yum安装gitlab

一. 安装之前

如果执行 步骤二 时因为国内下载gitlab-ee太慢,可以使用清华大学gitlab-ee镜像
新建 /etc/yum.repos.d/gitlab-ce.repo 内容为

  1. [gitlab-ce]
  2. name=Gitlab CE Repository
  3. baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
  4. gpgcheck=0
  5. enabled=1

安装和配置必要的依赖项

  1. #1.1 在CentOS 8(和RedHat 8)上,以下命令还将在系统防火墙中打开HTTP,HTTPS和SSH访问
  2. #所过没有dnf包管理器,请安装 yum -y install dnf
  3. sudo dnf install -y curl policycoreutils openssh-server
  4. sudo systemctl enable sshd && systemctl start sshd
  5. #1.2 安装Postfix以发送通知电子邮件
  6. #在安装Postfix的过程中,可能会出现一个配置屏幕。选择“ Internet网站”,
  7. #然后按Enter。使用服务器的外部DNS作为“邮件名”,
  8. #然后按Enter。如果出现其他屏幕,请继续按Enter接受默认设置
  9. sudo dnf -y install postfix
  10. sudo systemctl enable postfix && systemctl start postfix
  11. #1.3 打开防火墙
  12. #sudo systemctl status firewalld #检查是否需要打开防火墙
  13. sudo firewall-cmd --permanent --add-service=http
  14. sudo firewall-cmd --permanent --add-service=https
  15. sudo systemctl reload firewalld

⚠️注意: 如果要使用其他解决方案发送电子邮件,请跳过此步骤,并在安装GitLab之后配置 外部SMTP服务器

二. 添加GitLab软件包存储库并安装软件包

  1. #2.1 添加GitLab软件包存储库
  2. curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
  3. #2.2 安装gitlab-ee
  4. #将"url访问地址"更改为您要访问GitLab实例的URL就行了,比如 207.148.112.68 或 https://gitlab.example.com
  5. sudo EXTERNAL_URL="url访问地址" dnf install -y gitlab-ee

三. 浏览到主机名并登录

首次访问时,您将被重定向到密码重置屏幕。提供初始管理员帐户的密码,您将被重定向回登录屏幕。使用默认帐户的用户名root登录。
有关安装和配置的详细说明,请参见官方的文档

快速部署gitlab

  1. sudo dnf install -y curl policycoreutils openssh-server
  2. sudo systemctl enable sshd && systemctl start sshd
  3. #sudo systemctl status firewalld #检查是否需要打开防火墙
  4. sudo firewall-cmd --permanent --add-service=http
  5. sudo firewall-cmd --permanent --add-service=https
  6. sudo systemctl reload firewalld
  7. sudo dnf -y install postfix
  8. sudo systemctl enable postfix && systemctl start postfix
  9. curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
  10. #设置url访问地址
  11. sudo EXTERNAL_URL="url访问地址" dnf install -y gitlab-ee

配置域名

vim /var/opt/gitlab/nginx/conf/gitlab-http.conf

  1. # 外网访问的端口,如果服务器已经有服务器占用了80,那么这里可以改成其它
  2. listen *:8888;
  3. server_name gitlab.test.domain.com;
  4. set $http_host_with_default "gitlab.test.domain.com:8888";

补充说明:因为编译gitlab的配置 /etc/gitlab/gitlab.rb 时会重新生成这个自定义nginx 配置,所以只要 gitlab 的配置配得好,上面的nginx其实不需要自定义的

修改密码

  1. gitlab-rails console production
  2. user = User.where(id:1).first
  3. user.password='123456'
  4. user.save!

GitLab备份和恢复

备份

  1. # 可以将此命令写入crontab,以实现定时备份
  2. /usr/bin/gitlab-rake gitlab:backup:create
  3. #sudo gitlab-rake gitlab:backup:create STRATEGY=copy

备份的数据会存储在/var/opt/gitlab/backups,用户通过自定义参数 gitlab_rails[‘backup_path’],改变默认值。

恢复

  1. # 停止unicorn和sidekiq,保证数据库没有新的连接,不会有写数据情况
  2. sudo gitlab-ctl stop unicorn
  3. sudo gitlab-ctl stop sidekiq
  4. # 进入备份目录进行恢复,1476900742为备份文件的时间戳
  5. cd /var/opt/gitlab/backups
  6. gitlab-rake gitlab:backup:restore BACKUP=1476900742
  7. cd -
  8. # 启动unicorn和sidekiq
  9. sudo gitlab-ctl start unicorn
  10. sudo gitlab-ctl start sidekiq

GitLab配置文件修改

  1. vim /etc/gitlab/gitlab.rb

gitlab基本配置

  1. #外部访问url(经过编译后,自动将这个配置编译到nginx配置,nginx就无需配置了)
  2. external_url 'http://gitlab.test.domain.com:8888'
  3. #默认值就是8080。如果端口被占用,可将8080修改为其它(例如:9090)
  4. unicorn['port'] = 8080

gitlab发送邮件配置

  1. gitlab_rails['smtp_enable'] = true
  2. gitlab_rails['smtp_address'] = smtp.exmail.qq.com
  3. gitlab_rails['smtp_port'] = 25
  4. gitlab_rails['smtp_user_name'] = huangdc@domain.com
  5. gitlab_rails['smtp_password'] = "smtp password"
  6. gitlab_rails['smtp_authentication']= plain"
  7. gitlab_rails['smtp_enable_starttls_auto']= true
  8. gitlab_rails['gitlab_email_from']= 'huangdc@domain.com'
  9. gitlab_rails['gitlab_email_reply_to']= ‘noreply@domain.com'

服务器修改过ssh端口的坑(需要修改配置ssh端口)

  1. #修改过ssh端口,gitlab中项目的的ssh地址,会在前面加上协议头和端口号“ssh://git@gitlab.domain.com:55725/huangdc/test.git”
  2. gitlab_rails['gitlab_shell_ssh_port'] = 55725

配置生效

  1. #使配置生效
  2. gitlab-ctl reconfigure
  3. #重新启动GitLab
  4. gitlab-ctl restart

GitLab常用命令

  1. gitlab-ctl start # 启动所有 gitlab 组件;
  2. gitlab-ctl stop # 停止所有 gitlab 组件;
  3. gitlab-ctl restart # 重启所有 gitlab 组件;
  4. gitlab-ctl status # 查看服务状态;
  5. vim /etc/gitlab/gitlab.rb # 修改gitlab配置文件;
  6. gitlab-ctl reconfigure # 重新编译gitlab的配置;
  7. gitlab-rake gitlab:check SANITIZE=true --trace # 检查gitlab;
  8. gitlab-ctl tail # 查看日志;
  9. gitlab-ctl tail nginx/gitlab_access.log

注意:执行 reconfigure 命令会把gitlab的nginx组件的配置还原,导致自定义修改的端口以及域名等都没有了

常用目录

  1. 日志地址:/var/log/gitlab/ # 对应各服务的打印日志
  2. 服务地址:/var/opt/gitlab/ # 对应各服务的主目录

查看gitlab版本

  1. cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

新建项目

使用root用户登录进gitlab会后,点击“new project“创建一个项目,比如项目命名为“kuaijiFirstProject”。
然后会发现,硬盘上已经生成了一个git文件:

  1. /var/opt/gitlab/git-data/repositories/root/kuaijiFirstProject.git

汉化

https://gitlab.com/xhang/gitlab.git

gitlab的使用

  1. ssh -T -p 55725 git@gitlab.domain.com

注意:以上这条 ssh 命令测试通过,未必代表就能 git clone 代码,git clone 代码需要执行命令的账户有写权限,如果是普通用户用 sudo git clone 那么 git 就会使用的 root 账号的 Private Key。

1.登录

管理员会为使用者开通账号并设置权限

2.使用者在客户端生成ssh key

参考文章: http://www.jianshu.com/p/142b3dc8ae15

  1. ssh-keygen -t rsa -C "huangdc@domain.com"

3.将公钥的内容copy到gitlab用户设置里面的“SSH Keys”

Windows: clip < ~/.ssh/id_rsa.pub
Mac: pbcopy < ~/.ssh/id_rsa.pub
GNU/Linux (requires xclip): xclip -sel clip < ~/.ssh/id_rsa.pub

4.测试ssh连接

  1. #标准测试代码:ssh -T git@gitlab.com
  2. ssh -T -p 55725 git@gitlab.domain.com #修改过端口号的测试代码

如果连接成功的话,会出现以下信息:

  1. Welcome to GitLab, huangdc!

说明:实际上执行这条ssh命令,所使用的远程服务器的用户是git,这个用户是在安装gitlab的时候生成的,所有使用gitlab服务器的ssh客户端,都是使用git这个用户。在这里的用户“huangdc”是通过gitlab创建的,是用于gitlab的权限管理,也用作标识提交代码的开发者信息,不要跟ssh的用户混淆了。

如何使用多个SSH公钥(自己电脑在使用多个代码仓库)

原理其实是:因为每个仓库都需要 ssh 连接,而 ssh 命令默认是使用 .ssh 目录下面的私钥去连接代码仓库,所以我们可以在 .ssh/config 目录里面针对不同的仓库域名重定义它的私钥。

例子如下:

编辑文件: vim /Users/david/.ssh/config

  1. Host gitlab.domain.com
  2. IdentityFile /Users/david/.ssh/id_rsa

命令行环境下初始化项目

  1. 首先在 gitlab 上面创建一个空的代码仓库,得到仓库地址如下:

    1. ssh://git@gitlab.domain.com:55725/huangdc/test.git
  2. 在本地初始化仓库、提交代码、推送到远程 master 分支。

    1. git clone ssh://git@gitlab.domain.com:55725/huangdc/test.git
    2. cd test
    3. touch README.md
    4. git add README.md
    5. git commit -m "add README"
    6. git push -u origin master

命令行环境下迁移旧的项目

  1. 首先在 gitlab 上面创建一个空的代码仓库,得到仓库地址如下:

    1. #注意:已存在代码的旧项目只能推送到空的远程代码仓库
    2. ssh://git@gitlab.domain.com:55725/dev/memberApi.git
  2. 本地初始化项目、关联远程仓库、推送到远程仓库

    1. cd /Users/david/work_www/memberApi
    2. git init
    3. git remote add origin ssh://git@gitlab.domain.com:55725/dev/memberApi.git
    4. git push -u origin master

SourceTree的安装和打开

  1. 官网下载链接:https://www.sourcetreeapp.com/
  2. 打开SourceTree之后,需要登录Atlassian账号来激活SourceTree。可以使用Google账号直接关联登录。
  3. 登录后还需要一些设置,以最简单的方式跳过就行

502报错排查

1.权限

  1. chmod -R 755 /var/log/gitlab //增加权限

2.端口被占用

  1. vim /etc/gitlab/gitlab.rb //编辑配置文件
  2. external_url '*****:*****' //更改端口

3.内存不足

  1. 安装GitLab需要至少4G的内存