GitLab安装记录

[[../容器相关/Docker/Docker]]安装

拉取gitlab镜像:

docker pull gitlab/gitlab-ce:lastest

# 创建目录
mkdir -p /data/gitlab/config /data/gitlab/logs /data/gitlab/data

##### 配置文件:/data/gitlab/config/gitlab.rb
# 启动容器:官方推荐最低配置2核4G,低于2核服务无法启动。我在这里限制了内存使用量,最高2G,swap也是2G,也就是理论上最高能使用4G内存,
docker run -d -p 81:80 -p 24822:22 -m 2g --memory-swap=2g --name gitlab -v /etc/localtime:/etc/localtime:ro -v /data/gitlab/config:/etc/gitlab -v  /data/gitlab/logs:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

以下为通过yum安装说明

配置gitlab源 到/etc/yum.repos.d目录下新建gitlab-ce.repo文件,

[gitlab-ce] 
name=gitlab-ce 
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7 
repo_gpgcheck=0 
gpgcheck=0 
enabled=1 
gpgkey=https://packages.gitlab.com/gpg.key 

安装gitlab

yum makecache
yum install -y gitlab-ce
gitlab-ctl reconfigure

服务控制 启动 | 重启 | 停止

gitlab-ctl start | restart | stop

启动后CPU 内存占用过高的处理:默认会使用所有CPU核心,正常不需要这么多,可以适当调整 修改/etc/gitlab/gitlab.rb中的unicorn值,取消注释 unicorn[‘worker_processes’] = 2 适当修改CPU核心使用数量,最小值为2 官方文档

配置SMTP发送邮件

我用的是腾讯企业邮箱,注释部分请参考对应邮件系统设置 在/etc/gitlab/gitlab.rb中的smtp段增加如下内容

gitlab_rails[‘smtp_enable’] = true
gitlab_rails[‘smtp_address’] = “smtp.exmail.qq.com”
gitlab_rails[‘smtp_port’] = 465
gitlab_rails[‘smtp_user_name’] = “[email protected]
gitlab_rails[‘smtp_password’] = “12345678”
gitlab_rails[‘smtp_domain’] = “smtp.exmail.qq.com”
gitlab_rails[‘smtp_authentication’] = “login”
gitlab_rails[‘smtp_enable_starttls_auto’] = true
gitlab_rails[‘smtp_tls’] = false //腾讯企业邮箱没有该功能,所以是false
gitlab_rails[‘smtp_ssl’] = true //腾讯企业邮箱支持SSL,需要开启
gitlab_rails[‘gitlab_email_from’] = ‘[email protected]’ //发送显示名称
gitlab_rails[‘gitlab_email_reply_to’] = ‘[email protected]’//回复显示地址

改完配置文件需要关闭服务执行reconfigure命令,然后再重启服务

gitlab-ctl stop
gitlab-ctl reconfigure
gitlab-ctl start

可以通过以下命令测试是否配置成功

gitlab-rails console
	> Notify.test_email('[email protected]', '邮件标题', '邮件内容').deliver_now

配置通过nginx代理访问 因为本身通过yum安装就会一并安装很多服务,而且会自带安装一个nginx服务。如果服务器本身还有其它服务,特别是80端口被占用的情况下,就需要对配置文件进行修改,尽量让外网不添加额外端口 继续修改/etc/gitlab/gitlab.rb配置文件,找到external_url 和nginx[‘listen_port’] =这两个配置,按如下进行设置

external_url 'http://gitlab.zizi.com.cn'    //对外访问的URL
nginx['listen_port'] = 5080        //gitlab自带的nginx端口修改
prometheus['enable'] = false    # 禁用prometheus监控信息收集,减少空间占用

注:如果不想通过nginx再做一次代理,可以不修改nginx[‘listen_port’] = 这个配置,只修改external_url ‘’,例如 external_url 'http://gitlab.zizi.com.cn:5080' //端口号跟其它服务不冲突即可。这样访问就要加端口号 改完配置文件同样需要关闭服务执行reconfigure命令,然后再重启服务

gitlab-ctl stop
gitlab-ctl reconfigure
gitlab-ctl start

在用来做外网访问的nginx服务上增如下配置,实现外网访问

server {
   listen 80;
   server_name    gitlab.com
   location / {
	   proxy_pass http://127.0.0.1:5080;
   }
}

启用SSL

mkdir -p /etc/gitlab/ssl
cd /etc/gitlab/ssl
openssl req -newkey rsa:2048 -x509 -nodes -days 3650 -out gitlab.crt -keyout gitlab.key		# 在生成证书的过程中要准确填写域名信息。

修改 gitlab.rb

