Leave me alone.

GitLab

Posted on By gtahub

Git、Github、Gitlab的区别

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。是Linus Torvalds为了帮助管理Linux内核而开发的一个开放源码的版本控制软件。
Github是在线的基于Git的代码托管服务。Github是2008年由Ruby on Rails编写而成。Github同时提供付费账户和免费账户。这两种账户都可以创建公开的代码仓库,只有付费账户可以创建私有的代码仓库。Gitlab解决了这个问题,可以在上面创建免费的私人repo。

Git与SVN区别

Git不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。

  • Git是分布式的,SVN不是:这是Git和其他非分布式的版本控制系统,例如SVN,CVS等,最核心的区别
  • Git把内容按原数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn.cvs等的文件夹里
  • Git分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录
  • Git没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比Git缺少的最大的一个特征
  • Git的内容完整性要优于SVN:Git的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网路问题时降低对版本哭的破坏

部署Git服务

安装git

yum install -y git

查看版本

git --version

基本使用

创建仓库

git init --bare shell.git
  • git initgit init --bare的区别
    • 使用--bare选项时,不再生成.git目录,而是只生成.git目录下面的版本历史文件,这些版本历史记录文件也不再存放在.git目录下面,而是直接存放在版本库的根目录下面
    • git init初始化的版本库用户也可以在该目录下执行所有git方面的操作,但别的用户在将更新push上来的时候容易出现冲突
    • 使用git init --bare方法创建一个所谓的裸仓库,之所以叫裸仓库是因为这个仓库只保存git历史提交的版本信息,而不允许用户在上面进行各种git操作,如果硬要操作的话,只会得到下面的错误fatal: This operation must be run in a work tree这个就是最好把远端仓库初始化成bare仓库的原因

配置ssh密钥

服务端生成ssh密钥
#连续三次回车
ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:n3aw2mqhrRdfhkb6eqb3WUbP5XMj3LRF2cTfJkZGA3k root@192.168.64.9
The key's randomart image is:
+---[RSA 2048]----+
|            .+o..|
|            . Eo+|
|             + .=|
|          .   o.+|
|        So.. ..+o|
|        +.o++.o++|
|       o *=o.oo==|
|      . ++*. +. +|
|      .+=B..o    |
+----[SHA256]-----+
客户端生成ssh密钥
# 生成ssh密钥
ssh-keygen

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/admin/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/admin/.ssh/id_rsa
Your public key has been saved in /Users/admin/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:UQHJqfevsbGbgClzgxWgCBT1FjCf+X8UhXf/7oKMhKQ admin@192.168.0.103
The key's randomart image is:
+---[RSA 3072]----+
|ooo+o. ..+o...   |
|.. .+.+ +. ... . |
|. .  *...  .. . .|
|    . o.o.  .   .|
|      .=So .    .|
|     oEoo +     .|
|    + = .oo= . . |
|     + . .o*+ . .|
|          *o   o.|
+----[SHA256]-----+

# 复制公钥到服务器
ssh-copy-id root@192.168.64.9

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/admin/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.64.9's password: 

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'root@192.168.64.9'"
and check to make sure that only the key(s) you wanted were added.

客户端操作

# 克隆仓库
git clone root@192.168.64.9:~/shell.git

# 切换目录
cd shell

# 新建文件
echo "echo hello world" > test.sh

# 将文件添加到本地暂存区
git add test.sh

# 配置提交用户名和邮箱
git config user.name test
git config user.email test

# 提交到本地仓库
git commit -m "first commit"

[master (root-commit) f642a54] first commit
 1 file changed, 1 insertion(+)
 create mode 100755 test.sh

# 推送到远程仓库
git push origin master

Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 209 bytes | 209.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To 192.168.64.9:~/shell.git
 * [new branch]      master -> master
 
# 切换到其他路径,clone此项目
sudo cd /opt
sudo git clone root@192.168.64.9:~/shell.git

Git工作流程

一般工作流程如下:

  • 克隆 Git 资源作为工作目录
  • 在克隆的资源上添加或修改文件
  • 如果其他人修改了,你可以更新资源
  • 在提交前查看修改
  • 提交修改
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交

