Git简介

Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)

Git有什么作用?
版本控制 团队协助

Git有什么特点?
简单来说就是:高端大气上档次!

那什么是版本控制系统?
如果你用Microsoft Word写过长篇大论,那你一定有这样的经历:
想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:
版本控制例子

过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。
看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。
更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件Copy到U盘里给她(也可能通过Email发送一份给她),然后,你继续修改Word文件。一天后,同事再把Word文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。
于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?

这个软件用起来就应该像这个样子,能记录每次文件的改动:

版本文件名用户说明日期
1service.doc张三删除了软件服务条款57/12 10:38
2service.doc张三增加了License人数限制7/12 18:09
3service.doc李四财务部门调整了合同金额7/13 9:51
4service.doc张三延长了免费升级周期7/14 15:17

这样,你就结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪。

Git命令

工作区 --> 暂存区 --> 本地仓库 --> 远程仓库

配置git用户信息:

git config --global user.email "devuser@if010.cn"
git config --global user.name "devuser"

生成空的本地仓库:git init

MingoMacBook:mingo-cg mingo$ git init
Initialized empty Git repository in /Users/mingo/Documents/GitHub/mingo-cg/.git/

添加文件到暂存区:git add [文件]

MingoMacBook:mingo-cg mingo$ git add index.php 

提交文件到本地仓库:git commit -m "[提交描述]"

MingoMacBook:mingo-cg mingo$ git commit -m " 提交首页入口文件"
[master (root-commit) 6d9976c]  提交首页入口文件
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 index.php

添加远程仓库:git remote add [仓库名] [远程仓库Url地址]

MingoMacBook:mingo-cg mingo$ git remote add origin https://github.com/if010/mingo-cg.git

提交文件到远程仓库的指定分支:git push -u [仓库名] [分支名]

MingoMacBook:mingo-cg mingo$ git push -u origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 237 bytes | 237.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/if010/mingo-cg.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

拉取远程仓库的变更文件:git fetch

MingoMacBook:mingo-cg mingo$ git fetch
warning: no common commits
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/if010/mingo-cg
 * [new branch]      master     -> origin/master

将远程的变更合并到本地仓库的master分支:git merge [仓库名]/[分支名]

MingoMacBook:mingo-cg mingo$ git merge origin/master
Updating 797a5a5..4ba6333
Fast-forward
 README.md | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 README.md

git pull 可以替代上面两句,拉取远程仓库的变更文件并且合并到本地仓库

新建分支:git branch [分支名]

MingoMacBook:mingo-cg mingo$ git branch v2.0

查看所有分支:git branch

MingoMacBook:mingo-cg mingo$ git branch
* master
  v2.0

删除分支:git branch -d [分支名]

MingoMacBook:mingo-cg mingo$ git branch -d v2.0
Deleted branch v2.0 (was ae950ac).

不能删除当前所在的分支

修改分支名:git branch -m [旧分支名] [新分支名]

MingoMacBook:mingo-cg mingo$ git branch -m v2.0 v1.1

切换分支:git checkout [分支名]

MingoMacBook:mingo-cg mingo$ git checkout v1.1
Switched to branch 'v1.1'

查看提交历史记录:git log

MingoMacBook:mingo-cg mingo$ git log -1
commit ae950ace9b5c3e38964cefaf2f4a5bcd232f5aba (HEAD -> v1.1, origin/master, master)
Author: mingo <devuser@if010.cn>
Date:   Sat May 25 02:45:48 2019 +0800

     提交站点ICO图标文件

撤回上次提交:git reset --soft HEAD^

MingoMacBook:mingo-cg mingo$ git reset --soft HEAD^

移除暂存区里的文件:git reset HEAD [文件名]

MingoMacBook:mingo-cg mingo$ git reset HEAD favicon.ico

合并分支:git merge [分支名]

MingoMacBook:mingo-cg mingo$ git merge v1.1
Merge made by the 'recursive' strategy.
 index.php | 3 +++
 1 file changed, 3 insertions(+)

Git的文件状态

git文件状态

新建文件 ---> Untracked状态
使用add命令将新建文件加入到暂存区 ---> Staged状态
使用commit命令将暂存区的文件提交到本地仓库 ---> Unmodified状态
如果对Unmodified状态的文件进行修改 ---> modified状态
如果对Unmodified状态的文件进行remove操作 ---> Untracked状态

查看Git的文件状态:git status

MingoMacBook:mingo-cg mingo$ git status
On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    favicon.ico

nothing added to commit but untracked files present (use "git add" to track)

删除git文件:git rm [文件]

MingoMacBook:mingo-cg mingo$ git rm --cache favicon.ico 
rm 'favicon.ico'
MingoMacBook:mingo-cg mingo$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    favicon.ico

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    favicon.ico