external_url 'https://gitlab.domain.com'
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.key"

如果是以docker方式运行,将证书挂载到容器内即可

重新配置并重启服务

gitlab-ctl stop && gitlab-ctl reconfigure && gitlab-ctl restart

记录真实IP

修改gitlab.rb配置文件,添加下面内容然后重启

nginx['real_ip_trusted_addresses'] = ['127.0.0.1','172.16.37.0/24']
nginx['real_ip_header'] = 'X-Forwarded-For'
nginx['real_ip_recursive'] = 'on'
...
...
nginx['proxy_set_headers'] = {
  "Host" => "$http_host_with_default",
  "X-Real-IP" => "$remote_addr",
  "X-Forwarded-For" => "$proxy_add_x_forwarded_for",
  "X-Forwarded-Proto" => "https",
  "X-Forwarded-Ssl" => "on",
  "Upgrade" => "$http_upgrade",
  "Connection" => "$connection_upgrade"
}

Gitlab 创建备份

使用Gitlab一键安装包安装Gitlab非常简单, 同样的备份恢复与迁移也非常简单. 使用一条命令即可创建完整的Gitlab备份: 12.1以及之前的版本用以下命令备份

gitlab-rake gitlab:backup:create

12.2以及之后的版本用以下命令备份

gitlab-backup create

使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1519370071_2018_02_23_10.1.0_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分. Gitlab 修改备份文件默认目录 你也可以通过修改/etc/gitlab/gitlab.rb来修改默认存放备份文件的目录:

gitlab_rails['backup_path'] = '/mnt/backups'

/mnt/backups修改为你想存放备份的目录即可, 修改完成之后使用gitlab-ctl reconfigure命令重载配置文件即可

Gitlab 自动备份

也可以通过crontab使用备份命令实现自动备份:

crontab -e

加入以下, 实现每天凌晨2点进行一次自动备份:

0 2 */1 * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create # 版本小于等于12.1
0 2 */1 * * /opt/gitlab/bin/gitlab-backup create # 版本大于等于12.2

GitLab备份寿命管理

GitLab自带备份寿命管理,可以在gitlab.rb配置文件中通过如下配置实现:

   ## Limit backup lifetime to 7 days - 604800 seconds
   gitlab_rails['backup_keep_time'] = 604800

或者通过定时任务来实现

0 0 * * * find /var/opt/gitlab/backups/ -f -regex ".*.\(tar\)" -mtime +7 -exec rm -rf {} \;

Gitlab 恢复

同样, Gitlab的从备份恢复也非常简单: 停止相关数据连接服务

gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq

# 从1519370071_2018_02_23_10.1.0编号备份中恢复
gitlab-rake gitlab:backup:restore BACKUP=1519370071_2018_02_23_10.1.0

# 启动Gitlab
gitlab-ctl start

Gitlab迁移

跟恢复操作差不多,先升级至最新版本,以防新服务器版本过高导致无法恢复。以下操作是基于docker方式部署的迁移操作

docker pull gitlab/gitlab-ce:latest
docker stop gitlab
docker run -d -p 80:80 -p 22:22 -m 2g --memory-swap=2g --name gitlab -v /etc/localtime:/etc/localtime:ro -v /data/gitlab/config:/etc/gitlab -v  /data/gitlab/logs:/var/log/gitlab -v /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest 

在升级完的容器服务器上执行如下命令,备份gitlab,会将备份放在gitlab/data/backups目录下

docker exec -t gitlab gitlab-rake gitlab:backup:create

在新服务器上先创建一个新的容器,保证跟旧服务版本一至,将之前的备份文件放到gitlab/data/backups目录下,然后用

docker exec -it gitlab bash		#进入容器
cd /var/opt/gitlab/backups		#切换到备份目录
chown git. * 					#修改备份文件权限

退出容器后后执行如下命令,恢复备份

docker exec -it gitlab gitlab-rake gitlab:backup:restore

迁移如同备份与恢复的步骤一样, 只需要将老服务器/var/opt/gitlab/backups目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups即可(如果你没修改过默认备份目录的话). 但是需要注意的是新服务器上的Gitlab的版本必须与创建备份时的Gitlab版本号相同. 比如新服务器安装的是最新的7.60版本的Gitlab, 那么迁移之前, 最好将老服务器的Gitlab 升级为7.60在进行备份.

修改git 远程仓库地址,如果迁移了gitlab,导致访问地址发生了改变,可以通过如下方法进行修改 1、用命令修改

git remote rm origin
git remote add origin ssh://[email protected]/test.git

2、直接修改config文件,修改仓库根目录下.git/config文件,将其中的地址修改为新地址即可