工作流程示意图

Snipaste_2023-06-22_18-58-54

Git基本概念

  • 工作区:当前项目工作目录

  • 暂存区:英文叫stageindex,一般存放在.git目录下的index文件,(.git/index)中,所以暂存区有时也叫作索引(index)

  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
    工作区、版本库中的暂存区和版本库之间的关系的示意图

    Snipaste_2023-06-22_19-03-53

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为“index”的区域是暂存区(stage,index),标记为“master”的是master分支所代表的目录树
  • 图中可以看出此时“HEAD“实际指向master分支的一个游标。所以图示的命令中出现HEAD的地方可以用master来替换
  • 图中的objects标识的区域为Git的对象库,实际位于.git/objects目录下,里面包含了创建的各种对象及内容
  • 当对工作区修改(或新增)的文件执行git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中
  • 当执行提交操作git commit时,暂存区的目录树写到版本库(对象库)中,master分支会做相应的更新,即master指向的目录树就是提交时暂存区的目录树
  • 当执行git reset HEAD命令时,暂存区的目录树会被重写,被master分支指向的目录树替换,但是工作区不受影响
  • 当执行git rm --cached <file>命令时,会直接从暂存区删除文件,工作区则不做出改变
  • 当执行git checkout或者git checkout --<file>命令时,会用暂存区全部或指定的文件替换工作区的文件,这个操作很危险,会清除工作区中未添加到暂存区的改动
  • 当执行git checkout HEAD或者git checkout HEAD <file>命令时,会用HEAD指向的master分支中的全部或者部分文件替换暂存区和工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动

Git配置相关

Git Config