如果只是 git rm --cache 则仅删除暂存区里的文件,但是不加--cache 则会删除工作区里的文件,并提交到暂存区

恢复误操作文件:git checkout

MingoMacBook:mingo-cg mingo$ git checkout master favicon.ico 

git checkout后面直接加文件名,表示执行从暂存区文件恢复到工作区,如果工作区已经有该文件,则会选择覆盖,而加上分支名,表示执行从分支名为所写的分支名中拉取文件,并覆盖工作区里的文件

.gitignore文件

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。

好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

例如:
*.log 表示忽略项目中所有以.log 结尾的文件
123?.log 表示忽略项目中所有以123加任意字符的.log文件
/error.log 表示忽略项目中根目录的error.log文件
src/main/test/* 表示忽略/src/main/test目录下的所所有文件
**/java/ 匹配所有java目录下的所有文件
!/log/access.log 表示在之前的匹配规则下命中的文件进行否定命中

忽略文件的原则是:

  • 忽略操作系统自动生成的文件,比如缩略图等;
  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

GitLab

GitLab简介

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装方法是参考GitLab在GitHub上的Wiki页面。

应用特点:
1.Web框架使用RubyonRails。
2.基于MIT代码发布协议。
3.需要gitolite协同工作。

GitLab安装

安装依赖项

yum install -y curl policycoreutils-python openssh-server cronie

添加GitLab包存储库

curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash

安装将自动配置并启动该URL的GitLa

sudo EXTERNAL_URL="https://gitlab.if010.com" yum -y install gitlab-ee

修改监听端口

vim /etc/gitlab/gitlab.rb
nginx['listen_port'] = 9110

配置邮箱信息

vim /etc/gitlab/gitlab.rb

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "abc@qq.com"
gitlab_rails['smtp_password'] = "123456"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

user['git_user_name'] = "abc@qq.com"

gitlab_rails['gitlab_email_from'] = 'abc@qq.com'

重读GitLa配置并重启

gitlab-ctl reconfigure
gitlab-ctl restart

访问GitLab
GitLabWeb

第一次访问会提示你设置root 用户的密码

这里需要注意服务器的CPU和内存,如果太小访问的页面会提示你访问时间过长

测试邮件发送

gitlab-rails console
Notify.test_email('收件人邮箱账号地址','邮件标题','邮件内容').deliver_now


Jenkins

敏捷持续集成

什么是持续集成?
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,每次集成都通过自动化构建(包括编译,发布,自动化测试)来验证,从而尽早的发现集成错误.

持续集成有什么好处?

  • 节省人力成本
  • 加快软件开发进度
  • 实时交付

整体流程:

Git提交代码 ---> 持续集成引擎拉取代码使用构建工具自动构建 ---> 发布构建好的项目

重要组成:
Git 代码管理
GitLab 代码仓库
Jenkins 持续集成引擎
sonarqube 代码质量管理
junit 自动单元测试
JDK 运行环境
Tomcat 服务器

JDK和Maven的安装

解压JDK源码包:

tar -zxf jdk_1.8.0.tar.gz -C /usr/local/

配置环境变量:

vim /etc/profile

JAVA_HOME=/usr/local/jdk1.8.0_91
export JAVA_HOME
CLASSPATH=.:$JAVA_HOME/lib
export CLASSPATH
PATH=$PATH:$JAVA_HOME/bin:$CLASSPATH
export PATH

source /etc/profile

JDK安装包附件: jdk_1.8.0.tar.gz  

解压Maven源码包:

tar -zxf maven_3.5.3.tar.gz -C /usr/local/

配置环境变量:

vim /etc/profile

MAVEN_HOME=/usr/local/apache-maven-3.5.3
export MAVEN_HOME
PATH=$PATH:$MAVEN_HOME/bin
export PATH

source /etc/profile

Maven安装包附件: maven_3.5.3.tar.gz  

Nexus私服安装

解压Nexus源码包:

tar -zxf nexus_3.12.1.tar.gz -C /usr/local/

创建nexus用户并更改nexus目录的所有权

groupadd nexus
useradd -g nexus nexus -s /bin/false
chown -R nexus.nexus /usr/local/nexus-3.12.1-01/
chown -R nexus.nexus /usr/local/sonatype-work/

修改系统文件打开最大数

vim /etc/security/limits.conf 

*       soft    nofile  65536
*       hard    nofile  65536

使用nexus用户启动nexus程序

su - nexus -c '/usr/local/nexus-3.12.1-01/bin/nexus start

设置开机自启动

vim /etc/rc.d/rc.local 
su - nexus -c '/usr/local/nexus-3.12.1-01/bin/nexus start'

访问Nexus
NexusWeb

Nexus的默认用户名是 admin,而默认的密码是 admin123

Nexus安装包附件: nexus_3.12.1.tar.gz  