GitLab Docker版本备份脚本

#! /bin/bash

gitlab_name="dev-gitlab"
gitlab_dir=/data/gitlab
backup_dir=/data/gitlab/backups

docker exec -t gitlab gitlab-rake gitlab:backup:create 2>&1 >> ${backup_dir}/$(date +%F-%H-%M-%S).log

cd ${gitlab_dir} && tar czf ${backup_dir}/${gitlab_name}_config_$(date +%F-%H-%M-%S).tar.gz config

find %{backup_dir}/ -type f -regex ".*.\(tar\|gz\|log\)" -mtime +7 -exec rm -rf {} \;

gitlab docker版本自动备份并备份到阿里云OSS脚本

**需要有OSS资源 需要安装oss命令行工具,且有相应的访问权限,具体参考文档 https://help.aliyun.com/document_detail/50452.html?spm=5176.11065259.1996646101.searchclickresult.6ee48996ACufMd **

#! /bin/bash

DATE=`date +%F-%H-%M-%S`
# OLDFILE=`ossutil64 ls oss://ser-storage | grep tar | head -n 1 | awk -F ' ' '{print $NF}'`

# 执行gitlab备份命令,并记录下备份过程日志
docker exec -t gitlab gitlab-rake gitlab:backup:create 2>&1 >> /data/gitlab/data/backups/$DATE.log

# 如果备份命令成功,则将备份文件上传至OSS,并检查OSS上备份文件数量是否超过指定值,如果超过,则删除最旧的备份。
if [ $? -eq 0 ];
then
	FILENAME=`ls -lt /data/gitlab/data/backups/ | awk -F ' ' ' {print $NF}' | grep "gitlab_backup.tar" | head -n 1`
	echo -e "开始上传备份$FILENAME至OSS...\n" >> /data/gitlab/data/backups/$DATE.log
	ossutil64 cp /data/gitlab/data/backups/$FILENAME oss://ser-storage/ >> /data/gitlab/data/backups/$DATE.log
	echo -e "备份$FILENAME上传至OSS成功!\n" >> /data/gitlab/data/backups/$DATE.log
	cd /data/gitlab/data/backups/
	LOCALFILE=`ls -l | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}'`
	ls -l | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}' | xargs rm -rf
	echo -e "删除本地备份文件: \n$LOCALFILE" >> /data/gitlab/data/backups/$DATE.log
	FILENUMBER=`ossutil64 ls oss://ser-storage | grep "gitlab_backup.tar" | wc -l`

	# 检查OSS中的备份文件数量,如果超过5个,则执行下面的删除命令
	if [ $FILENUMBER -gt 5 ];
	then
		echo -e "正在删除旧的OSS备份文件:\n`ossutil64 ls oss://ser-storage | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}' | head -n -5`" >> /data/gitlab/data/backups/$DATE.log

		# 如果过期备份文件数量大于1,则通过for循环删除
		if [ `ossutil64 ls oss://ser-storage | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}' | head -n -5 | wc -l` -gt 1 ];
		then
			for value in `ossutil64 ls oss://ser-storage | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}' | head -n -5`
				do 
					ossutil64 rm $value >> /data/gitlab/data/backups/$DATE.log
				done
			echo -e "\n旧的OSS备份文件删除完成!" >> /data/gitlab/data/backups/$DATE.log
		# 否则,直接删除
		else
			ossutil64 ls oss://ser-storage | grep "gitlab_backup.tar" | awk -F ' ' '{print $NF}' | head -n -5 | xargs ossutil64 rm >> /data/gitlab/data/backups/$DATE.log
		fi
	# 如果OSS中的备份文件数量少于5个,则记录,没有过期文件需要删除
	else
		echo -e "\n ################################ \n " >> /data/gitlab/data/backups/$DATE.log
		echo -e "备份成功!没有过期备份文件可删除" >> /data/gitlab/data/backups/$DATE.log
	fi
# 如果备份命令失败,则写入如下信息以做记录
else
	echo -e "\n $DATE 备份失败,请检查备份日志!" >> /data/gitlab/data/backups/$DATE.log
fi

# 保留最近的7份日志文件
# if [ `ls -lt /data/gitlab/data/backups/ | awk -F ' ' ' {print $NF}' | grep log | wc -l ` -gt 7 ];
# then
	# ls -lt /data/gitlab/data/backups/ | awk -F ' ' ' {print $NF}' | grep log | tail -n +8 | xargs /usr/bin/rm -rf   # 
# fi

