GitLab使用教程,看这一篇就够了【转】

引言

之前公司代码的管理不统一,一部分人用SVN,一部分人用Git,对于习惯了使用Linux或者Mac命令行的人来说,Git的操作更方便和快捷,和小伙伴商量了一下把整个代码管理工具切换成了Git,GitHub如果不是开源项目的话是需要付费使用,所以选择使用GitLab,由于公司没有网络安全专家,对公司的网络边界以及代码库进行扫描,如果扫描到邮箱,暴力破解后,可能就会获取代码,所以采用在自己内网搭建GitLab服务的方式,在讲正文之前,先来说说Git和SVN的区别。

一、Git和SVN的区别

1、GIT是分布式的,SVN不是:

这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。需要做一点声明,GIT并不是目前第一个或唯一的分布式版本控制系统。还有一些系统,例如Bitkeeper, Mercurial等,也是运行在分布式模式上的。但GIT在这方面做的更好,而且有更多强大的功能特征。

GIT跟SVN一样有自己的集中式版本库或服务器。但GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,就像在飞机上,地下室,电梯里等,你仍然能够提交文件,查看历史版本记录,创建项目分支等。对一些人来说,这好像没多大用处,但当你突然遇到没有网络的环境时,这个将解决你的大麻烦。

同样,这种分布式的操作模式对于开源软件社区的开发来说也是个巨大的恩赐,你不必再像以前那样做出补丁包,通过email方式发送出去,你只需要创建一个分支,向项目团队发送一个推请求。这能让你的代码保持最新,而且不会在传输过程中丢失。github.com就是一个这样的优秀案例。

2、GIT把内容按元数据方式存储,而SVN是按文件:

所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。

3、GIT分支和SVN的分支不同:

分支在SVN中一点不特别,就是版本库中的另外的一个目录。如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svn propget svn:mergeinfo,来确认代码是否被合并。感谢Ben同学指出这个特征。所以,经常会发生有些分支被遗漏的情况。

然而,处理GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。

4、GIT没有一个全局的版本号,而SVN有

目前为止这是跟SVN相比GIT缺少的最大的一个特征,SVN的版本号实际是任何一个相应时间的源代码快照。我认为它是从CVS进化到SVN的最大的一个突破。

5、GIT的内容完整性要优于SVN:

GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

一个研发队伍的成员正常包括:需求分析、设计、美工、程序员、测试、实施、运维,每个成员在工作中都有产出物, 包括了文档、设计代码、程序代码,这些都需要按项目集中进行管理的。SVN能清楚的按目录进行分类管理, 使项目组的管理处于有序高效的状态,SVN更适用于项目管理, Git更适用于代码管理。

二、首先去注册账号

首先打开公司内网部署GitLab的服务器,由于是内部员工使用,所以注册时候Username和Full name最好用自己的名字,这样管理员给用户分配项目权限的时候能够一目了然。

image.png

三、管理员给用户分分配权限

以管理员的身份登入gitlab,点击Settings,然后选择Members

image.png

可以通过输入名字选择要分配权限的小组成员,然后分配角色,选择权限有效时间,点击Add to Project就把人员拉近到项目中。GitLab的角色有以下四种:

  • Guest:可以创建issue、发表评论,不能读写版本库
  • Reporter:可以克隆代码,不能提交,可以赋予测试、产品经理此权限
  • Developer:可以克隆代码、开发、提交、push,可以赋予开发人员此权限
  • MainMaster:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,一般GitLab管理员或者CTO才有此权限

image.png

四、如何配置SSH?

可以通过HTTP和SSH去做克隆和提交代码,由于HTTP需要每次提交的时候输入邮箱号和密码,所以常用电脑上配置SSH,只要配置好了以后,下次提交的时候就方便了。SSH的方式主要是通过生成一个密钥和一个公钥,这个公钥可以使用在GitHub,GItLab,内网GitLab中。
大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供一个公钥用于授权,没有的话就要生成一个。生成公钥的过程在所有操作系统上都差不多。首先你要确认一下本机是否已经有一个公钥。
SSH 公钥默认储存在账户的主目录下的 ~/.ssh 目录。进去看看:

image.png

看一下有没有id_rsa和id_rsa.pub(或者是id_dsa和id_dsa.pub之类成对的文件),有 .pub 后缀的文件就是公钥,另一个文件则是密钥。

假如没有这些文件,甚至连 .ssh 目录都没有,可以用 ssh-keygen 来创建。该程序在 Linux/Mac 系统上由 SSH 包提供,而在 Windows 上则包含在GitBash里面里:

