gitlab安装、备份、上传
Git是版本控制系统,Github是在线的基于Git的代码托管服务,创建公开仓库不收费,创建私人的就得花银子。
gitlab就是纯免费的啦,而且还优化了很多github没有的功能,比如代码片段分享等,总之,要是开源的项目就放到github上,要是私有的,企业内部使用的就使用gitlab更方便一些。
一、gitlab的构成
- Nginx:静态web服务器。
- gitlab-shell:用于处理Git命令和修改authorized keys列表。(Ruby)
- gitlab-workhorse: 轻量级的反向代理服务器。(go)
- logrotate:日志文件管理工具。
- postgresql:数据库。
- redis:缓存数据库。
- sidekiq:用于在后台执行队列任务(异步执行)。(Ruby)
- unicorn:An HTTP server for Rack applications,GitLab Rails应用是托管在这个服务器上面的。(Ruby Web Server,主要使用Ruby编写)
二、部署
yum安装
1、编辑repo镜像源
`vim /etc/yum.repos.d/gitlab_gitlab-ce.repo`
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
2、安装依赖
sudo yum install curl openssh-server openssh-clients postfix cronie
sudo service postfix start
sudo chkconfig postfix on 这句是用来做防火墙的,避免用户通过ssh方式和http来访问。
sudo lokkit -s http -s ssh
3、执行
sudo yum makecache
sudo yum install gitlab-ce
sudo gitlab-ctl reconfigure 启动
4、配置域名
vim /var/opt/gitlab/nginx/conf/gitlab-http.conf
listen *:8888;
server_name gitlab.test.com;
set $http_host_with_default "gitlab.test.domain.com:8888";
rpm部署
1、下载安装包
wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-12.1.4-ce.0.el7.x86_64.rpm/download.rpm
rpm -ivh gitlab-ce-12.1.4-ce.0.el7.x86_64.rpm
2、修改配置
GitLab默认会占用80、8080和9090端口。如果有端口冲突就修改一下gitlab的默认端口。
vim /etc/gitlab/gitlab.rb
external_url 13行
unicorn['port'] 695行
prometheus['listen_address'] 1460行
gitlab_rails['webhook_timeout'] 104行 时间太短了,建议设置为90
gitlab_workhorse['auth_backend'] 550行 必须和unicorn_port是一个端口号
3、systemctl启动
docker安装(我使用的是这个)
1、创建数据目录
mkdir -p /mnt/gitlab/etc
mkdir -p /mnt/gitlab/log
mkdir -p /mnt/gitlab/data
2、下载镜像
docker search gitlab
docker pull gitlab/gitlab-ce:latest
3、启动
docker run --detach --publish 8443:443 --publish 8080:80 --publish 4422:22 --name gitlab --restart unless-stopped -v /mnt/gitlab/etc:/etc/gitlab -v /mnt/gitlab/log:/var/log/gitlab -v /mnt/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest
4、配置
vim /mnt/gitlab/etc/gitlab.rb
external_url 'http://192.168.x.x' 打开注释,并修改
gitlab_rails['gitlab_shell_ssh_port'] = 4422 打开注释,并修改为4422
之后clone的时候需要使用4422这个映射端口,22和宿主机冲突
vim /mnt/gitlab/data/gitlab-rails/etc/gitlab.yml
同理修改IP和端口,端口使用容器的端口,8080:80中的80
5、进入容器启动
docker exec -ti gitlab /bin/bash
gitlab-ctl reconfigure #这儿需要等待一段时间,别慌
gitlab-ctl restart
gitlab-ctl status
6、打开gitlab
马上打开会出现502,等一会儿就好了
三、gitlab-web配置
打开web界面 http://IP:PORT
首次登陆要求配置管理员密码,这里设置的是密码。默认的用户名是root
创建仓库
一共四个框,没必要截图了吧。。
添加ssh信任
在要添加信任的服务器上执行ssh-keygen -t rsa -C 'xxx@xxx.com'
复制公钥 cat ~/.ssh/id_rsa.pub
多个pub配置
ssh-keygen -t rsa -C 'yourEmail@xx.com' -f ~/.ssh/gitlab-rsa
生成一对秘钥ssh key
ssh-keygen -t rsa -C 'yourEmail2@xx.com' -f ~/.ssh/github-rsa
为github生成一对秘钥ssh key
在~/.ssh目录下新建名称为config的文件(无后缀名)。用于配置多个不同的host使用不同的ssh key
# gitlab
Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitlab_id-rsa
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_id-rsa
# 配置文件参数
# Host : Host可以看作是一个你要识别的模式,对识别的模式,进行配置对应的的主机名和ssh文件
# HostName : 要登录主机的主机名
# User : 登录名
# IdentityFile : 指明上面User对应的identityFile路径
照上面的步骤分别往gitlab和github上添加生成的公钥gitlab_id-rsa.pub和github_id-rsa.pub
打开web
测试
git clone ssh://git@192.168.2.15:4422/root/testproject.git
四、备份和恢复
进入到容器,执行gitlab-rake gitlab:backup:create
备份
如果在/etc/gitlab/gitlab.rb 文件配置了参数“backup_path”(例如gitlab_rails['backup_path'] = '/bak'),则备份的目录就是该目录下(/bak),如果没有配置参数“backup_path”,则gitlab把备份文件生成到默认目录/var/opt/gitlab/backups。
备份完成会出一个警告,有两个文件需要手工备份,如果涉及到迁移就把这两个文件拿去覆盖一下新的gitlab
定时备份
vim /etc/crontab
0 4 * * * root /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
systemctl restart crond
备份过期清理
vim /etc/gitlab/gitlab.rb
gitlab_rails['backup_keep_time'] = 604800
保留7天的备份文件
注意:如果是后来修改的需要再次执行gitlab-ctl reconfigure
恢复
通过gitlab备份文件可以恢复gitlab所有的信息,包括仓库、数据库、用户、用户组、用户密钥、权限等信息
停止gitlab相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
恢复备份
gitlab-rake gitlab:backup:restore BACKUP=1595075189_2020_07_18_13.1.4 不要带后缀_gitlab_backup.tar
启动
gitlab-ctl start
测试
删除我们刚才建的test项目,执行恢复。
五、日志管理
控制台查看日志
gitlab-ctl tail
gitlab-ctl tail gitlab-rails 查看/var/log/gitlab下子目录的日志
gitlab-ctl tail nginx/gitlab_error.log 查看指定日志文件
日志轮循
vim /etc/gitlab/gitlab.rb
logging['logrotate_frequency'] = "daily" 每天切割一次日志
logging['logrotate_size'] = "500M" 不按照默认值的大小切割日志
logging['logrotate_rotate'] = 30 日志文件保留30天
logging['logrotate_compress'] = "compress" 使用'man logrotate'查看详情
logging['logrotate_method'] = "copytruncate"
logging['logrotate_dateformat'] = "-%Y-%m-%d"
nginx['logrotate_frequency'] = nil
nginx['logrotate_size'] = "200M"
自定义nginx日志格式
vim /etc/gitlab/gitlab.rb
nginx['log_format'] = 'my format string $foo $bar'
mattermost_nginx['log_format'] = 'my format string $foo $bar'
六、上传代码到gitlab
1、登陆github创建一个repository
新建
复制新项目地址
2、进入本地要添加的项目目录,右键执行git bash
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git init
git remote add origin https://github.com/zhaobw520/datareport.git
git push -u origin master
这里报错“error: failed to push some refs to 'https://github.com/zhaobw520/datareport.git'”
这里提示推送失败,因为在GitHub上初始化了一个README.MD文件,远程仓库中的文件比本地的要新,所以要使用git pull要把最新的文件抓下来,与本地的文件合并之后在提交。
就是第一个截图,打勾勾的地方,记着不要打。
解决办法是先把仓库的readme同步到本地。
git pull
又报错
原因是没有指定本地master和远程origin/master的连接。
创建连接
git checkout master 切换本地git到master分支
git branch --set-upstream-to master origin/master 创建到远端的连接
再次执行git pull
git pull
增加readme.md到缓存
git commit -m "merge README.MD"
开始推送
git push -u origin master
3、新项目上传步骤(新项目上传使用以下步骤就好)
1、在github上创建新的仓库,切记不要创建README文件,否则因为本地和远程仓库不一致导致报错。
2、git bash一定要在上传的项目目录里打开
3、执行
>git init 初始化本地仓库
>git config --global user.email "you@example.com" 第一次使用git需要填个人信息,之后就不需要了
>git config --global user.name "Your Name"
>git remote add origin https://github.com/zhaobw520/datareport.git 创建远程仓库连接
>git pull --rebase origin master 获取远程同步,如果远程库不为空(一般是创建了readme文件)必须做这一步,否则后面的提交会失败。否则不用执行
>echo "# some your message" >> README.md 如果没有创建readme文件,需要执行这一步
>git add . 把项目加入到本地仓库
>git commit -m ‘first commit’ 提交
>git push -u origin master 上传
创建新分支
1.创建本地分支
git branch 分支名,例如:git branch 2.0.1.20120806
注:2.0.1.20120806是分支名称,可以随便定义。
2.切换本地分支
git checkout 分支名,例如从master切换到分支:git checkout 2.0.1.20120806
3.远程分支就是本地分支push到服务器上。比如master就是一个最典型的远程分支(默认)。
git push origin 2.0.1.20120806
4.远程分支和本地分支需要区分好,所以,在从服务器上拉取特定分支的时候,需要指定远程分支的名字。
git checkout --track origin/2.0.1.20120806
注意该命令由于带有--track参数,所以要求git1.6.4以上!这样git会自动切换到分支。
5.提交分支数据到远程服务器
git push origin <local_branch_name>:<remote_branch_name>
例如:
git push origin 2.0.1.20120806:2.0.1.20120806
一般当前如果不在该分支时,使用这种方式提交。如果当前在 2.0.1.20120806 分支下,也可以直接提交
git push
6.删除远程分支
git push origin :develop
删除远程仓库
git remote //查看配置的远程仓库
git remote rm 远程仓库
删除远程仓库中的文件
git rm -r --cached $dir #删除目录
git rm $file #删除文件
git commit -m”删除.history文件夹”
git push
常用命令参数
git branch
检查分支
git add .
不加参数默认为将修改操作的文件和未跟踪新添加的文件添加到git系统的暂存区,注意不包括删除
git add -u .
-u 表示将已跟踪文件中的修改和删除的文件添加到暂存区,不包括新增加的文件,注意这些被删除的文件被加入到暂存区再被提交并推送到服务器的版本库之后这个文件就会从git系统中消失了。
git add -A .
-A 表示将所有的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区
git commit -m ‘message’
-m 参数表示可以直接输入后面的“message”,如果不加 -m参数,那么是不能直接输入message的,而是会调用一个编辑器一般是vim来让你输入这个message,
message即是我们用来简要说明这次提交的语句。
git commit -am ‘message’ -am等同于-a -m
-a参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区,
注意: 新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。
git push origin master
如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
git push origin :refs/for/master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin –delete master
git push origin
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
git push
如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名
报错收集
1、master->master(fetch first)的解决方法
出现这个原因是仓库中的代码和本地中的代码不一致,需要先将仓库里的代码pull下来。
git pull <远程主机名> <远程分支名>:<本地分支名>
再次上传,解决。