# 删除七天前的日志文件
if [ `find /data/gitlab/data/backups -mtime +6 | grep log | wc -l` -gt 0 ];
then
	echo '删除七天前的日志文件' >> /data/gitlab/data/backups/$DATE.log
	find /data/gitlab/data/backups -mtime +6 | grep log >> /data/gitlab/data/backups/$DATE.log
	find /data/gitlab/data/backups -mtime +6 | grep log | xargs /usr/bin/rm -rf
else
	exit 0
fi

docker-compose 编排示例

version: '2.1'

services:

  gitlab:
	container_name: gitlab
	image: 'gitlab/gitlab-ce:latest'
	restart: always
	hostname: 'gitlab.domain.com'
	environment:
	  GITLAB_OMNIBUS_CONFIG: |
		external_url 'http://gitlab.domain.com' # 支持https
		gitlab_rails['initial_root_password'] = "password"  # 初始root用户密码
		gitlab_rails['initial_shared_runners_registration_token'] = "p73gTXsPtWjqVLNKn39tRFKbdhPCPvjXLtxNsHj4kzfsM3FtmLTg4kPwcpKpsNsT" #pwgen -Bsv1 64
		gitlab_rails['gitlab_shell_ssh_port'] = 2222
		gitlab_rails['smtp_enable'] = true
		gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
		gitlab_rails['smtp_port'] = 465
		gitlab_rails['smtp_user_name'] = "[email protected]"    # 发送邮件通知相关配置
		gitlab_rails['smtp_password'] = "emailpassword"
		gitlab_rails['smtp_authentication'] = "login"
		gitlab_rails['smtp_enable_starttls_auto'] = true
		gitlab_rails['smtp_tls'] = true
		gitlab_rails['gitlab_email_from'] = '[email protected]' # 腾讯企业邮箱可以设置别名
		registry_external_url 'http://gitlab.domain.com'
		gitlab_rails['registry_enabled'] = true
		gitlab_rails['registry_host'] = "gitlab.domain.com"
		gitlab_rails['time_zone'] = 'Asia/Shanghai'
		#nginx['enable'] = true
		#nginx['redirect_http_to_https'] = true
		#nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.domain.com.crt"
		#nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.domain.com.key"
		prometheus['enable'] = false
		# gitlab 从13升级到14版本时因为从unicorn替换成了puma。所以要在配置文件中注释所有unicorn相关的配置再进行升级,否则会升级失败
		#unicorn['worker_processes'] = 4
		#gitlab_monitor['enable'] = true
		#prometheus_monitoring['enable'] = true
		#gitlab_rails['registry_port'] = "5000"
		#gitlab_rails['registry_path'] = "/var/opt/gitlab/gitlab-rails/shared/registry"
	  SET_CONTAINER_TIMEZONE: 'true'
	  CONTAINER_TIMEZONE: 'Asia/Shanghai'
	sysctls:
	  net.core.somaxconn: 65535
	ulimits:
	  nproc: 131072
	  nofile:
		soft: 131072
		hard: 131072
	  sigpending: 131072
	  core: 0
	ports:
      #  启用gitlab_rails['gitlab_shell_ssh_port'] = 2222配置之后,
      # 容器内监听的还是22端口,只是对外为2222,
      # 所以映射容器内的端口时还是要用22。
	  - '2222:22'
	  - '80:80'
	  #- '443:443'
	volumes:
	  - /data/gitlab/config:/etc/gitlab
	  - /data/gitlab/log:/var/log/gitlab
	  - /data/gitlab/backups:/var/opt/gitlab/backups
	  - /data/gitlab/data:/var/opt/gitlab
	  - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro


# gitlab runner 配置
#  gitlab-runner:
#    container_name: gitlab-runner
#    image: 'gitlab/gitlab-runner:latest'
#    restart: always
#    volumes:
#     # - /data/gitlab-runner/config:/etc/gitlab-runner
#      - /data/gitlab-runner/.ssh:/home/gitlab-runner/.ssh
#      - /var/run/docker.sock:/var/run/docker.sock
#    links:
#      - gitlab
#    sysctls:
#      net.core.somaxconn: 65535
#    ulimits:
#      nproc: 131072
#      nofile:
#        soft: 131072
#        hard: 131072
#      sigpending: 131072
#      core: 0

升级顺序

Gitlab升级不能直接升级到最新版本,有一定的升级顺序,升级顺序可以参考官方文档Upgrading GitLab下的Upgrade paths


使用ssh拉取、推送代码

注意gitlab.rb配置文件中的以下三个要打开,且服务监听地址不能是localhost,这里我用的是非标准端口。

gitlab_rails['gitlab_shell_ssh_port'] = 2222
gitlab_sshd['enable'] = true
gitlab_sshd['listen_address'] = '0.0.0.0:2222'

最后更新于