$ ssh-keygen -t rsa -C "6789346623@qq.com"

Creates a new ssh key using the provided email # Generating public/private rsa key pair.

Enter file in which to save the key (/home/you/.ssh/id_rsa):

然后直接三次Enter键就可以了,完了之后大概是这样:

Your public key has been saved in /home/you/.ssh/id_rsa.pub.
The key fingerprint is: # 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db 6789346623@qq.com

image.png

五、配置SSH到GitLab账号

1、查看你生成的公钥:
vim id_rsa.pub
就可以查看到你的公钥
2、登陆GitLab账号,点击用户图像,然后 Settings -> 左栏点击 SSH keys

image.png

3、复制公钥内容,粘贴进“Key”文本区域内,取名字
4、点击Add Key

项目权限说明


公共项目(public)–基本不用

无需任何身份验证即可克隆公共项目。
它们还将在公共访问目录(/public)上列出。
任何登录的用户都将对该项目具有来宾权限。
公共项目登录和未登录GitLab的人都可以看到该项目并可以进行克隆下载,相当于公开。

内部项目(internal)

任何登录的用户都可以克隆内部项目。
它们还将在登录用户的公共访问目录(/public)中列出。
任何登录的用户都将对该项目具有来宾权限。
内部项目只有登录GitLab的用户才会看到该项目和进行克隆,未登录用户是看不到该项目的

私有项目(private)–基本用这个

只有创建者和项目组员才可以访问
私有项目在创建之后,刚开始是只有创建者可以访问看到,其他用户是访问不了(就是看不到这个项目)。只有创建者或者有权限的组员添加了用户为该项目的组员,用户才会看到该项目并访问,具有较好的私有性。

六、真实项目实战流程

1、首先把服务器上的代码克隆下来

git clone git@192.168.200.109:snailå/GitTest.git

刚克隆下来的是在master分支,可以通过命令行或者IDE工具查看当前分支
2、将所有有改动的全部添加到要提交的本地库中

git add .

也可以用git add 文件名进行单独文件的提交
3、将修改提交到本地库

git commit -a -m "提交添加的注释信息"

4、将本地库的commit推送到远程服务器

git push 

image.png

七、使用频率最高的命令

拉取服务器上最新资源:

git pull    

在不同的分支之间切换:git checkout 分支名
注意事项:切换分支的时候,如果当前分支有改动没有提交,是不能切换分支的,需要先把改动的内容提交或者放入缓存区

git checkout release/v1.0.0

合并分支:git merge 分支名

git merge feature/login

从当前分支merge feature/login分支的内容,如果有两个人修改了同一个文件的同一行,则会有冲突,可以在IDE工具上先解决当前冲突然后再提交。

八、总结

首先申请账号,然后在自己的账号里面加入ssh key,让管理员开通项目的权限,然后就可以克隆项目,然后提交了。git的分支分类型分为以下几种:

  • master 主分支,有且只有一个
  • release 线上分支,一般为线上版本,线上版本发布后,会讲release分支合并到master
  • develop 开发分支,通产给测试部署环境或者打包的分支,每个人在自己的分支上开发完成后,向develop分支合并
  • feature 通常是一个功能分支或者个人分支,每个公司的用法不一样,feature分支一般会有很多个,通常merge完成后会删除
    在使用git的过程中,出现任何问题,最直观的就是查看提示信息,git的提示信息非常强大,刚开始看的时候可能会角色英文有点难,看到了就习惯了。保持良好的习惯,每次开发之前先更新,经常提交,不要一次提交很多文件,基本上简单实用就不会出现问题。git功能很强大,每个公司的用法以及流程都不一样,有的只是简单使用,有的使用Code Review进行代码审核,此文主要针对不了解GitLab的用户,让其能够快速的上手,不喜勿喷,谢谢!

作者:CodingSnail
链接:https://www.jianshu.com/p/bf7b09e234c8

各种国内镜像加速(pip, docker, yum)

1、pip

Linux系统

mkdir ~/.pip
cat > ~/.pip/pip.conf << EOF
[global] 
trusted-host=mirrors.aliyun.com 
index-url=https://mirrors.aliyun.com/pypi/simple/
EOF

Windows系统

首先在window的文件夹窗口输入 : %APPDATA%然后创建pip文件夹最后创建pip.ini文件,写入如下内容:

[global] 
index-url = https://mirrors.aliyun.com/pypi/simple/ 
[install] 
trusted-host=mirrors.aliyun.com

2、docker

cat  > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://qntdeamw.mirror.aliyuncs.com"]
}
EOF

