一、自建gitlab

1
2
3
4
官网文档:https://docs.gitlab.com/ee/policy/maintenance.html
官网:https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/
CentOS清华大学:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
ubuntu清华大学:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/pool/xenial/main/g/gitlab-ce/

1.安装依赖

1
yum install -y curl openssh-server openssh-clients postfix cronie policycoreutils-python

2. 下载gitlab包并安装

1
2
3
4
5
6
7
cd /opt/tools/

wget http://ftp.sjtu.edu.cn/sites/gitlab-ce/yum/el7/gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm
wget http://ftp.sjtu.edu.cn/sites/gitlab-ce/yum/el7/gitlab-ce-14.6.1-ce.0.el7.x86_64.rpm

rpm -ivh gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm
rpm -ivh gitlab-ce-14.6.1-ce.0.el7.x86_64.rpm
1
2
3
4
5
6
7
8
9
10
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
yum install gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm

#卸载完旧版本后,记得删除旧的安装数据[配置文件,安装目录,数据目录等]
rpm -e gitlab-ce
rm -rf /var/opt/gitlab/
rm -rf /opt/gitlab/
rm -rf /etc/gitlab/
rm -rf /var/log/gitlab/
rm -rf /etc/systemd/system/default.target.wants/gitlab-runsvdir.service

3. gitlab的配置文件 编辑如下

1
2
3
4
5
6
7
8
9
grep "^external_url" /etc/gitlab/gitlab.rb

vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.64.129' #绑定监听的域名或IP
gitlab-ctl reconfigure #自动配置,并安装数据库,初始化信息(第一次使用配置时间较长)
gitlab-ctl start #启动gitlab服务
gitlab-ctl stop #停止gitlab服务
gitlab-ctl tail #查看日志
head -1 /opt/gitlab/version-manifest.txt #gitlab-ce 13.2.1 #启动并查看gitlab版本信息

3.1 gitlab启用https,修改port

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
如果需要手工修改nginx的port ,可以在gitlab.rb中设置 nginx[‘listen_port’] = 8000 ,然后再次 gitlab-ctl reconfigure即可

vim /etc/gitlab/gitlab.rb
external_url 'https://192.168.64.129:10443' #绑定监听的域名或IP

#修改nginx配置
gitlab_rails['gitlab_shell_ssh_port'] = 10022
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.key"

#生成秘钥与证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=gitlab" -out server.csr

mv server.key gitlab.origin.key
openssl rsa -in gitlab.origin.key -out gitlab.key
openssl x509 -req -days 3650 -in server.csr -signkey gitlab.key -out gitlab.crt

ls /opt/tools/gitlab_ssl
gitlab.crt gitlab.key gitlab.origin.key server.csr

#拷贝证书到相应目录:
cd /opt/tools/gitlab_ssl
cp gitlab.crt gitlab.key /etc/gitlab/ssl
1
2
3
4
5
6
7
8
9
10
11
12
gitlab-ctl reconfigure
gitlab-ctl stop
gitlab-ctl start
https://192.168.64.129:10443

#获取/修改超级管理员root的密码
gitlab-rails console production #开始初始化密码
irb(main):001:0> u=User.where(id:1).first #来查找与切换账号(User.all 可以查看所有用户)
irb(main):001:0> u.password='12345678' #设置密码为12345678(这里的密码看自己喜欢):
irb(main):001:0> u.password_confirmation='12345678' #再次确认密码
irb(main):001:0> u.save! #进行保存(切记切记 后面的 !)
如果看到true即设置成功,执行 exit 退出当前设置流程即可

3.2 在系统防火墙中打开HTTP和SSH访问

1
2
3
4
5
6
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --zone=public --add-port=10022/tcp --permanent
firewall-cmd --zone=public --add-port=10443/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

3.3 修改配置文件,添加smtp邮件功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
vim /etc/gitlab/gitlab.rb
grep -P "^[^#].*smtp_|user_email|gitlab_email" /etc/gitlab/gitlab.rb

gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'xxxx@qq.com'
gitlab_rails['gitlab_email_display_name'] = 'Admin'
gitlab_rails['gitlab_email_reply_to'] = 'xxxx@qq.com'
gitlab_rails['gitlab_email_subject_suffix'] = '[gitlab]'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "stmp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxxx@qq.com"
gitlab_rails['smtp_password'] = "heiwyqbe"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'none'
user['git_user_email'] = "xxxx@qq.com"