Git提供了一个叫做git config的工具,专门用来配置或读取相应的工作环境变量。这些环境变量,决定了Git在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方

  • /etc/gitconfig文件:系统中对所有用户都普遍使用的配置。若使用git config时用--system选项,读写的就是这个文件
  • ~/.gitconfig文件:用户目录下的配置文件只适用于该用户。若使用git config时用--global选项,读写的就是这个文件
  • 当前项目的Git目录中的配置文件(也就是工作目录中的.git/config文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config里的配置会覆盖/etc/gitconfig中的同名变量

Git 用户信息

配置个人的用户名称和电子邮件地址

git config --global user.name "test"
git config --global user.email "test"

如果用了--global选项,那么更改的配置文件就是位于用户住目录下的那个文件,以后所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者邮箱,只要去掉--global选项重新配置即可,新的设定保存在当前项目的.git/config文件里

文本编辑器

设置Git默认使用的文本编辑器,一般可能会是vi或者vim,如果有其他偏好,比如Emacs的话,可以重新设置

git config --global core.editor emacs

差异分析工具

在解决合并冲突时使用哪种差异分析工具。比如要改用vimdiff的话

git config --global merge.tool vimdiff

Git可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,opendiff等合并工具的输出信息

查看配置信息

要检查已有的配置信息,可以使用git config --list命令

git config --list

Git使用

ssh链接

客户机上产生公钥上传到gitlab的SSH-Keys里,git clone下载和git push上传都没问题,这种方式很安全

http链接(两种方式实现)

修改配置文件

修改代码里的.git/config文件添加登录用户名密码

cd .git

cat config

[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[remote "origin"]
  url = http://username:password@@192.168.64.9:root/shell.git
	url = root@192.168.64.9:~/shell.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
	remote = origin
	merge = refs/heads/master

命令

执行命令设置登录用户和密码

cd ~

git config --global credential.helper store # 执行之后会在.gitconfig文件中多添加以下选项
[credential]
	helper = store

# cd到项目目录,执行git pull命令,会提示输入账号密码。输完这一次以后就不再需要,并且会在根目录生成一个.git-credentials文件
git pull

# 之后pull/push都不需要输入账号密码了
cat .git-credentials

本地项目与远程服务器项目之间的交互

已有仓库拉取代码

# 项目地址,将远程服务器的内容完全复制过来
git clone git@xxx.git

# clone 之后进入该项目的文件夹
cd shell

# 新建readme文件
touch README.md

# 将新的文件添加到git的暂存区
git add README.md

# 将暂存区的文件提交到本地仓库
git commit -m "add a readme file"

# 将本地的更改提交到远程服务器
git push -u origin master

本地代码替换到远程服务器

# 进入代码存在的文件夹
cd project

# 初始化
git bash git init

# 添加远程项目地址(可从项目主页复制)
git remote add origin git@xxx.git

# 添加该文件夹中所有的文件到暂存区
git add .

# 提交代码到本地仓库
git commit -m "note"

# 将本地的更改提交到远程服务器
git push -u origin master
  • git 中 clone 过来的时候,git不会对比本地和服务器的文件,也就不会有冲突
  • 建议确定完全覆盖本地的时候用clone,不确定会不会有冲突的时候用git pull,将远程服务器的代码download下来

常用的git命令

# 初始化
git init

# 添加到暂存区
git add main.cpp

# 将文件夹下的所有的文件添加到暂存区
git add .

# 将暂存区中的文件提交到本地仓库
git commit -m 'note'

# 查看版本日志
git log

# 查看当前版本
git show

# 查看命令历史,以便确定回到哪个版本
git reflog

# 查看暂存区的状态
git status

# 查看现在文件与上一个提交-commit版本的区别
git diff

# 回到上一个版本
git reset --hard HEAD^ #硬撤销不保留本地代码变动,撤销git add,慎用

# 回到某一个版本,指定版本号
git reset --hard xxx

# 从主分支pull到本地
git pull origin master

# 从本地push到主分支
git push -u origin master

# pull默认主分支
git pull

# push默认主分支
git push

分支管理

创建分支
# 创建dev分支,然后切换到dev分支
git checkout -b dev

# 命令加上-b参数表示创建并切换,相当于以下两条命令
git checkout
git branch dev git checkout dev

# 所有分支,当前分支前会标一个*号
git branch

# 在dev分支上提交
git add readme.txt
git commit -m "branch test"
分支切换
# 切换master分支
git checkout master

# 查看当前目录,发现没有readme.txt文件,因为那个提交在dev分支上,而master分支此刻的提交点并没有变
ls -la
合并分支
# 把dev分支的内容合并到当前分支,合并指定分支到当前分支
git merge dev

Updating f642a54..61f726b
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 readme.txt

# 查看当前目录,就可以看到readme.txt文件,和dev分支到最新提交完全一样
ls -la

# 注意到上面的Fast- forward信息,Git告诉我们,这次合并是快速模式,也就是直接把master指定dev的当前提交,所以合并速度非常快
删除分支
# 删除dev分支
git branch -d dev

# 再次查看分支,只剩master
git branch
解决冲突
# 创建分支
git checkout -b dev

# 添加文件并提交
echo "hello world" > readme.txt
git add readme.txt
git commit -m "test"

# 切换到master分支
git checkout master

M	readme.txt
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
#Git自动提示当前master分支比远程的master分支要超前一个提交

# 修改master分支的readme.txt文件为
"Hello World"

# 添加到暂存区并提交
git add readme.txt
git commit -m "hello"

# 现在,master分支和dev分支各自有新的提交,这种情况下,Git无法执行快速合并,只能试图把各自的修改合并起来,但这种合并就可能会有冲突
git merge dev

Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

# readme.txt文件存在冲突,必须手动解决冲突后再提交
# 查看冲突的文件
git status

# 直接查看readme.txt的内容
cat readme.txt

<<<<<<< HEAD
Hello World
=======
hello world
>>>>>>> dev

# Git用<<<<<<<, =======, >>>>>>>标记出不同分支的内容,修改后保存再提交
git add readme.txt
git commit -m "fixed"
git push -u origin master

Gitlab Server部署

物理机部署

环境配置

# 关闭SELinux
# 临时将selinux关闭
setenforce 0
 
# 永久关闭selinux,修改SELINUX=enforcing 为 SELINUX=disabled
vi /etc/sysconfig/selinux

# 利用sed修改
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

# 将selinux功能开启
setenforce 1

# 查看selinux状态
getenforce

# 开启邮件服务
systemctl start postfix
systemctl enable postfix

部署gitlab依赖包

# CentOS7,ssh、postfix(邮件通知)
yum install -y curl openssh-server openssh-clients postfix cronie policycoreutils-python

# CentOS8
yum install -y curl openssh-server openssh-clients postfix cronie python3-policycoreutils

添加官方源

查看系统架构
# 查看系统架构
uname -p

aarch64
X86
# 官方源
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash

# 清华源
vi /etc/yum.repos.d/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
ARM
# 官方源
curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash

==> Detected OS centos

==> Add yum repo file to /etc/yum.repos.d/gitlab-jh.repo

[gitlab-jh]
name=JiHu GitLab
baseurl=https://packages.gitlab.cn/repository/el/$releasever/
gpgcheck=0
gpgkey=https://packages.gitlab.cn/repository/raw/gpg/public.gpg.key
priority=1
enabled=1

==> Generate yum cache for gitlab-jh

# linux arm架构暂不支持yum方式安装
==> Successfully added gitlab-jh repo. To install JiHu GitLab, run "sudo yum/dnf install gitlab-jh".

安装Gitlab

# 自动安装最新版
yum install -y gitlab-ce

# 安装指定版本gitlab
yum install -y gitlab-ce-x.x.x

配置Gitlab

查看Gitlab版本
head -1 /opt/gitlab/version-manifest.txt
Gitlab配置登录链接
# 设置登录链接
vi /etc/gitlab/gitlab.rb

external_url 'http://192.168.64.9'

# 查看绑定监听的域名或IP
grep "^external_url" /etc/gitlab/gitlab.rb
初始化Gitlab
gitlab-ctl reconfigure
启动Gitlab服务
# 启动
gitlab-ctl start

# 查看端口占用
yum install -y lsof
lsof -i:80
Gitlab设置HTTPS方式

如果想要以上的https方式正常生效使用,则需要把letsencrypt自动生成证书的配置打开,这样在执行重新让配置生效命令(gitlab-ctl reconfigure)的时候会自动给域名生成免费的证书并自动在gitlab自带的nginx中加上相关的跳转配置

vi /etc/gitlab/gitlab.rb

letsencrypt['enable'] = true
letsencrypt['contact_emails'] = ['caryyu@qq.com'] #添加联系人的电子邮件地址
Gitlab添加smtp邮件功能
vi /etc/gitlab/gitlab.rb

### Email Settings
gitlab_rails['gitlab_email_enabled'] = true # 开启邮箱
gitlab_rails['gitlab_email_from'] = 'system.notice@qq.com' # 邮箱账号
gitlab_rails['gitlab_email_display_name'] = 'Gitlab'
gitlab_rails['gitlab_email_reply_to'] = 'system.notice@qq.com' # 邮箱账号
gitlab_rails['gitlab_email_subject_suffix'] = '[gitlab]'

### Gitlab email server settings
gitlab_rails['smtp_enable'] = true # 开启smtp服务
gitlab_rails['smtp_address'] = 'smtp.qq.com' # 发送邮件服务器
gitlab_rails['smtp_port'] = 465              # 端口号465
gitlab_rails['smtp_user_name'] = 'system.notice@qq.com' # 邮箱账号
gitlab_rails['smtp_password'] = 'xxxx' # 生成的授权吗
gitlab_rails['smtp_domain'] = 'smtp.qq.com' # smtp服务域名
gitlab_rails['smtp_authentication'] = 'login'
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

# 修改配置后需要初始化配置
gitlab-ctl reconfigure

gitlab-ctl stop

gitlab-ctl start
Gitlab发送邮件测试
gitlab-rails console

# 输入后回车
Notify.test_email('接收人邮箱', '标题', '内容').deliver_now

# 示例
Notify.test_email('xxx@qq.com', 'Message Subject', 'Message Body').deliver_now
修改nginx端口号
# 修改nginx['listen_port']=8080
vi /etc/gitlab/gitlab.rb

gitlab-ctl reconfigure

Docker部署

安装Docker

# 更新yum
yum update

# 安装 yum-utils,它提供了 yum-config-manager,可用来管理yum源
yum install -y yum-utils device-mapper-persistent-data lvm2

# 存储库地址添加yum源
yum-config-manager \
            --add-repo \
            http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
            
# 安装客户端
yum install -y docker-ce docker-ce-cli containerd.io

# 启动docker
systemctl start docker

# 设置开机自启
systemctl enable docker

# 验证安装
docker info

# 安装docker-compose
# 从github上下载对应版本架构
wget https://github.com/docker/compose/releases/download/v2.18.1/docker-compose-linux-aarch64

# 移动位置
mv docker-compose-linux-aarch64 /usr/local/bin/docker-compose

# 授予执行权限
chmod +x /usr/local/bin/docker-compose

# 测试
docker-compose -v
docker-compose version

安装Gitlab

X86架构
# 拉取镜像
docker pull gitlab/gitlab-ce

# 创建挂载目录
mkdir -p /opt/docker/volumes/gitlab/config
mkdir /opt/docker/volumes/gitlab/logs
mkdir /opt/docker/volumes/gitlab/data
# 准备docker-compose.yml文件
version: '3.1'
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.64.9:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '8929:8929'
      - '2224:2224'
    volumes:
      - '/opt/docker/volumes/gitlab/config:/etc/gitlab'
      - '/opt/docker/volumes/gitlab/logs:/var/log/gitlab'
      - '/opt/docker/volumes/gitlab/data:/var/opt/gitlab'
# 启动容器
docker-compose up -d

# 访问http://192.168.64.9:8929
ARM架构
# 拉取镜像
docker pull yrzr/gitlab-ce-arm64v8

# 运行
docker run \
  --detach \
  --restart always \
  --name gitlab-ce \
  --privileged \
  --memory 2048M \
  --publish 80:80 \
  --publish 443:443 \
  --hostname 192.168.64.9 \
  --env GITLAB_OMNIBUS_CONFIG=" \
    nginx['redirect_http_to_https'] = true; "\
  --volume /opt/docker/volumes/gitlab/config:/etc/gitlab:z \
  --volume /opt/docker/volumes/gitlab/logs:/var/log/gitlab:z \
  --volume /opt/docker/volumes/gitlab/data:/var/opt/gitlab:z \
  yrzr/gitlab-ce-arm64v8:latest

# 进入docker容器中,查看当前gitlab的初始密码
docker exec -it gitlab-ce bash
cat /etc/gitlab/initial_root_password

# WARNING: This value is valid only in the following conditions
#          1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).
#          2. Password hasn't been changed manually, either via UI or via command line.
#
#          If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.

Password: gI7XVlVcMQxUpaUhvK8FJfpjkS5V6au3GWltwgqYpzQ=

# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.
  • –detach:守护进程标记
  • –restart always:docker启动时重启
  • –name gitlab-ce:指定容器名
  • –privileged:使用该参数,container内的root拥有真正的root权限
  • –memory 2048M:指定占用内存
  • –publish 80:80:端口映射
  • –hostname 192.168.64.9:访问域名
  • –env:环境变量
  • –volume:目录挂载
  • –volume:z:选项表示绑定挂载内容在多个容器之间共享

Gitlab服务管理

# 启动所有gitlab组件
gitlab-ctl start

# 停止所有gitlab组件
gitlab-ctl stop

# 重启所有gitlab组件
gitlab-ctl restart

# 查看服务状态
gitlab-ctl status

# 初始化服务
gitlab-ctl reconfigure

# 修改默认配置
vi /etc/gitlab/gitlab.rb

# 查看日志
gitlab-ctl tail

使用Gitlab

登录Gitlab

Snipaste_2023-06-23_12-04-25

  • 账号:root
  • 密码:gI7XVlVcMQxUpaUhvK8FJfpjkS5V6au3GWltwgqYpzQ=

修改密码

命令行修改密码

gitlab-rails console production

页面修改

Snipaste_2023-06-23_12-22-01

Snipaste_2023-06-23_12-23-05

关闭自动注册功能

打开管理员设置

Snipaste_2023-06-23_12-23-46

打开通用设置

Snipaste_2023-06-23_12-25-05

保存更改

Snipaste_2023-06-23_12-25-25

创建项目组group

Snipaste_2023-06-25_18-22-19

Snipaste_2023-06-25_18-26-14

组权限

角色 权限
Private 只有组成员才能看到
Internal 只要登录的用户就能看到
Public 所有人都能看到

新增用户

Snipaste_2023-06-25_19-30-16

Snipaste_2023-06-25_19-31-11

Snipaste_2023-06-25_19-35-26

Snipaste_2023-06-25_19-34-05

登录邮箱确认

Snipaste_2023-06-25_19-39-29

添加用户到组

Snipaste_2023-06-25_19-30-16

Snipaste_2023-06-25_19-51-15

Snipaste_2023-06-25_19-52-57

组中权限

角色 权限
Guest 可以创建issue、发表评论,不能读写版本库
Reporter 可以克隆代码,不能提交,QA、PM可以赋予这个权限
Developer 可以克隆代码、开发、提交、push,RD可以赋予这个权限
Maintainer 可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限
Owner 可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限

创建项目

Snipaste_2023-06-25_20-02-07

Snipaste_2023-06-25_20-05-14

Gitlab备份与恢复

查看系统版本和软件版本

# 查看系统版本
cat /etc/redhat-release

# 查看软件版本
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

# docker
docker exec -it 120 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

数据备份

查看备份相关的配置项

vi /etc/gitlab/gitlab.rb

### Backup Settings
###! Docs: https://docs.gitlab.com/omnibus/settings/backups.html

gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"

该项定义了默认备份文件的路径,可以通过修改该配置,并执行gitlab-ctl reconfigure或者gitlab-ctl restart重启服务生效

执行备份命令进行备份

/opt/gitlab/bin/gitlab-rake gitlab:backup:create

添加到crontab中定时执行

crontab -e

0 2 * * * bash /opt/gitlab/bin/gitlab-rake gitlab:backup:create

可以到/data/gitlab/backups找到备份包,解压查看

设置备份保留时长

防止每天执行备份,有目录被爆满的风险,打开/etc/gitlab/gitlab.rb配置文件

vi /etc/gitlab/gitlab.rb

###! The duration in seconds to keep backups before they are allowed to be deleted
gitlab_rails['backup_keep_time'] = 604800

设置备份保留7天,单位为秒,修改后通过gitlab-ctl restart重启服务生效,备份完成,会在备份目录中生成一个当天日期的tar包

数据恢复

查看备份相关的配置项

vi /etc/gitlab/gitlab.rb
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"

修改该配置,定义了默认备份出文件的路径,并执行gitlab-ctl reconfigure或者gitlab-ctl restart重启服务生效

恢复前需要先停掉数据连接服务

gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq

如果是台新搭建的主机,不需要操作,理论上不停这两个服务也可以,停这两个服务是为了保证数据一致性

同步备份文件到新服务器

将老服务器/var/opt/gitlab/backups目录下的备份文件拷贝到新服务器上的/var/opt/gitlab/backups

rsync -avz

注意权限:600权限是无权恢复的,实验环境可改成777,生产环境修改主属组

pwd

/var/opt/gitlab/backups

chown -R 777 git.git

# 0:无权限
# 1: 执行
# 2: 写
# 4: 读

执行命令进行恢复

后面再输入两次yes就完成恢复了

gitlab-rake gitlab:backup:restore
# 注意:backups 目录下保留一个备份文件可直接执行

恢复完成后启动服务

恢复完成后,启动刚刚的两个服务,或者重启所有服务,再打开浏览器进行访问,发现数据和之前的一致

gitlab-ctl start unicorn
gitlab-ctl start sidekiq
#------------------------
gitlab-ctl restart

注意:通过备份文件恢复gitlab必须保证两台主机的gitlab版本一致,否则会提示版本不匹配

参考教程