3、yum

#Centos7 (centos8貌似官方mirrors包含了国内镜像站,会根据本地IP就近选择国内mirros)
#用curl
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo  
#用wget 
wget http://mirrors.aliyun.com/repo/Centos-7.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo
mv Centos-7.repo /etc/yum.repos.d/
mv epel-7.repo /etc/yum.repos.d

windows 10 users 文件夹迁移

2020版本的win10 下列方法已经失效。注册表修改HLM/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Profilelist ProfilesDirectory键值 “%SystemDrive%\”替换为D:

启用administrator 登录并执行以下操作

## 复制C:\Users下的所有文件到D:\Users
##参数说明:此命令为Windows的“强健文件拷贝”命令。
##		/E 表示拷贝文件时包含子目录(包括空目录)
##		/COPYALL 表示拷贝所有文件信息
##		/XJ 表示不包括Junction points(默认是包括的)
## 		/XD "C:\Users\Administrator" 表示不包括指定的目录,此处指定目录为:"C:\Users\Administrator"
robocopy "C:\Users" "D:\Users" /E /COPYALL /XJ /XD "C:\Users\Administrator"
## 删除C:\Users文件夹 
##参数说明:此命令删除指定目录。
##		/S 删除指定目录及其中的所有文件。用于删除目录树。
##		/Q 安静模式。删除时不询问。  
rmdir "C:\Users" /S /Q   
## 创建(目录)软连接 C:\Users 指向 D:\Users
## 参数说明:此命令创建符号连接。
##		/J 连接类型为目录连接
mklink /J "C:\Users" "D:\Users"

python 小功能

a = dist(25).zip
b = a.replace("(","").relpace(")","")
**************************************************************
import sys, os

#win环境判断传入参数是单文件名/带完整路径的文件名,并做处理
arg = sys.argv[1]
sourceDir = "d:\\tmp\\"

if arg.find("\\") > 0:
    packageName = os.path.basename(arg)
    sourceFile = arg
else:
    packageName = arg
    sourceFile = sourceDir + packageName
packageNewName = packageName.replace('(','').replace(')','')
sourceFile = sourceFile.replace("\\","\\\\")    
print(packageName, packageNewName)
print(sourceFile)

python 自动化运维–fabric库

1、windows拷贝文件到linux部署脚本(python)


# encoding='utf-8'

from fabric import Connection
import sys 

from fabric import Connection
import sys
packageName = sys.argv[1].replace('(','').replace(')','')
sourceDir = "C:\\tmp\\"
destDir = "/usr/local/src/"

with  Connection(host="122.226.107.154", port=2024, user="root", connect_kwargs={"password":"xxxx"}) as c:
    c.put(sourceDir + sys.argv[1], destDir + packageName)
    c.run('rm -rf /usr/local/src/dist')
    c.run('rm -rf /usr/local/app/szzj-portal-pc/*')
    c.run('unzip -o /usr/local/src/%s -d /usr/local/src/' %(packageName))
    c.run('/usr/bin/mv -f /usr/local/src/dist/* /usr/local/app/szzj-portal-pc/')

fabric 官网已经更新到2.6版,阿里镜像下载也已经是2.5的版本,但是网络上搜索到的案例大部分是按照1.X版本编写的。今天查看了下官网的文档,一些用法记录下。

2、基本上只要使用Connection这个api :

fabric.connection.Connection

这个类是从 Invoke 的Context 继承过来的,另外它还封装了Paramiko SSHClient 。可用参数如下:
Connection(host, user=None, port=None, config=None, gateway=None, forward_agent=None, connect_timeout=None, connect_kwargs=None, inline_ssh_env=None)

这里主要说明下connect_kwargs这个参数,它的值是字典(dict),比如密码,密钥key只能设置在这里。这个字典会直接传递给paramiko.client.SSHClient.connect解析,完整的可用字段如下:connect(hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False, sock=None, gss_auth=False, gss_kex=False, gss_deleg_creds=True, gss_host=None, banner_timeout=None, auth_timeout=None, gss_trust_dns=True, passphrase=None, disabled_algorithms=None)