使用yum安装MySQL数据库

yum install mysql mysql-server mysql-devel
service mysqld restart

SonarQube安装

解压SonarQube源码包:

unzip sonarqube_6.7.4.zip
mv sonarqube-6.7.4 /usr/local/

创建sonar数据库

CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;
grant all on sonar.* to 'sonar'@'127.0.0.1' identified by '123456' with grant option;
flush privileges;

修改sonar配置

sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.context=/sonar
sonar.web.host=0.0.0.0

创建sonar用户并更改sonar目录的所有权

groupadd sonar
useradd -g sonar sonar -s /bin/false
chown -R sonar.sonar /usr/local/sonarqube-6.7.4/

启动sonar

su sonar /usr/local/sonarqube-6.7.4/bin/linux-x86-64/sonar.sh start

在Sonar的启动过程中用到了system_call_filter的检查,需要关闭,不然es会报错:
vim conf/sonar.properties
sonar.search.javaAdditionalOpts=-Dbootstrap.system_call_filter=false
vim conf/wrapper.conf
wrapper.java.additional.3=-Dbootstrap.system_call_filter=false
vim elasticsearch/config/elasticsearch.yml
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

数据库版本必须在 5.6 以上,不然会报错

设置开机自启动

vim /etc/rc.d/rc.local 
su - sonar -c '/usr/local/sonarqube-6.7.4/bin/linux-x86-64/sonar.sh start'

访问sonar监听的9000端口
sonar

SonarQube的默认用户名是 admin,而默认的密码是 admin

SonarQube安装包附件: sonarqube_6.7.4.zip  

Jenkins安装

解压Tomcat源码包

tar -zxf tomcat_9.0.8.tar.gz -C /usr/local/

创建Tomcat运行用户并更改Tomcat目录的所有权

groupadd tomcat
useradd -g tomcat tomcat -s /bin/false
chown -R tomcat:tomcat /usr/local/apache-tomcat-9.0.8

上传Jenkins到Tomcat的webapp目录

mv /root/jenkins.war /usr/local/apache-tomcat-9.0.8/webapp/jenkins.war
chown tomcat:tomcat /usr/local/apache-tomcat-9.0.8/webapp/jenkins.war

启动Tomcat

cd /usr/local/apache-tomcat-9.0.8/bin/
su tomcat ./startup.sh

注意:GitLab有程序会占用8080端口,如果GitLab和Tomcat安装在同一台服务器上,你可以修改Tomcat目录下的conf/server.xml文件所配置的监听端口以避免端口被占用问题

访问Jenkins
解锁Jenkins

查看Jenkins提供的文件解锁

cat /home/tomcat/.jenkins/secrets/initialAdminPassword

解锁后会提示服务器似乎离线,这是应为https和http的关系
提示服务器似乎离线

这时我们需要访问http://127.0.0.1:8080/jenkins/pluginManager/advanced,修改升级站点,将https修改为http
升级站点

重启Tomcat并重新访问Jenkins,并点击安装插件
Jenkins插件

安装插件

安装好插件之后就会提示你创建管理用户
创建管理用户

设置好之后最终访问显示白屏,这时需要你重启一下Jenkins就好了

Tomcat安装包附件: tomcat_9.0.8.tar.gz  
Jenkins安装包附件: jenkins.war  

Jenkins插件
发布到远程服务器插件:Publish Over SSH
GitLab插件:GitLab
SonarQube插件:SonarQube Scanner
PipeLine流水线插件:Blue Ocean Pipeline Editor、Blue Ocean
Maven插件:Maven Integration

Jenkins配置

  • 系统配置
    系统管理 ---> 全局工具配置
    1.配置jdk
    2.配置sonar
  • 邮件配置
    系统管理 ---> 系统设置 ---> 邮件 ---> 通知
    1.smtp服务器 smtp.qq.com
    2.用户默认邮件后缀 @qq.com
    3.勾选ssl
  • 配置gitlab授权
    Credentials ---> system ---> Global credentials
  • 配置免密登陆
    执行yum -y install openssh-clients安装ssh-keygen
    执行ssh-keygen -t rsa产生私钥 配置git登陆 将Jenkins所在机子的公钥 more
    执行cat ~/.ssh/id_rsa.pub的内容拷贝到gitlab项目上

结案陈词

Jenkins+Git+Gitlab+Sonar持续集成,这里的话还多了一个Nexus私服和一个Maven,这两个主要是Java项目构建所需使用到的,这里需要根据实际情况而进行调整架构,后面的其他使用手动集成,hook触发自动构建,PipeLine流水线构建,分布式构建等还没有记录,后面再去开新篇章补充,因为这片博客已经很长,而且需要好好消化,所以先告一段落,拜拜~

最后修改:2019 年 05 月 30 日
-