#console命令进行发送邮件测试
gitlab-rails console
irb(main):001:0> Notify.test_email('xxxx@qq.com', 'Message Subject', 'Message Body').deliver_now
注:gitlab配置邮箱报execution expired,云服务器默认是屏蔽25端口的,改用163邮箱的465端口即可

firewall-cmd --zone=public --add-port=465/tcp --permanent
1
2
3
4
5
#安装Postfix以发送通知电子邮件
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
在Postfix安装期间,可能会出现配置屏幕。选择“Internet Site”并按Enter键。使用服务器的外部DNS作为“邮件名称”,然后按Enter键。如果出现其他屏幕,请继续按Enter键接受默认值

二、自建的Gitlab备份、迁移、恢复和升级

1.Gitlab备份

1
2
3
4
gitlab-rake gitlab:backup:create
使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1590031244_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的1590031244是备份创建的日期

/etc/gitlab/gitlab.rb #配置文件须备份 /var/opt/gitlab/nginx/conf #nginx配置文件 /etc/postfix/main.cfpostfix #邮件配置备份

1.1Gitlab备份目录

1
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" /var/opt/gitlab/backups修改为你想存放备份的目录即可, 修改完成之后使用gitlab-ctl reconfigure命令重载配置文件即可.

1.2Gitlab自动备份

1
2
实现每天凌晨2点进行一次自动备份:通过crontab使用备份命令实现
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create

2.Gitlab恢复

1
2
3
4
5
6
7
8
9
# 停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq

#从1481598919编号备份中恢复
gitlab-rake gitlab:backup:restore BACKUP=1590031244

#启动Gitlab
gitlab-ctl start

3.gitlab迁移

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
要求:新服务器的gitlab版本与旧的服务器相同。

迁移如同备份与恢复的步骤一样, 只需要将老服务器/var/opt/gitlab/backups目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups即可(如果你没修改过默认备份目录的话).

但是需要注意的是新服务器上的Gitlab的版本必须与创建备份时的Gitlab版本号相同. 比如新服务器安装的是最新的7.60版本的Gitlab, 那么迁移之前, 最好将老服务器的Gitlab 升级为7.60在进行备份.