3、另外是多主机的操作api

  1. fabric.group.Group(*hosts, **kwargs) /**抽象类,无法直接使用,只能选用下面两个
  2. fabric.group.SerialGroup(*hosts, **kwargs)
  3. fabric.group.ThreadingGroup(*hosts, **kwargs)

因为本机测试不支持put (2.5版本)。group.py也看了,确实没有put ,不好用。
还是选择了for 循环IP列表调用Connection 来实现多主机操作。

其它

1、参数传递 :

python 的参数传递到 shell 脚本 c.run('/root/test.sh %s' %(sys.argv[1]))
实现上类是print函数传参。

linux优化

系统允许一个进程打开的文件数

修改文件/etc/security/limits.conf,在文件尾部添加如下代码(如果已经存在则修改相应数值):

root soft nofile 65535
root hard nofile 65535
 * soft nofile 65535
 * hard nofile 65535

    注:只配置最后两行不就可以了吗,为啥还要单独为root用户配置呢?查了网上资料,说是*这样的通配符对root用户无效,所以root需要单独配置(嗯,阿里云ECS就配置了上面这4行)。

mysql

查询当前的部署模式

部署主从

主服务器配置

修改配置文件 /etc/my.cnf

[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id

重启mysql,登录mysql控制台,创建用于同步的用户账号:

mysql> CREATE USER 'repl'@'123.57.44.85' IDENTIFIED BY 'slavepass';#创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'123.57.44.85';#分配权限
mysql> flush privileges;   #刷新权限

查看master状态,记录二进制文件名(mysql-bin.000003)和位置(73):

mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73       | test         | manual,mysql     |
+------------------+----------+--------------+------------------+

从服务器配置

同样找到my.cnf配置文件,添加server-id

[mysqld]
server-id=2 #设置server-id,必须唯一

重启mysql,打开mysql会话,执行同步SQL语句(需要主服务器主机名,登陆凭据,二进制文件的名称和位置):

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='182.92.172.80',
    ->     MASTER_USER='rep1',
    ->     MASTER_PASSWORD='slavepass',
    ->     MASTER_LOG_FILE='mysql-bin.000003',
    ->     MASTER_LOG_POS=73;

启动slave同步进程

mysql>start slave;

查看slave状态:

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 182.92.172.80
                  Master_User: rep1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000013
          Read_Master_Log_Pos: 11662
               Relay_Log_File: mysqld-relay-bin.000022
                Relay_Log_Pos: 11765
        Relay_Master_Log_File: mysql-bin.000013
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 

当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了

还可以用到的其他相关参数:

binlog-do-db:指定mysql的binlog日志记录哪个db
Replicate_Do_DB:参数是在slave上配置,指定slave要复制哪个库

在master上设置binlog_do_弊端:
1、过滤操作带来的负载都在master上
2、无法做基于时间点的复制(利用binlog)。

需要注意的是最好在从服务器的my.cnf里设置read_only选项,防止发生意外(连接用户不能有SUPER权限,否则无效)。

记得先手动同步一下主从服务器:

  • 数据量小:可以用mysqldump,它有一个master-data参数很有用,通过使用此参数,导出的SQL文件里会自动包含CHANGE MASTER TO MASTER_LOG_FILE=’…’, MASTER_LOG_POS=…;,这样创建从服务器就更方便了。
  • 数据量大:不太适合使用mysqldump(慢),如果是myisam表的话,加上–lock-all-tables参数,如果是innodb表的话,加上–single-transaction参数。而应该采用拷贝文件的方式,请按如下操作步骤:

先在主服务器上锁定所有的表,以免在复制过程中数据发生变化:mysql> flush tables with read lock;

然后在主服务器上查询当前二进制文件的文件名及偏移位置:mysql > show master status;

然后停止主服务器上的MySQL服务:shell> mysqladmin -u root shutdown

注意:如果仅是MyISAM的话,可以不停止MySQL服务,但要在复制数据文件的过程中保持只读锁,如果是InnoDB的话,必须停止MySQL服务。

再拷贝数据文件:shell> tar -cvf /tmp/mysql-snapshot.tar .

拷贝完别忘了启动主服务上的MySQL服务了。

然后把数据文件应用到从服务器上,再次启动slave的时候使用,记得启动时加上skip-slave-start选项,使之不会立刻去连接master,再在从服务器上设置相关的二进制日志信息:

mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;

启动从服务器上的复制线程:mysql> start slave;

验证主从设置是否已经成功:mysql> show slave status\G;

数据库综述

关系型数据库

关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据。
主流的 oracle、DB2、MS SQL Server 和 mysql 都属于这类传统数据库。

NoSQL 数据库

NoSQL 数据库,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为

  • 临时性键值存储(memcached、Redis)、
  • 永久性键值存储(ROMA、Redis)、
  • 面向文档的数据库(MongoDB、CouchDB)、
  • 面向列的数据库(Cassandra、HBase),

每种 NoSQL 都有其特有的使用场景及优点。