/etc/gitlab/gitlab.rb #gitlab配置文件须迁移,迁移后需要调整数据存放目录
/var/opt/gitlab/nginx/conf #nginx配置文件目录须迁移
/etc/gitlab/gitlab-secrets.json #复制新服务器相同的目录下
/etc/ssh/*key* # 复制到新服务器相同目录下,解决ssh key认证不成功问题

gitlab-ctl stop unicorn #ok: down: unicorn: 0s, normally up
gitlab-ctl stop sidekiq #ok: down: sidekiq: 0s, normally up
chmod 777 /var/opt/gitlab/backups/1481598919_gitlab_backup.tar
# 或 chown git:git /var/opt/gitlab/backups/1481598919_gitlab_backup.tar
gitlab-rake gitlab:backup:restore BACKUP=1590031244

4.gitlab升级

4.1关闭gitlab服务

1
2
3
gitlab-ctl stop unicorn 
gitlab-ctl stop sidekiq
gitlab-ctl stop nginx

4.2.备份gitlab

1
gitlab-rake gitlab:backup:create

4.3.下载gitlab的RPM包并进行升级

1
2
3
4
5
6
#升级文档:https://docs.gitlab.com/ee/policy/maintenance.html
依据文档需要先升级到12.3.5-> 12.10.6-> 13.0.0->13.2.0
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
yum update gitlab-ce
或者直接安装高版本 yum install gitlab-ce-13.2.1-ce.0.el7.x86_64
或者上官网下载最新版本 gitlab对应软件包 [gitlab官网](https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-13.2.1-ce.0.el7.x86_64.rpm) 使用 rpm -Uvh gitlab-ce-13.2.1-ce.0.el7.x86_64.rpm

5.常见错误

1
2
3
#报错
Error executing action `run` on resource 'ruby_block[directory resource: /var/opt/gitlab/git-data/repositories]'
解决方法: sudo chmod 2770 /var/opt/gitlab/git-data/repositories

三、其它git操作

test分支版本回退

1
2
3
git log
git reset --hard id //选择要回退的id
git push -f origin test //回退后强制推送到远程仓库

git拉取远程分支

1
2
git fetch origin dev //从远程获取最新版本到本地,不会自动merge
git checkout -b 本地分支名 origin/远程分支名

拉取远程分支到本地分支

1
2
git checkout mydev  //切换到本地分支
git pull origin dev //将远程仓库中的dev分支拉取到mydev分支

删除本地分支及远程分支

1
2
git branch -D dev  //删除本地分支
git push origin :dev //删除远程分支s

删除本地及远程仓库tag

1
2
git tag -d v2.9.0        //本地删除tag
git push origin :refs/tags/v2.9.0     //本地tag删除了,再执行该句,删除线上tag

查看最近3条更新日志,并简单显示出所涉及的文件

1
2
git log -3 --stat
git show 3dbfdbccc8238ff688316e481266cfbda8733b8d //查看修改了文件的那些内容

统计代码每天提交的行数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#统计某时间段内每个开发人员提交的分支,提交的次数,增加的行数,删除的行数与相对增加的行数
#!/usr/bin/env bash

# 脚本运行: sh gitCodeStat.sh 2021-10-18 2021-10-19

# 项目所有目录
ITEM_PATH=E:/Gitlab-code
# 统计结果输出文件
curRecordFile=E:/Gitlab-code/gitCodeStat-`date "+%Y%m%d"`".log"
TODAY_DATE=`date "+%Y-%m-%d %H:%M:%S"`
# 开始时间
#START_DATE=`date "+%Y-%m-%d`
START_DATE=$1
# 结束时间
#STOP_DATE=`date "+%Y-%m-%d`
STOP_DATE=$2
# 统计周期长度,默认为1天前的
STAT_DURATION_DAY=1

# 统计代码
function statCode() {
git fetch --all
git pull --all

echo -e "stat git code => $(pwd)"
#git log --format='%aN' --since=${STAT_DURATION_DAY}.day.ago | sort -u | while read name; do echo -en "当前查询时间:$TODAY_DATE 项目:$1 开发人员:$name"; \
#git log --graph --decorate |grep HEAD |awk -F ',' '{print " 提交分支:"$1}'; \
#git log --since=${STAT_DURATION_DAY}.day.ago --author="$name" --pretty=oneline | awk -vsum=0 '{ sum += 1 } END { printf " 提交的次数:%s ", sum }' -; \
#git log --since=${STAT_DURATION_DAY}.day.ago --author="$name" --pretty=tformat: --numstat | awk -vadd=0 -vsubs=0 -vloc=0 '{ add += $1; subs += $2; loc += $1 - $2 } END { printf " 增加的行数:%s 删除的行数:%s 相对增加的行数:%s \n", add, subs, loc }' -; done >> $curRecordFile

CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD`
git log --format='%aN' --since="${START_DATE} 00:00" --until="${STOP_DATE} 23:59" | sort -u | while read name; do echo -en "当前查询时间:$TODAY_DATE 查询时间范围:[${START_DATE} 00:00----${STOP_DATE} 23:59] 项目:$1 分支:${CURRENT_BRANCH} 开发人员:$name"; \
git log --since="${START_DATE} 00:00" --until="${STOP_DATE} 23:59" --author="$name" --pretty=oneline | awk -vsum=0 '{ sum += 1 } END { printf " 提交的次数:%s ", sum }' -; \
git log --since="${START_DATE} 00:00" --until="${STOP_DATE} 23:59" --author="$name" --pretty=tformat: --numstat | awk -vadd=0 -vsubs=0 -vloc=0 '{ add += $1; subs += $2; loc += $1 - $2 } END { printf " 增加的行数:%s 删除的行数:%s 相对增加的行数:%s \n", add, subs, loc }' -; done >> $curRecordFile

}

# 遍历文件夹下的所有项目文件夹
function readDir() {
echo "current record file name: $curRecordFile"
echo "date project name commits addLines removeLines oppositeAddLines"
cd $ITEM_PATH
for subDir in `ls $ITEM_PATH` ;
do
echo "sub dir : $subDir"
cd $subDir
echo "current dir: $(pwd)"
statCode $subDir
cd ../
done
echo "" >> $curRecordFile
}


if [ $# == 2 ]; then
echo ""
echo "请输入开始日期 结果日期"
echo "例如: sh $0 2021-10-18 2021-10-19"

if echo $1 | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" ; then
if echo $2 | grep -Eq "[0-9]{4}-[0-9]{2}-[0-9]{2}" ; then
# 启动脚本
readDir
else
echo "输入的日期格式不正确,应为yyyy-mm-dd"
exit 1
fi
else
echo "输入的日期格式不正确,应为yyyy-mm-dd"
exit 1
fi



else
echo "输入是日期格式不正确或参数不够"
echo "请正确输入开始日期 结果日期,中间用空格隔开"
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#统计某时间段内每个开发人员提交的分支,提交的次数,增加的行数,删除的行数与相对增加的行数
#!/usr/bin/env bash

# 脚本运行: sh gitCodeStat.sh 2021-10-14 2021-10-19
# 会每天生成一个日期文件记录当天的统计

# 项目所有目录
ITEM_PATH=E:/gitCode
# 统计结果输出文件
curRecordFile=E:/gitcodelog/`date "+%Y%m%d"`".log"
TODAY_DATE=`date "+%Y-%m-%d %H:%M:%S"`
# 开始时间
#START_DATE=`date "+%Y-%m-%d`
START_DATE=$1
# 结束时间
#STOP_DATE=`date "+%Y-%m-%d`
STOP_DATE=$2
# 统计周期长度,默认为1天前的
STAT_DURATION_DAY=1

t1=`date -d "${START_DATE}" +%s`
t2=`date -d "${STOP_DATE}" +%s`

# 统计代码
function statCode() {
START_DATE=${2}
git fetch --all
git pull --all

echo -e "stat git code => $(pwd)"
CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD`
git log --format='%aN' --since="${START_DATE} 00:00" --until="${START_DATE} 23:59" |sort -u |while read name; do echo -en "\r\n 开发人员:$name 项目:$1 分支:${CURRENT_BRANCH} "; \
git log --since="${START_DATE} 00:00" --until="${START_DATE} 23:59" --author="$name" --pretty=oneline | awk -vsum=0 '{ sum += 1 } END { printf " 提交的次数:%s ", sum }' -; \
git log --since="${START_DATE} 00:00" --until="${START_DATE} 23:59" --author="$name" --pretty=tformat: --numstat | awk -vadd=0 -vsubs=0 -vloc=0 '{ add += $1; subs += $2; loc += $1 - $2 } END { printf " 增加的行数:%s 删除的行数:%s 相对增加的行数:%s \r\n\r\n", add, subs, loc }' -; done >> $curRecordFile
}

# 遍历文件夹下的所有项目文件夹
function readDir() {
echo "current record file name: $curRecordFile"
cd $ITEM_PATH
for subDir in `ls $ITEM_PATH` ;
do
cd $ITEM_PATH/$subDir
echo -en "----$subDir----\r\n" >> $curRecordFile
START_DATE=${1}
statCode $subDir $START_DATE
cd ../
done
echo -en "\r\n" >> $curRecordFile
}

# 启动脚本
#readDir

function genAlldate
{
START_DAY_TMP=${1}
END_DAY_TMP=${2}
SPLITER_TMP="-"
I_DATE_ARRAY_INDX=0

while (( "${START_DAY_TMP}" <= "${END_DAY_TMP}" )); do
cur_day=$(date -d @${START_DAY_TMP} +"%Y${SPLITER_TMP}%m${SPLITER_TMP}%d")
DATE_ARRAY[${I_DATE_ARRAY_INDX}]=${cur_day}

START_DAY_TMP=$((${START_DAY_TMP}+86400))
((I_DATE_ARRAY_INDX++))

done
}

START_DAY=$(date -d "$1" +%s)
STOP_DY=$(date -d "$2" +%s)
declare -a DATE_ARRAY
genAlldate "${START_DAY}" "${STOP_DY}"

if [[ $START_DATE < $STOP_DATE ]]; then
for i in "${!DATE_ARRAY[@]}"; do
#echo "${DATE_ARRAY[$i]}"
curRecordFile=E:/gitcodelog/${DATE_ARRAY[$i]}.log
readDir "${DATE_ARRAY[$i]}"
done
#echo "$START_DATE < $STOP_DATE"
elif [[ $START_DATE = $STOP_DATE ]]; then
curRecordFile=E:/gitcodelog/${START_DATE}.log
readDir "${START_DATE}"
#echo "$START_DATE = $STOP_DATE" >> $curRecordFile
else
#echo "$START_DATE > $STOP_DATE"
echo "第二个日期早于第一个日期"
fi